{
  "contractName": "RewardsDistributionRecipient",
  "abi": [
    {
      "constant": true,
      "inputs": [],
      "name": "rewardsDistribution",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint256",
          "name": "reward",
          "type": "uint256"
        }
      ],
      "name": "notifyRewardAmount",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"name\":\"notifyRewardAmount\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"rewardsDistribution\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/Users/warrenmason/Documents/UniswapV3Contracts/Core/LiveContracts/StakingRewardsFactory/contracts/StakingRewardsFactory.sol\":\"RewardsDistributionRecipient\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/warrenmason/Documents/UniswapV3Contracts/Core/LiveContracts/StakingRewardsFactory/contracts/StakingRewardsFactory.sol\":{\"keccak256\":\"0xec9eab1f88b2d57691ecd0831d0ff7af15d6cb2000118d17d5de23f1654c1e3f\",\"urls\":[\"bzz-raw://4e62279c410e6446bb21630752f4608d48b048a93e3e0c854745869dd233908e\",\"dweb:/ipfs/Qmbx3MXnsNrb5iexnuZt1oFd9b5WPphKLyX9KTZQWcoLhM\"]}},\"version\":1}",
  "bytecode": "0x",
  "deployedBytecode": "0x",
  "sourceMap": "",
  "deployedSourceMap": "",
  "source": "//SPDX-License-Identifier: MIT\npragma solidity >=0.5.16;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP. Does not include\n * the optional functions; to access them see `ERC20Detailed`.\n */\ninterface IERC20 {\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a `Transfer` event.\n     */\n    function transfer(address recipient, uint256 amount) external returns (bool);\n\n    /**\n     * @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     *\n     * This value changes when `approve` or `transferFrom` are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * > 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     *\n     * Emits an `Approval` event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a `Transfer` event.\n     */\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to `approve`. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be aplied to your functions to restrict their use to\n * the owner.\n */\ncontract Ownable {\n    address private _owner;\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the deployer as the initial owner.\n     */\n    constructor () internal{\n        _owner = msg.sender;\n        emit OwnershipTransferred(address(0), _owner);\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        require(isOwner(), \"Ownable: caller is not the owner\");\n        _;\n    }\n\n    /**\n     * @dev Returns true if the caller is the current owner.\n     */\n    function isOwner() public view returns (bool) {\n        return msg.sender == _owner;\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\n     *\n     * > Note: Renouncing ownership will leave the contract without an owner,\n     * thereby removing any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public onlyOwner {\n        emit OwnershipTransferred(_owner, address(0));\n        _owner = address(0);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public onlyOwner {\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     */\n    function _transferOwnership(address newOwner) internal {\n        require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n        emit OwnershipTransferred(_owner, newOwner);\n        _owner = newOwner;\n    }\n}\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMath {\n    /**\n     * @dev Returns the addition of two unsigned integers, reverting on\n     * overflow.\n     *\n     * Counterpart to Solidity's `+` operator.\n     *\n     * Requirements:\n     * - Addition cannot overflow.\n     */\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\n        uint256 c = a + b;\n        require(c >= a, \"SafeMath: addition overflow\");\n\n        return c;\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, reverting on\n     * overflow (when the result is negative).\n     *\n     * Counterpart to Solidity's `-` operator.\n     *\n     * Requirements:\n     * - Subtraction cannot overflow.\n     */\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n        require(b <= a, \"SafeMath: subtraction overflow\");\n        uint256 c = a - b;\n\n        return c;\n    }\n\n    /**\n     * @dev Returns the multiplication of two unsigned integers, reverting on\n     * overflow.\n     *\n     * Counterpart to Solidity's `*` operator.\n     *\n     * Requirements:\n     * - Multiplication cannot overflow.\n     */\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n        // benefit is lost if 'b' is also tested.\n        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n        if (a == 0) {\n            return 0;\n        }\n\n        uint256 c = a * b;\n        require(c / a == b, \"SafeMath: multiplication overflow\");\n\n        return c;\n    }\n\n    /**\n     * @dev Returns the integer division of two unsigned integers. Reverts on\n     * division by zero. The result is rounded towards zero.\n     *\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\n     * uses an invalid opcode to revert (consuming all remaining gas).\n     *\n     * Requirements:\n     * - The divisor cannot be zero.\n     */\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\n        // Solidity only automatically asserts when dividing by 0\n        require(b > 0, \"SafeMath: division by zero\");\n        uint256 c = a / b;\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n        return c;\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n     * Reverts when dividing by zero.\n     *\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\n     * invalid opcode to revert (consuming all remaining gas).\n     *\n     * Requirements:\n     * - The divisor cannot be zero.\n     */\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n        require(b != 0, \"SafeMath: modulo by zero\");\n        return a % b;\n    }\n}\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a >= b ? a : b;\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a < b ? a : b;\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b) / 2 can overflow, so we distribute\n        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);\n    }\n}\n\n/**\n * @dev Optional functions from the ERC20 standard.\n */\ncontract ERC20Detailed is IERC20 {\n    string private _name;\n    string private _symbol;\n    uint8 private _decimals;\n\n    /**\n     * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of\n     * these values are immutable: they can only be set once during\n     * construction.\n     */\n    constructor (string memory name, string memory symbol, uint8 decimals) public {\n        _name = name;\n        _symbol = symbol;\n        _decimals = decimals;\n    }\n\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() public view returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev Returns the symbol of the token, usually a shorter version of the\n     * name.\n     */\n    function symbol() public view returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev Returns the number of decimals used to get its user representation.\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\n     *\n     * Tokens usually opt for a value of 18, imitating the relationship between\n     * Ether and Wei.\n     *\n     * > Note that this information is only used for _display_ purposes: it in\n     * no way affects any of the arithmetic of the contract, including\n     * `IERC20.balanceOf` and `IERC20.transfer`.\n     */\n    function decimals() public view returns (uint8) {\n        return _decimals;\n    }\n}\n\n/**\n * @dev Collection of functions related to the address type,\n */\nlibrary Address {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * This test is non-exhaustive, and there may be false-negatives: during the\n     * execution of a contract's constructor, its address will be reported as\n     * not containing a contract.\n     *\n     * > It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies in extcodesize, which returns 0 for contracts in\n        // construction, since the code is only stored at the end of the\n        // constructor execution.\n\n        uint256 size;\n        // solhint-disable-next-line no-inline-assembly\n        assembly { size := extcodesize(account) }\n        return size > 0;\n    }\n}\n\n/**\n * @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 ERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    using SafeMath for uint256;\n    using Address for address;\n\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n    }\n\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n    }\n\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\n        // safeApprove should only be called when setting an initial allowance,\n        // or when resetting it to zero. To increase and decrease it, use\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n        // solhint-disable-next-line max-line-length\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\n        );\n        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n    }\n\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\n        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n    }\n\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value);\n        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n    }\n\n    /**\n     * @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).\n     */\n    function callOptionalReturn(IERC20 token, bytes memory data) private {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves.\n\n        // A Solidity high level call has three parts:\n        //  1. The target address is checked to verify it contains contract code\n        //  2. The call itself is made, and success asserted\n        //  3. The return value is decoded, which in turn checks the size of the returned data.\n        // solhint-disable-next-line max-line-length\n        require(address(token).isContract(), \"SafeERC20: call to non-contract\");\n\n        // solhint-disable-next-line avoid-low-level-calls\n        (bool success, bytes memory returndata) = address(token).call(data);\n        require(success, \"SafeERC20: low-level call failed\");\n\n        if (returndata.length > 0) { // Return data is optional\n            // solhint-disable-next-line max-line-length\n            require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n        }\n    }\n}\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the `nonReentrant` modifier\n * available, which can be aplied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n */\ncontract ReentrancyGuard {\n    /// @dev counter to allow mutex lock with only one SSTORE operation\n    uint256 private _guardCounter;\n\n    constructor () internal {\n        // The counter starts at one to prevent changing it from zero to a non-zero\n        // value, which is a more expensive operation.\n        _guardCounter = 1;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and make it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        _guardCounter += 1;\n        uint256 localCounter = _guardCounter;\n        _;\n        require(localCounter == _guardCounter, \"ReentrancyGuard: reentrant call\");\n    }\n}\n\n// Inheritance\ninterface IStakingRewards {\n    // Views\n    function lastTimeRewardApplicable() external view returns (uint256);\n\n    function rewardPerToken() external view returns (uint256);\n\n    function earned(address account) external view returns (uint256);\n\n    function getRewardForDuration() external view returns (uint256);\n\n    function totalSupply() external view returns (uint256);\n\n    function balanceOf(address account) external view returns (uint256);\n\n    // Mutative\n\n    function stake(uint256 amount) external;\n\n    function withdraw(uint256 amount) external;\n\n    function getReward() external;\n\n    function exit() external;\n}\n\ncontract RewardsDistributionRecipient {\n    address public rewardsDistribution;\n\n    function notifyRewardAmount(uint256 reward) external;\n\n    modifier onlyRewardsDistribution() {\n        require(msg.sender == rewardsDistribution, \"Caller is not RewardsDistribution contract\");\n        _;\n    }\n}\n\ncontract StakingRewards is IStakingRewards, RewardsDistributionRecipient, ReentrancyGuard {\n    using SafeMath for uint256;\n    using SafeERC20 for IERC20;\n\n    /* ========== STATE VARIABLES ========== */\n\n    IERC20 public rewardsToken;\n    IERC20 public stakingToken;\n    uint256 public periodFinish = 0;\n    uint256 public rewardRate = 0;\n    uint256 public rewardsDuration;\n    uint256 public lastUpdateTime;\n    uint256 public rewardPerTokenStored;\n\n    mapping(address => uint256) public userRewardPerTokenPaid;\n    mapping(address => uint256) public rewards;\n\n    uint256 private _totalSupply;\n    mapping(address => uint256) private _balances;\n\n    /* ========== CONSTRUCTOR ========== */\n\n    constructor(\n        address _rewardsDistribution,\n        address _rewardsToken,\n        address _stakingToken,\n        uint256 _rewardsDuration\n    ) public {\n        rewardsToken = IERC20(_rewardsToken);\n        stakingToken = IERC20(_stakingToken);\n        rewardsDistribution = _rewardsDistribution;\n        rewardsDuration = _rewardsDuration;\n    }\n\n    /* ========== VIEWS ========== */\n\n    function totalSupply() external view returns (uint256) {\n        return _totalSupply;\n    }\n\n    function balanceOf(address account) external view returns (uint256) {\n        return _balances[account];\n    }\n\n    function lastTimeRewardApplicable() public view returns (uint256) {\n        return Math.min(block.timestamp, periodFinish);\n    }\n\n    function rewardPerToken() public view returns (uint256) {\n        if (_totalSupply == 0) {\n            return rewardPerTokenStored;\n        }\n        return\n            rewardPerTokenStored.add(\n                lastTimeRewardApplicable().sub(lastUpdateTime).mul(rewardRate).mul(1e18).div(_totalSupply)\n            );\n    }\n\n    function earned(address account) public view returns (uint256) {\n        return _balances[account].mul(rewardPerToken().sub(userRewardPerTokenPaid[account])).div(1e18).add(rewards[account]);\n    }\n\n    function getRewardForDuration() external view returns (uint256) {\n        return rewardRate.mul(rewardsDuration);\n    }\n\n    /* ========== MUTATIVE FUNCTIONS ========== */\n\n    function stakeWithPermit(uint256 amount, uint deadline, uint8 v, bytes32 r, bytes32 s) external nonReentrant updateReward(msg.sender) {\n        require(amount > 0, \"Cannot stake 0\");\n        _totalSupply = _totalSupply.add(amount);\n        _balances[msg.sender] = _balances[msg.sender].add(amount);\n\n        // permit\n        IUniswapV2ERC20(address(stakingToken)).permit(msg.sender, address(this), amount, deadline, v, r, s);\n\n        stakingToken.safeTransferFrom(msg.sender, address(this), amount);\n        emit Staked(msg.sender, amount);\n    }\n\n    function stake(uint256 amount) external nonReentrant updateReward(msg.sender) {\n        require(amount > 0, \"Cannot stake 0\");\n        _totalSupply = _totalSupply.add(amount);\n        _balances[msg.sender] = _balances[msg.sender].add(amount);\n        stakingToken.safeTransferFrom(msg.sender, address(this), amount);\n        emit Staked(msg.sender, amount);\n    }\n\n    function withdraw(uint256 amount) public nonReentrant updateReward(msg.sender) {\n        require(amount > 0, \"Cannot withdraw 0\");\n        _totalSupply = _totalSupply.sub(amount);\n        _balances[msg.sender] = _balances[msg.sender].sub(amount);\n        stakingToken.safeTransfer(msg.sender, amount);\n        emit Withdrawn(msg.sender, amount);\n    }\n\n    function getReward() public nonReentrant updateReward(msg.sender) {\n        uint256 reward = rewards[msg.sender];\n        if (reward > 0) {\n            rewards[msg.sender] = 0;\n            rewardsToken.safeTransfer(msg.sender, reward);\n            emit RewardPaid(msg.sender, reward);\n        }\n    }\n\n    function exit() external {\n        withdraw(_balances[msg.sender]);\n        getReward();\n    }\n\n    /* ========== RESTRICTED FUNCTIONS ========== */\n\n    function notifyRewardAmount(uint256 reward) external onlyRewardsDistribution updateReward(address(0)) {\n        if (block.timestamp >= periodFinish) {\n            rewardRate = reward.div(rewardsDuration);\n        } else {\n            uint256 remaining = periodFinish.sub(block.timestamp);\n            uint256 leftover = remaining.mul(rewardRate);\n            rewardRate = reward.add(leftover).div(rewardsDuration);\n        }\n\n        // Ensure the provided reward amount is not more than the balance in the contract.\n        // This keeps the reward rate in the right range, preventing overflows due to\n        // very high values of rewardRate in the earned and rewardsPerToken functions;\n        // Reward + leftover must be less than 2^256 / 10^18 to avoid overflow.\n        uint balance = rewardsToken.balanceOf(address(this));\n        require(rewardRate <= balance.div(rewardsDuration), \"Provided reward too high\");\n\n        lastUpdateTime = block.timestamp;\n        periodFinish = block.timestamp.add(rewardsDuration);\n        emit RewardAdded(reward);\n    }\n\n    /* ========== MODIFIERS ========== */\n\n    modifier updateReward(address account) {\n        rewardPerTokenStored = rewardPerToken();\n        lastUpdateTime = lastTimeRewardApplicable();\n        if (account != address(0)) {\n            rewards[account] = earned(account);\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\n        }\n        _;\n    }\n\n    /* ========== EVENTS ========== */\n\n    event RewardAdded(uint256 reward);\n    event Staked(address indexed user, uint256 amount);\n    event Withdrawn(address indexed user, uint256 amount);\n    event RewardPaid(address indexed user, uint256 reward);\n}\n\ninterface IUniswapV2ERC20 {\n    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;\n}\n\ncontract StakingRewardsFactory is Ownable {\n    // immutables\n    address public rewardsToken;\n    uint public stakingRewardsGenesis;\n\n    // the staking tokens for which the rewards contract has been deployed\n    address[] public stakingTokens;\n\n    // info about rewards for a particular staking token\n    struct StakingRewardsInfo {\n        address stakingRewards;\n        uint rewardAmount;\n    }\n\n    // rewards info by staking token\n    mapping(address => StakingRewardsInfo) public stakingRewardsInfoByStakingToken;\n\n    constructor(\n        address _rewardsToken,\n        uint _stakingRewardsGenesis\n    ) Ownable() public {\n\n        rewardsToken = _rewardsToken;\n        stakingRewardsGenesis = _stakingRewardsGenesis;\n    }\n\n    ///// permissioned functions\n\n    // deploy a staking reward contract for the staking token, and store the reward amount\n    // the reward will be distributed to the staking reward contract no sooner than the genesis\n    function deploy(address stakingToken, uint rewardAmount, uint256 rewardsDuration) public onlyOwner {\n        StakingRewardsInfo storage info = stakingRewardsInfoByStakingToken[stakingToken];\n        require(info.stakingRewards == address(0), 'StakingRewardsFactory::deploy: already deployed');\n\n        info.stakingRewards = address(new StakingRewards(/*_rewardsDistribution=*/ address(this), rewardsToken, stakingToken, rewardsDuration));\n        info.rewardAmount = rewardAmount;\n        stakingTokens.push(stakingToken);\n    }\n\n    ///// permissionless functions\n\n    // call notifyRewardAmount for all staking tokens.\n    function notifyRewardAmounts() public {\n        require(stakingTokens.length > 0, 'StakingRewardsFactory::notifyRewardAmounts: called before any deploys');\n        for (uint i = 0; i < stakingTokens.length; i++) {\n            notifyRewardAmount(stakingTokens[i]);\n        }\n    }\n\n    // notify reward amount for an individual staking token.\n    // this is a fallback in case the notifyRewardAmounts costs too much gas to call for all contracts\n    function notifyRewardAmount(address stakingToken) public {\n        require(block.timestamp >= stakingRewardsGenesis, 'StakingRewardsFactory::notifyRewardAmount: not ready');\n\n        StakingRewardsInfo storage info = stakingRewardsInfoByStakingToken[stakingToken];\n        require(info.stakingRewards != address(0), 'StakingRewardsFactory::notifyRewardAmount: not deployed');\n\n        if (info.rewardAmount > 0) {\n            uint rewardAmount = info.rewardAmount;\n            info.rewardAmount = 0;\n\n            require(\n                IERC20(rewardsToken).transfer(info.stakingRewards, rewardAmount),\n                'StakingRewardsFactory::notifyRewardAmount: transfer failed'\n            );\n            StakingRewards(info.stakingRewards).notifyRewardAmount(rewardAmount);\n        }\n    }\n}",
  "sourcePath": "/Users/warrenmason/Documents/UniswapV3Contracts/Core/LiveContracts/StakingRewardsFactory/contracts/StakingRewardsFactory.sol",
  "ast": {
    "absolutePath": "/Users/warrenmason/Documents/UniswapV3Contracts/Core/LiveContracts/StakingRewardsFactory/contracts/StakingRewardsFactory.sol",
    "exportedSymbols": {
      "Address": [
        447
      ],
      "ERC20Detailed": [
        430
      ],
      "IERC20": [
        68
      ],
      "IStakingRewards": [
        742
      ],
      "IUniswapV2ERC20": [
        1354
      ],
      "Math": [
        375
      ],
      "Ownable": [
        177
      ],
      "ReentrancyGuard": [
        691
      ],
      "RewardsDistributionRecipient": [
        762
      ],
      "SafeERC20": [
        661
      ],
      "SafeMath": [
        308
      ],
      "StakingRewards": [
        1336
      ],
      "StakingRewardsFactory": [
        1545
      ]
    },
    "id": 1546,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 1,
        "literals": [
          "solidity",
          ">=",
          "0.5",
          ".16"
        ],
        "nodeType": "PragmaDirective",
        "src": "31:25:0"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "interface",
        "documentation": "@dev Interface of the ERC20 standard as defined in the EIP. Does not include\nthe optional functions; to access them see `ERC20Detailed`.",
        "fullyImplemented": false,
        "id": 68,
        "linearizedBaseContracts": [
          68
        ],
        "name": "IERC20",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": null,
            "documentation": "@dev Returns the amount of tokens in existence.",
            "id": 6,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "totalSupply",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "323:2:0"
            },
            "returnParameters": {
              "id": 5,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6,
                  "src": "349:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "349:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "348:9:0"
            },
            "scope": 68,
            "src": "303:55:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": "@dev Returns the amount of tokens owned by `account`.",
            "id": 13,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "balanceOf",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 9,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 8,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 13,
                  "src": "460:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 7,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "460:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "459:17:0"
            },
            "returnParameters": {
              "id": 12,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 13,
                  "src": "500:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "500:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "499:9:0"
            },
            "scope": 68,
            "src": "441:68:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": "@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.",
            "id": 22,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "transfer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 18,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15,
                  "name": "recipient",
                  "nodeType": "VariableDeclaration",
                  "scope": 22,
                  "src": "747:17:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 14,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "747:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 22,
                  "src": "766:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 16,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "766:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "746:35:0"
            },
            "returnParameters": {
              "id": 21,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 20,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 22,
                  "src": "800:4:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "800:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "799:6:0"
            },
            "scope": 68,
            "src": "729:77:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": "@dev Returns the remaining number of tokens that `spender` will be\nallowed to spend on behalf of `owner` through `transferFrom`. This is\nzero by default.\n     * This value changes when `approve` or `transferFrom` are called.",
            "id": 31,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "allowance",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 27,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 24,
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "scope": 31,
                  "src": "1100:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 23,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1100:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 26,
                  "name": "spender",
                  "nodeType": "VariableDeclaration",
                  "scope": 31,
                  "src": "1115:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 25,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1115:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1099:32:0"
            },
            "returnParameters": {
              "id": 30,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 29,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 31,
                  "src": "1155:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 28,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1155:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1154:9:0"
            },
            "scope": 68,
            "src": "1081:83:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": "@dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     * Returns a boolean value indicating whether the operation succeeded.\n     * > Beware that changing an allowance with this method brings the risk\nthat someone may use both the old and the new allowance by unfortunate\ntransaction ordering. One possible solution to mitigate this race\ncondition is to first reduce the spender's allowance to 0 and set the\ndesired value afterwards:\nhttps://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     * Emits an `Approval` event.",
            "id": 40,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "approve",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 36,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 33,
                  "name": "spender",
                  "nodeType": "VariableDeclaration",
                  "scope": 40,
                  "src": "1825:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 32,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1825:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 35,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 40,
                  "src": "1842:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 34,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1842:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1824:33:0"
            },
            "returnParameters": {
              "id": 39,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 38,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 40,
                  "src": "1876:4:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 37,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1876:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1875:6:0"
            },
            "scope": 68,
            "src": "1808:74:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": "@dev Moves `amount` tokens from `sender` to `recipient` using the\nallowance mechanism. `amount` is then deducted from the caller's\nallowance.\n     * Returns a boolean value indicating whether the operation succeeded.\n     * Emits a `Transfer` event.",
            "id": 51,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "transferFrom",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 47,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 42,
                  "name": "sender",
                  "nodeType": "VariableDeclaration",
                  "scope": 51,
                  "src": "2211:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 41,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2211:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 44,
                  "name": "recipient",
                  "nodeType": "VariableDeclaration",
                  "scope": 51,
                  "src": "2227:17:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 43,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2227:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 46,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 51,
                  "src": "2246:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 45,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2246:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2210:51:0"
            },
            "returnParameters": {
              "id": 50,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 49,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 51,
                  "src": "2280:4:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 48,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2280:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2279:6:0"
            },
            "scope": 68,
            "src": "2189:97:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "anonymous": false,
            "documentation": "@dev Emitted when `value` tokens are moved from one account (`from`) to\nanother (`to`).\n     * Note that `value` may be zero.",
            "id": 59,
            "name": "Transfer",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 58,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 53,
                  "indexed": true,
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "scope": 59,
                  "src": "2470:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 52,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2470:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 55,
                  "indexed": true,
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "scope": 59,
                  "src": "2492:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 54,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2492:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 57,
                  "indexed": false,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 59,
                  "src": "2512:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 56,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2512:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2469:57:0"
            },
            "src": "2455:72:0"
          },
          {
            "anonymous": false,
            "documentation": "@dev Emitted when the allowance of a `spender` for an `owner` is set by\na call to `approve`. `value` is the new allowance.",
            "id": 67,
            "name": "Approval",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 66,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 61,
                  "indexed": true,
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "scope": 67,
                  "src": "2701:21:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2701:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 63,
                  "indexed": true,
                  "name": "spender",
                  "nodeType": "VariableDeclaration",
                  "scope": 67,
                  "src": "2724:23:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 62,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2724:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 65,
                  "indexed": false,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 67,
                  "src": "2749:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 64,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2749:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2700:63:0"
            },
            "src": "2686:78:0"
          }
        ],
        "scope": 1546,
        "src": "209:2557:0"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": "@dev Contract module which provides a basic access control mechanism, where\nthere is an account (an owner) that can be granted exclusive access to\nspecific functions.\n * This module is used through inheritance. It will make available the modifier\n`onlyOwner`, which can be aplied to your functions to restrict their use to\nthe owner.",
        "fullyImplemented": true,
        "id": 177,
        "linearizedBaseContracts": [
          177
        ],
        "name": "Ownable",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 70,
            "name": "_owner",
            "nodeType": "VariableDeclaration",
            "scope": 177,
            "src": "3151:22:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 69,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "3151:7:0",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 76,
            "name": "OwnershipTransferred",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 75,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 72,
                  "indexed": true,
                  "name": "previousOwner",
                  "nodeType": "VariableDeclaration",
                  "scope": 76,
                  "src": "3207:29:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 71,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3207:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 74,
                  "indexed": true,
                  "name": "newOwner",
                  "nodeType": "VariableDeclaration",
                  "scope": 76,
                  "src": "3238:24:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 73,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3238:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3206:57:0"
            },
            "src": "3180:84:0"
          },
          {
            "body": {
              "id": 91,
              "nodeType": "Block",
              "src": "3389:91:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 82,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 79,
                      "name": "_owner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 70,
                      "src": "3399:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 80,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1560,
                        "src": "3408:3:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 81,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "3408:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "src": "3399:19:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 83,
                  "nodeType": "ExpressionStatement",
                  "src": "3399:19:0"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 86,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3462: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": 85,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "3454:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 87,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3454:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 88,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 70,
                        "src": "3466:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 84,
                      "name": "OwnershipTransferred",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 76,
                      "src": "3433:20:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 89,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3433:40:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 90,
                  "nodeType": "EmitStatement",
                  "src": "3428:45:0"
                }
              ]
            },
            "documentation": "@dev Initializes the contract setting the deployer as the initial owner.",
            "id": 92,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 77,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3378:2:0"
            },
            "returnParameters": {
              "id": 78,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3389:0:0"
            },
            "scope": 177,
            "src": "3366:114:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 99,
              "nodeType": "Block",
              "src": "3603:30:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 97,
                    "name": "_owner",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 70,
                    "src": "3620:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 96,
                  "id": 98,
                  "nodeType": "Return",
                  "src": "3613:13:0"
                }
              ]
            },
            "documentation": "@dev Returns the address of the current owner.",
            "id": 100,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "owner",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 93,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3570:2:0"
            },
            "returnParameters": {
              "id": 96,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 95,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 100,
                  "src": "3594:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 94,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3594:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3593:9:0"
            },
            "scope": 177,
            "src": "3556:77:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 109,
              "nodeType": "Block",
              "src": "3742:82:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 103,
                          "name": "isOwner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 121,
                          "src": "3760:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                            "typeString": "function () view returns (bool)"
                          }
                        },
                        "id": 104,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3760:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572",
                        "id": 105,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3771:34:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe",
                          "typeString": "literal_string \"Ownable: caller is not the owner\""
                        },
                        "value": "Ownable: caller is not the owner"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe",
                          "typeString": "literal_string \"Ownable: caller is not the owner\""
                        }
                      ],
                      "id": 102,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "3752:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 106,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3752:54:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 107,
                  "nodeType": "ExpressionStatement",
                  "src": "3752:54:0"
                },
                {
                  "id": 108,
                  "nodeType": "PlaceholderStatement",
                  "src": "3816:1:0"
                }
              ]
            },
            "documentation": "@dev Throws if called by any account other than the owner.",
            "id": 110,
            "name": "onlyOwner",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 101,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3739:2:0"
            },
            "src": "3721:103:0",
            "visibility": "internal"
          },
          {
            "body": {
              "id": 120,
              "nodeType": "Block",
              "src": "3953:44:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 118,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 115,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1560,
                        "src": "3970:3:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 116,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "3970:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 117,
                      "name": "_owner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 70,
                      "src": "3984:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "3970:20:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 114,
                  "id": 119,
                  "nodeType": "Return",
                  "src": "3963:27:0"
                }
              ]
            },
            "documentation": "@dev Returns true if the caller is the current owner.",
            "id": 121,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isOwner",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 111,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3923:2:0"
            },
            "returnParameters": {
              "id": 114,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 113,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 121,
                  "src": "3947:4:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 112,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3947:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3946:6:0"
            },
            "scope": 177,
            "src": "3907:90:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 139,
              "nodeType": "Block",
              "src": "4387:91:0",
              "statements": [
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 127,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 70,
                        "src": "4423:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 129,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "4439: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": 128,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "4431:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 130,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4431:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 126,
                      "name": "OwnershipTransferred",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 76,
                      "src": "4402:20:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 131,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4402:40:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 132,
                  "nodeType": "EmitStatement",
                  "src": "4397:45:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 137,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 133,
                      "name": "_owner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 70,
                      "src": "4452:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 135,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "4469: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": 134,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "4461:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 136,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4461:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "src": "4452:19:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 138,
                  "nodeType": "ExpressionStatement",
                  "src": "4452:19:0"
                }
              ]
            },
            "documentation": "@dev Leaves the contract without owner. It will not be possible to call\n`onlyOwner` functions anymore. Can only be called by the current owner.\n     * > Note: Renouncing ownership will leave the contract without an owner,\nthereby removing any functionality that is only available to the owner.",
            "id": 140,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 124,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 123,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 110,
                  "src": "4377:9:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "4377:9:0"
              }
            ],
            "name": "renounceOwnership",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 122,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4367:2:0"
            },
            "returnParameters": {
              "id": 125,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4387:0:0"
            },
            "scope": 177,
            "src": "4341:137:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 151,
              "nodeType": "Block",
              "src": "4689:45:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 148,
                        "name": "newOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 142,
                        "src": "4718:8:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 147,
                      "name": "_transferOwnership",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 176,
                      "src": "4699:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 149,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4699:28:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 150,
                  "nodeType": "ExpressionStatement",
                  "src": "4699:28:0"
                }
              ]
            },
            "documentation": "@dev Transfers ownership of the contract to a new account (`newOwner`).\nCan only be called by the current owner.",
            "id": 152,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 145,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 144,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 110,
                  "src": "4679:9:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "4679:9:0"
              }
            ],
            "name": "transferOwnership",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 143,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 142,
                  "name": "newOwner",
                  "nodeType": "VariableDeclaration",
                  "scope": 152,
                  "src": "4654:16:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 141,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4654:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4653:18:0"
            },
            "returnParameters": {
              "id": 146,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4689:0:0"
            },
            "scope": 177,
            "src": "4627:107:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 175,
              "nodeType": "Block",
              "src": "4890:170:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 162,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 158,
                          "name": "newOwner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 154,
                          "src": "4908:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 160,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4928: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": 159,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "4920:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 161,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4920:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "4908:22:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373",
                        "id": 163,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4932:40:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe",
                          "typeString": "literal_string \"Ownable: new owner is the zero address\""
                        },
                        "value": "Ownable: new owner is the zero address"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe",
                          "typeString": "literal_string \"Ownable: new owner is the zero address\""
                        }
                      ],
                      "id": 157,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "4900:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 164,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4900:73:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 165,
                  "nodeType": "ExpressionStatement",
                  "src": "4900:73:0"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 167,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 70,
                        "src": "5009:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 168,
                        "name": "newOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 154,
                        "src": "5017:8:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 166,
                      "name": "OwnershipTransferred",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 76,
                      "src": "4988:20:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 169,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4988:38:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 170,
                  "nodeType": "EmitStatement",
                  "src": "4983:43:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 173,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 171,
                      "name": "_owner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 70,
                      "src": "5036:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 172,
                      "name": "newOwner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 154,
                      "src": "5045:8:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "5036:17:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 174,
                  "nodeType": "ExpressionStatement",
                  "src": "5036:17:0"
                }
              ]
            },
            "documentation": "@dev Transfers ownership of the contract to a new account (`newOwner`).",
            "id": 176,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_transferOwnership",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 155,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 154,
                  "name": "newOwner",
                  "nodeType": "VariableDeclaration",
                  "scope": 176,
                  "src": "4863:16:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 153,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4863:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4862:18:0"
            },
            "returnParameters": {
              "id": 156,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4890:0:0"
            },
            "scope": 177,
            "src": "4835:225:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 1546,
        "src": "3128:1934:0"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "library",
        "documentation": "@dev Wrappers over Solidity's arithmetic operations with added overflow\nchecks.\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\nin bugs, because programmers usually assume that an overflow raises an\nerror, which is the standard behavior in high level programming languages.\n`SafeMath` restores this intuition by reverting the transaction when an\noperation overflows.\n * Using this library instead of the unchecked operations eliminates an entire\nclass of bugs, so it's recommended to use it always.",
        "fullyImplemented": true,
        "id": 308,
        "linearizedBaseContracts": [
          308
        ],
        "name": "SafeMath",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 201,
              "nodeType": "Block",
              "src": "5940:109:0",
              "statements": [
                {
                  "assignments": [
                    187
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 187,
                      "name": "c",
                      "nodeType": "VariableDeclaration",
                      "scope": 201,
                      "src": "5950:9:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 186,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "5950:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 191,
                  "initialValue": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 190,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 188,
                      "name": "a",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 179,
                      "src": "5962:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 189,
                      "name": "b",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 181,
                      "src": "5966:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "5962:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5950:17:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 195,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 193,
                          "name": "c",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 187,
                          "src": "5985:1:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 194,
                          "name": "a",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 179,
                          "src": "5990:1:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "5985:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "536166654d6174683a206164646974696f6e206f766572666c6f77",
                        "id": 196,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "5993: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": 192,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "5977:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 197,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5977:46:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 198,
                  "nodeType": "ExpressionStatement",
                  "src": "5977:46:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 199,
                    "name": "c",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 187,
                    "src": "6041:1:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 185,
                  "id": 200,
                  "nodeType": "Return",
                  "src": "6034:8:0"
                }
              ]
            },
            "documentation": "@dev Returns the addition of two unsigned integers, reverting on\noverflow.\n     * Counterpart to Solidity's `+` operator.\n     * Requirements:\n- Addition cannot overflow.",
            "id": 202,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "add",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 182,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 179,
                  "name": "a",
                  "nodeType": "VariableDeclaration",
                  "scope": 202,
                  "src": "5886:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 178,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5886:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 181,
                  "name": "b",
                  "nodeType": "VariableDeclaration",
                  "scope": 202,
                  "src": "5897:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 180,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5897:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5885:22:0"
            },
            "returnParameters": {
              "id": 185,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 184,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 202,
                  "src": "5931:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 183,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5931:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5930:9:0"
            },
            "scope": 308,
            "src": "5873:176:0",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 226,
              "nodeType": "Block",
              "src": "6380:112:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 214,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 212,
                          "name": "b",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 206,
                          "src": "6398:1:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 213,
                          "name": "a",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 204,
                          "src": "6403:1:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "6398:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "536166654d6174683a207375627472616374696f6e206f766572666c6f77",
                        "id": 215,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "6406: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": 211,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "6390:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 216,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6390:49:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 217,
                  "nodeType": "ExpressionStatement",
                  "src": "6390:49:0"
                },
                {
                  "assignments": [
                    219
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 219,
                      "name": "c",
                      "nodeType": "VariableDeclaration",
                      "scope": 226,
                      "src": "6449:9:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 218,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "6449:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 223,
                  "initialValue": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 222,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 220,
                      "name": "a",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 204,
                      "src": "6461:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 221,
                      "name": "b",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 206,
                      "src": "6465:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "6461:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6449:17:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 224,
                    "name": "c",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 219,
                    "src": "6484:1:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 210,
                  "id": 225,
                  "nodeType": "Return",
                  "src": "6477:8:0"
                }
              ]
            },
            "documentation": "@dev Returns the subtraction of two unsigned integers, reverting on\noverflow (when the result is negative).\n     * Counterpart to Solidity's `-` operator.\n     * Requirements:\n- Subtraction cannot overflow.",
            "id": 227,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "sub",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 207,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 204,
                  "name": "a",
                  "nodeType": "VariableDeclaration",
                  "scope": 227,
                  "src": "6326:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 203,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6326:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 206,
                  "name": "b",
                  "nodeType": "VariableDeclaration",
                  "scope": 227,
                  "src": "6337:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 205,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6337:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6325:22:0"
            },
            "returnParameters": {
              "id": 210,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 209,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 227,
                  "src": "6371:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 208,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6371:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6370:9:0"
            },
            "scope": 308,
            "src": "6313:179:0",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 260,
              "nodeType": "Block",
              "src": "6799:391:0",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 238,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 236,
                      "name": "a",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 229,
                      "src": "7030:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 237,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "7035:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "7030:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 242,
                  "nodeType": "IfStatement",
                  "src": "7026:45:0",
                  "trueBody": {
                    "id": 241,
                    "nodeType": "Block",
                    "src": "7038:33:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 239,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "7059:1:0",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "functionReturnParameters": 235,
                        "id": 240,
                        "nodeType": "Return",
                        "src": "7052:8:0"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    244
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 244,
                      "name": "c",
                      "nodeType": "VariableDeclaration",
                      "scope": 260,
                      "src": "7081:9:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 243,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "7081:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 248,
                  "initialValue": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 247,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 245,
                      "name": "a",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 229,
                      "src": "7093:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "*",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 246,
                      "name": "b",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 231,
                      "src": "7097:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "7093:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7081:17:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 254,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 252,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 250,
                            "name": "c",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 244,
                            "src": "7116:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "/",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 251,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 229,
                            "src": "7120:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7116:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 253,
                          "name": "b",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 231,
                          "src": "7125:1:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "7116:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77",
                        "id": 255,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "7128: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": 249,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "7108:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 256,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7108:56:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 257,
                  "nodeType": "ExpressionStatement",
                  "src": "7108:56:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 258,
                    "name": "c",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 244,
                    "src": "7182:1:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 235,
                  "id": 259,
                  "nodeType": "Return",
                  "src": "7175:8:0"
                }
              ]
            },
            "documentation": "@dev Returns the multiplication of two unsigned integers, reverting on\noverflow.\n     * Counterpart to Solidity's `*` operator.\n     * Requirements:\n- Multiplication cannot overflow.",
            "id": 261,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "mul",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 232,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 229,
                  "name": "a",
                  "nodeType": "VariableDeclaration",
                  "scope": 261,
                  "src": "6745:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 228,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6745:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 231,
                  "name": "b",
                  "nodeType": "VariableDeclaration",
                  "scope": 261,
                  "src": "6756:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 230,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6756:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6744:22:0"
            },
            "returnParameters": {
              "id": 235,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 234,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 261,
                  "src": "6790:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 233,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6790:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6789:9:0"
            },
            "scope": 308,
            "src": "6732:458:0",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 285,
              "nodeType": "Block",
              "src": "7712:259:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 273,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 271,
                          "name": "b",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 265,
                          "src": "7796:1:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 272,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "7800:1:0",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "7796:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "536166654d6174683a206469766973696f6e206279207a65726f",
                        "id": 274,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "7803: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": 270,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "7788:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 275,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7788:44:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 276,
                  "nodeType": "ExpressionStatement",
                  "src": "7788:44:0"
                },
                {
                  "assignments": [
                    278
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 278,
                      "name": "c",
                      "nodeType": "VariableDeclaration",
                      "scope": 285,
                      "src": "7842:9:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 277,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "7842:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 282,
                  "initialValue": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 281,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 279,
                      "name": "a",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 263,
                      "src": "7854:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "/",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 280,
                      "name": "b",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 265,
                      "src": "7858:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "7854:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7842:17:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 283,
                    "name": "c",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 278,
                    "src": "7963:1:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 269,
                  "id": 284,
                  "nodeType": "Return",
                  "src": "7956:8:0"
                }
              ]
            },
            "documentation": "@dev Returns the integer division of two unsigned integers. Reverts on\ndivision 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\nuses an invalid opcode to revert (consuming all remaining gas).\n     * Requirements:\n- The divisor cannot be zero.",
            "id": 286,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "div",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 266,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 263,
                  "name": "a",
                  "nodeType": "VariableDeclaration",
                  "scope": 286,
                  "src": "7658:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 262,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7658:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 265,
                  "name": "b",
                  "nodeType": "VariableDeclaration",
                  "scope": 286,
                  "src": "7669:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 264,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7669:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7657:22:0"
            },
            "returnParameters": {
              "id": 269,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 268,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 286,
                  "src": "7703:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 267,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7703:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7702:9:0"
            },
            "scope": 308,
            "src": "7645:326:0",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 306,
              "nodeType": "Block",
              "src": "8482:82:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 298,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 296,
                          "name": "b",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 290,
                          "src": "8500:1:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 297,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "8505:1:0",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "8500:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "536166654d6174683a206d6f64756c6f206279207a65726f",
                        "id": 299,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "8508: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": 295,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "8492:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 300,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8492:43:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 301,
                  "nodeType": "ExpressionStatement",
                  "src": "8492:43:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 304,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 302,
                      "name": "a",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 288,
                      "src": "8552:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "%",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 303,
                      "name": "b",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 290,
                      "src": "8556:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "8552:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 294,
                  "id": 305,
                  "nodeType": "Return",
                  "src": "8545:12:0"
                }
              ]
            },
            "documentation": "@dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\nReverts when dividing by zero.\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\nopcode (which leaves remaining gas untouched) while Solidity uses an\ninvalid opcode to revert (consuming all remaining gas).\n     * Requirements:\n- The divisor cannot be zero.",
            "id": 307,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "mod",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 291,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 288,
                  "name": "a",
                  "nodeType": "VariableDeclaration",
                  "scope": 307,
                  "src": "8428:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 287,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8428:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 290,
                  "name": "b",
                  "nodeType": "VariableDeclaration",
                  "scope": 307,
                  "src": "8439:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 289,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8439:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8427:22:0"
            },
            "returnParameters": {
              "id": 294,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 293,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 307,
                  "src": "8473:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 292,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8473:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8472:9:0"
            },
            "scope": 308,
            "src": "8415:149:0",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 1546,
        "src": "5628:2938:0"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "library",
        "documentation": "@dev Standard math utilities missing in the Solidity language.",
        "fullyImplemented": true,
        "id": 375,
        "linearizedBaseContracts": [
          375
        ],
        "name": "Math",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 324,
              "nodeType": "Block",
              "src": "8792:38:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "condition": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 319,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 317,
                        "name": "a",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 310,
                        "src": "8809:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": ">=",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 318,
                        "name": "b",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 312,
                        "src": "8814:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "8809:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "falseExpression": {
                      "argumentTypes": null,
                      "id": 321,
                      "name": "b",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 312,
                      "src": "8822:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 322,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "Conditional",
                    "src": "8809:14:0",
                    "trueExpression": {
                      "argumentTypes": null,
                      "id": 320,
                      "name": "a",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 310,
                      "src": "8818:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 316,
                  "id": 323,
                  "nodeType": "Return",
                  "src": "8802:21:0"
                }
              ]
            },
            "documentation": "@dev Returns the largest of two numbers.",
            "id": 325,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "max",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 313,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 310,
                  "name": "a",
                  "nodeType": "VariableDeclaration",
                  "scope": 325,
                  "src": "8738:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 309,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8738:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 312,
                  "name": "b",
                  "nodeType": "VariableDeclaration",
                  "scope": 325,
                  "src": "8749:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 311,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8749:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8737:22:0"
            },
            "returnParameters": {
              "id": 316,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 315,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 325,
                  "src": "8783:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 314,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8783:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8782:9:0"
            },
            "scope": 375,
            "src": "8725:105:0",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 341,
              "nodeType": "Block",
              "src": "8968:37:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "condition": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 336,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 334,
                        "name": "a",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 327,
                        "src": "8985:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "<",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 335,
                        "name": "b",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 329,
                        "src": "8989:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "8985:5:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "falseExpression": {
                      "argumentTypes": null,
                      "id": 338,
                      "name": "b",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 329,
                      "src": "8997:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 339,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "Conditional",
                    "src": "8985:13:0",
                    "trueExpression": {
                      "argumentTypes": null,
                      "id": 337,
                      "name": "a",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 327,
                      "src": "8993:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 333,
                  "id": 340,
                  "nodeType": "Return",
                  "src": "8978:20:0"
                }
              ]
            },
            "documentation": "@dev Returns the smallest of two numbers.",
            "id": 342,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "min",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 330,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 327,
                  "name": "a",
                  "nodeType": "VariableDeclaration",
                  "scope": 342,
                  "src": "8914:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 326,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8914:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 329,
                  "name": "b",
                  "nodeType": "VariableDeclaration",
                  "scope": 342,
                  "src": "8925:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 328,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8925:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8913:22:0"
            },
            "returnParameters": {
              "id": 333,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 332,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 342,
                  "src": "8959:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 331,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8959:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8958:9:0"
            },
            "scope": 375,
            "src": "8901:104:0",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 373,
              "nodeType": "Block",
              "src": "9189:119:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 371,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 359,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "components": [
                          {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 353,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 351,
                              "name": "a",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 344,
                              "src": "9261:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "/",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "32",
                              "id": 352,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "9265:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_2_by_1",
                                "typeString": "int_const 2"
                              },
                              "value": "2"
                            },
                            "src": "9261:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "id": 354,
                        "isConstant": false,
                        "isInlineArray": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "9260:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "+",
                      "rightExpression": {
                        "argumentTypes": null,
                        "components": [
                          {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 357,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 355,
                              "name": "b",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 346,
                              "src": "9271:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "/",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "32",
                              "id": 356,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "9275:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_2_by_1",
                                "typeString": "int_const 2"
                              },
                              "value": "2"
                            },
                            "src": "9271:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "id": 358,
                        "isConstant": false,
                        "isInlineArray": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "9270:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "9260:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "argumentTypes": null,
                      "components": [
                        {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 369,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 366,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 362,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 360,
                                    "name": "a",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 344,
                                    "src": "9282:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "%",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "32",
                                    "id": 361,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "9286:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_2_by_1",
                                      "typeString": "int_const 2"
                                    },
                                    "value": "2"
                                  },
                                  "src": "9282:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "+",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 365,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 363,
                                    "name": "b",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 346,
                                    "src": "9290:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "%",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "32",
                                    "id": 364,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "9294:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_2_by_1",
                                      "typeString": "int_const 2"
                                    },
                                    "value": "2"
                                  },
                                  "src": "9290:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "9282:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 367,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "9281:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "/",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "32",
                            "id": 368,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "9299:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_2_by_1",
                              "typeString": "int_const 2"
                            },
                            "value": "2"
                          },
                          "src": "9281:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 370,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "TupleExpression",
                      "src": "9280:21:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "9260:41:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 350,
                  "id": 372,
                  "nodeType": "Return",
                  "src": "9253:48:0"
                }
              ]
            },
            "documentation": "@dev Returns the average of two numbers. The result is rounded towards\nzero.",
            "id": 374,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "average",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 347,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 344,
                  "name": "a",
                  "nodeType": "VariableDeclaration",
                  "scope": 374,
                  "src": "9135:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 343,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9135:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 346,
                  "name": "b",
                  "nodeType": "VariableDeclaration",
                  "scope": 374,
                  "src": "9146:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 345,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9146:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9134:22:0"
            },
            "returnParameters": {
              "id": 350,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 349,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 374,
                  "src": "9180:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 348,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9180:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9179:9:0"
            },
            "scope": 375,
            "src": "9118:190:0",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 1546,
        "src": "8642:668:0"
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 376,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 68,
              "src": "9398:6:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$68",
                "typeString": "contract IERC20"
              }
            },
            "id": 377,
            "nodeType": "InheritanceSpecifier",
            "src": "9398:6:0"
          }
        ],
        "contractDependencies": [
          68
        ],
        "contractKind": "contract",
        "documentation": "@dev Optional functions from the ERC20 standard.",
        "fullyImplemented": false,
        "id": 430,
        "linearizedBaseContracts": [
          430,
          68
        ],
        "name": "ERC20Detailed",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 379,
            "name": "_name",
            "nodeType": "VariableDeclaration",
            "scope": 430,
            "src": "9411:20:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_storage",
              "typeString": "string"
            },
            "typeName": {
              "id": 378,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "9411:6:0",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 381,
            "name": "_symbol",
            "nodeType": "VariableDeclaration",
            "scope": 430,
            "src": "9437:22:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_storage",
              "typeString": "string"
            },
            "typeName": {
              "id": 380,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "9437:6:0",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 383,
            "name": "_decimals",
            "nodeType": "VariableDeclaration",
            "scope": 430,
            "src": "9465:23:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 382,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "9465:5:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 404,
              "nodeType": "Block",
              "src": "9757:85:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 394,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 392,
                      "name": "_name",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 379,
                      "src": "9767:5:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_storage",
                        "typeString": "string storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 393,
                      "name": "name",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 385,
                      "src": "9775:4:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "src": "9767:12:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage",
                      "typeString": "string storage ref"
                    }
                  },
                  "id": 395,
                  "nodeType": "ExpressionStatement",
                  "src": "9767:12:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 398,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 396,
                      "name": "_symbol",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 381,
                      "src": "9789:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_storage",
                        "typeString": "string storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 397,
                      "name": "symbol",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 387,
                      "src": "9799:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "src": "9789:16:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage",
                      "typeString": "string storage ref"
                    }
                  },
                  "id": 399,
                  "nodeType": "ExpressionStatement",
                  "src": "9789:16:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 402,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 400,
                      "name": "_decimals",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 383,
                      "src": "9815:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 401,
                      "name": "decimals",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 389,
                      "src": "9827:8:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "9815:20:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "id": 403,
                  "nodeType": "ExpressionStatement",
                  "src": "9815:20:0"
                }
              ]
            },
            "documentation": "@dev Sets the values for `name`, `symbol`, and `decimals`. All three of\nthese values are immutable: they can only be set once during\nconstruction.",
            "id": 405,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 390,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 385,
                  "name": "name",
                  "nodeType": "VariableDeclaration",
                  "scope": 405,
                  "src": "9692:18:0",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 384,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "9692:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 387,
                  "name": "symbol",
                  "nodeType": "VariableDeclaration",
                  "scope": 405,
                  "src": "9712:20:0",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 386,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "9712:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 389,
                  "name": "decimals",
                  "nodeType": "VariableDeclaration",
                  "scope": 405,
                  "src": "9734:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 388,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "9734:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9691:58:0"
            },
            "returnParameters": {
              "id": 391,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9757:0:0"
            },
            "scope": 430,
            "src": "9679:163:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 412,
              "nodeType": "Block",
              "src": "9959:29:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 410,
                    "name": "_name",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 379,
                    "src": "9976:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage",
                      "typeString": "string storage ref"
                    }
                  },
                  "functionReturnParameters": 409,
                  "id": 411,
                  "nodeType": "Return",
                  "src": "9969:12:0"
                }
              ]
            },
            "documentation": "@dev Returns the name of the token.",
            "id": 413,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "name",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 406,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9920:2:0"
            },
            "returnParameters": {
              "id": 409,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 408,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 413,
                  "src": "9944:13:0",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 407,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "9944:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9943:15:0"
            },
            "scope": 430,
            "src": "9907:81:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 420,
              "nodeType": "Block",
              "src": "10155:31:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 418,
                    "name": "_symbol",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 381,
                    "src": "10172:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage",
                      "typeString": "string storage ref"
                    }
                  },
                  "functionReturnParameters": 417,
                  "id": 419,
                  "nodeType": "Return",
                  "src": "10165:14:0"
                }
              ]
            },
            "documentation": "@dev Returns the symbol of the token, usually a shorter version of the\nname.",
            "id": 421,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "symbol",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 414,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "10116:2:0"
            },
            "returnParameters": {
              "id": 417,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 416,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 421,
                  "src": "10140:13:0",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 415,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "10140:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "10139:15:0"
            },
            "scope": 430,
            "src": "10101:85:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 428,
              "nodeType": "Block",
              "src": "10789:33:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 426,
                    "name": "_decimals",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 383,
                    "src": "10806:9:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "functionReturnParameters": 425,
                  "id": 427,
                  "nodeType": "Return",
                  "src": "10799:16:0"
                }
              ]
            },
            "documentation": "@dev Returns the number of decimals used to get its user representation.\nFor example, if `decimals` equals `2`, a balance of `505` tokens should\nbe displayed to a user as `5,05` (`505 / 10 ** 2`).\n     * Tokens usually opt for a value of 18, imitating the relationship between\nEther and Wei.\n     * > Note that this information is only used for _display_ purposes: it in\nno way affects any of the arithmetic of the contract, including\n`IERC20.balanceOf` and `IERC20.transfer`.",
            "id": 429,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "decimals",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 422,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "10758:2:0"
            },
            "returnParameters": {
              "id": 425,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 424,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 429,
                  "src": "10782:5:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 423,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "10782:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "10781:7:0"
            },
            "scope": 430,
            "src": "10741:81:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          }
        ],
        "scope": 1546,
        "src": "9372:1452:0"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "library",
        "documentation": "@dev Collection of functions related to the address type,",
        "fullyImplemented": true,
        "id": 447,
        "linearizedBaseContracts": [
          447
        ],
        "name": "Address",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 445,
              "nodeType": "Block",
              "src": "11409:347:0",
              "statements": [
                {
                  "assignments": [
                    438
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 438,
                      "name": "size",
                      "nodeType": "VariableDeclaration",
                      "scope": 445,
                      "src": "11606:12:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 437,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "11606:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 439,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "11606:12:0"
                },
                {
                  "externalReferences": [
                    {
                      "account": {
                        "declaration": 432,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "11715:7:0",
                        "valueSize": 1
                      }
                    },
                    {
                      "size": {
                        "declaration": 438,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "11695:4:0",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 440,
                  "nodeType": "InlineAssembly",
                  "operations": "{ size := extcodesize(account) }",
                  "src": "11684:41:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 443,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 441,
                      "name": "size",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 438,
                      "src": "11741:4:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 442,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "11748:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "11741:8:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 436,
                  "id": 444,
                  "nodeType": "Return",
                  "src": "11734:15:0"
                }
              ]
            },
            "documentation": "@dev Returns true if `account` is a contract.\n     * This test is non-exhaustive, and there may be false-negatives: during the\nexecution of a contract's constructor, its address will be reported as\nnot containing a contract.\n     * > It is unsafe to assume that an address for which this function returns\nfalse is an externally-owned account (EOA) and not a contract.",
            "id": 446,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isContract",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 433,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 432,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 446,
                  "src": "11363:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 431,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "11363:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11362:17:0"
            },
            "returnParameters": {
              "id": 436,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 435,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 446,
                  "src": "11403:4:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 434,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "11403:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11402:6:0"
            },
            "scope": 447,
            "src": "11343:413:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 1546,
        "src": "10895:863:0"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "library",
        "documentation": "@title SafeERC20\n@dev Wrappers around ERC20 operations that throw on failure (when the token\ncontract returns false). Tokens that return no value (and instead revert or\nthrow on failure) are also supported, non-reverting calls are assumed to be\nsuccessful.\nTo use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,\nwhich allows you to call the safe operations as `token.safeTransfer(...)`, etc.",
        "fullyImplemented": true,
        "id": 661,
        "linearizedBaseContracts": [
          661
        ],
        "name": "SafeERC20",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 450,
            "libraryName": {
              "contractScope": null,
              "id": 448,
              "name": "SafeMath",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 308,
              "src": "12247:8:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMath_$308",
                "typeString": "library SafeMath"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "12241:27:0",
            "typeName": {
              "id": 449,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "12260:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "id": 453,
            "libraryName": {
              "contractScope": null,
              "id": 451,
              "name": "Address",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 447,
              "src": "12279:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Address_$447",
                "typeString": "library Address"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "12273:26:0",
            "typeName": {
              "id": 452,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "12291:7:0",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            }
          },
          {
            "body": {
              "id": 474,
              "nodeType": "Block",
              "src": "12377:102:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 463,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 455,
                        "src": "12406:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$68",
                          "typeString": "contract IERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 466,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 455,
                                "src": "12436:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$68",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "id": 467,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "transfer",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 22,
                              "src": "12436:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                "typeString": "function (address,uint256) external returns (bool)"
                              }
                            },
                            "id": 468,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "selector",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "12436:23:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 469,
                            "name": "to",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 457,
                            "src": "12461:2:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 470,
                            "name": "value",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 459,
                            "src": "12465: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": 464,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1547,
                            "src": "12413:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 465,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encodeWithSelector",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "12413:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function (bytes4) pure returns (bytes memory)"
                          }
                        },
                        "id": 471,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "12413:58:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_IERC20_$68",
                          "typeString": "contract IERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 462,
                      "name": "callOptionalReturn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 660,
                      "src": "12387:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$68_$_t_bytes_memory_ptr_$returns$__$",
                        "typeString": "function (contract IERC20,bytes memory)"
                      }
                    },
                    "id": 472,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12387:85:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 473,
                  "nodeType": "ExpressionStatement",
                  "src": "12387:85:0"
                }
              ]
            },
            "documentation": null,
            "id": 475,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "safeTransfer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 460,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 455,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 475,
                  "src": "12327:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$68",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 454,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 68,
                    "src": "12327:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$68",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 457,
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "scope": 475,
                  "src": "12341:10:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 456,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12341:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 459,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 475,
                  "src": "12353:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 458,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12353:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "12326:41:0"
            },
            "returnParameters": {
              "id": 461,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12377:0:0"
            },
            "scope": 661,
            "src": "12305:174:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 499,
              "nodeType": "Block",
              "src": "12575:112:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 487,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 477,
                        "src": "12604:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$68",
                          "typeString": "contract IERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 490,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 477,
                                "src": "12634:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$68",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "id": 491,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "transferFrom",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 51,
                              "src": "12634: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": 492,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "selector",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "12634:27:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 493,
                            "name": "from",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 479,
                            "src": "12663:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 494,
                            "name": "to",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 481,
                            "src": "12669:2:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 495,
                            "name": "value",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 483,
                            "src": "12673: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": 488,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1547,
                            "src": "12611:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 489,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encodeWithSelector",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "12611:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function (bytes4) pure returns (bytes memory)"
                          }
                        },
                        "id": 496,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "12611:68:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_IERC20_$68",
                          "typeString": "contract IERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 486,
                      "name": "callOptionalReturn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 660,
                      "src": "12585:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$68_$_t_bytes_memory_ptr_$returns$__$",
                        "typeString": "function (contract IERC20,bytes memory)"
                      }
                    },
                    "id": 497,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12585:95:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 498,
                  "nodeType": "ExpressionStatement",
                  "src": "12585:95:0"
                }
              ]
            },
            "documentation": null,
            "id": 500,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "safeTransferFrom",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 484,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 477,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 500,
                  "src": "12511:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$68",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 476,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 68,
                    "src": "12511:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$68",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 479,
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "scope": 500,
                  "src": "12525:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 478,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12525:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 481,
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "scope": 500,
                  "src": "12539:10:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 480,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12539:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 483,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 500,
                  "src": "12551:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 482,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12551:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "12510:55:0"
            },
            "returnParameters": {
              "id": 485,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12575:0:0"
            },
            "scope": 661,
            "src": "12485:202:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 540,
              "nodeType": "Block",
              "src": "12769:536:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 524,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 512,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 510,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 506,
                                "src": "13058:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 511,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "13067:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "13058:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "id": 513,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "13057:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "||",
                        "rightExpression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 522,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 517,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1586,
                                        "src": "13098:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_SafeERC20_$661",
                                          "typeString": "library SafeERC20"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_SafeERC20_$661",
                                          "typeString": "library SafeERC20"
                                        }
                                      ],
                                      "id": 516,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "13090:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": "address"
                                    },
                                    "id": 518,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "13090:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 519,
                                    "name": "spender",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 504,
                                    "src": "13105:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 514,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 502,
                                    "src": "13074:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$68",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "id": 515,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "allowance",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 31,
                                  "src": "13074:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$",
                                    "typeString": "function (address,address) view external returns (uint256)"
                                  }
                                },
                                "id": 520,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "13074:39:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 521,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "13117:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "13074:44:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "id": 523,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "13073:46:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "13057:62:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365",
                        "id": 525,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "13133: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": 509,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "13049:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 526,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13049:150:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 527,
                  "nodeType": "ExpressionStatement",
                  "src": "13049:150:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 529,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 502,
                        "src": "13228:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$68",
                          "typeString": "contract IERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 532,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 502,
                                "src": "13258:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$68",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "id": 533,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "approve",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 40,
                              "src": "13258:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                "typeString": "function (address,uint256) external returns (bool)"
                              }
                            },
                            "id": 534,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "selector",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "13258:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 535,
                            "name": "spender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 504,
                            "src": "13282:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 536,
                            "name": "value",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 506,
                            "src": "13291: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": 530,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1547,
                            "src": "13235:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 531,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encodeWithSelector",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "13235:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function (bytes4) pure returns (bytes memory)"
                          }
                        },
                        "id": 537,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "13235:62:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_IERC20_$68",
                          "typeString": "contract IERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 528,
                      "name": "callOptionalReturn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 660,
                      "src": "13209:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$68_$_t_bytes_memory_ptr_$returns$__$",
                        "typeString": "function (contract IERC20,bytes memory)"
                      }
                    },
                    "id": 538,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13209:89:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 539,
                  "nodeType": "ExpressionStatement",
                  "src": "13209:89:0"
                }
              ]
            },
            "documentation": null,
            "id": 541,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "safeApprove",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 507,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 502,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 541,
                  "src": "12714:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$68",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 501,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 68,
                    "src": "12714:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$68",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 504,
                  "name": "spender",
                  "nodeType": "VariableDeclaration",
                  "scope": 541,
                  "src": "12728:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 503,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12728:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 506,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 541,
                  "src": "12745:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 505,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12745:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "12713:46:0"
            },
            "returnParameters": {
              "id": 508,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12769:0:0"
            },
            "scope": 661,
            "src": "12693:612:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 575,
              "nodeType": "Block",
              "src": "13397:196:0",
              "statements": [
                {
                  "assignments": [
                    551
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 551,
                      "name": "newAllowance",
                      "nodeType": "VariableDeclaration",
                      "scope": 575,
                      "src": "13407:20:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 550,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "13407:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 562,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 560,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 547,
                        "src": "13474: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": 555,
                                "name": "this",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1586,
                                "src": "13454:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_SafeERC20_$661",
                                  "typeString": "library SafeERC20"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_SafeERC20_$661",
                                  "typeString": "library SafeERC20"
                                }
                              ],
                              "id": 554,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "13446:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": "address"
                            },
                            "id": 556,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "13446:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 557,
                            "name": "spender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 545,
                            "src": "13461:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 552,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 543,
                            "src": "13430:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$68",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 553,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "allowance",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 31,
                          "src": "13430:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$",
                            "typeString": "function (address,address) view external returns (uint256)"
                          }
                        },
                        "id": 558,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "13430:39:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 559,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "add",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 202,
                      "src": "13430: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": 561,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13430:50:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "13407:73:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 564,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 543,
                        "src": "13509:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$68",
                          "typeString": "contract IERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 567,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 543,
                                "src": "13539:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$68",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "id": 568,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "approve",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 40,
                              "src": "13539:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                "typeString": "function (address,uint256) external returns (bool)"
                              }
                            },
                            "id": 569,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "selector",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "13539:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 570,
                            "name": "spender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 545,
                            "src": "13563:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 571,
                            "name": "newAllowance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 551,
                            "src": "13572: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": 565,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1547,
                            "src": "13516:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 566,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encodeWithSelector",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "13516:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function (bytes4) pure returns (bytes memory)"
                          }
                        },
                        "id": 572,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "13516:69:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_IERC20_$68",
                          "typeString": "contract IERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 563,
                      "name": "callOptionalReturn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 660,
                      "src": "13490:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$68_$_t_bytes_memory_ptr_$returns$__$",
                        "typeString": "function (contract IERC20,bytes memory)"
                      }
                    },
                    "id": 573,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13490:96:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 574,
                  "nodeType": "ExpressionStatement",
                  "src": "13490:96:0"
                }
              ]
            },
            "documentation": null,
            "id": 576,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "safeIncreaseAllowance",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 548,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 543,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 576,
                  "src": "13342:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$68",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 542,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 68,
                    "src": "13342:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$68",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 545,
                  "name": "spender",
                  "nodeType": "VariableDeclaration",
                  "scope": 576,
                  "src": "13356:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 544,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13356:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 547,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 576,
                  "src": "13373:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 546,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13373:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13341:46:0"
            },
            "returnParameters": {
              "id": 549,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "13397:0:0"
            },
            "scope": 661,
            "src": "13311:282:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 610,
              "nodeType": "Block",
              "src": "13685:196:0",
              "statements": [
                {
                  "assignments": [
                    586
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 586,
                      "name": "newAllowance",
                      "nodeType": "VariableDeclaration",
                      "scope": 610,
                      "src": "13695:20:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 585,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "13695:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 597,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 595,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 582,
                        "src": "13762: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": 590,
                                "name": "this",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1586,
                                "src": "13742:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_SafeERC20_$661",
                                  "typeString": "library SafeERC20"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_SafeERC20_$661",
                                  "typeString": "library SafeERC20"
                                }
                              ],
                              "id": 589,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "13734:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": "address"
                            },
                            "id": 591,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "13734:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 592,
                            "name": "spender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 580,
                            "src": "13749:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 587,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 578,
                            "src": "13718:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$68",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 588,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "allowance",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 31,
                          "src": "13718:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$",
                            "typeString": "function (address,address) view external returns (uint256)"
                          }
                        },
                        "id": 593,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "13718:39:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 594,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sub",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 227,
                      "src": "13718: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": 596,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13718:50:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "13695:73:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 599,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 578,
                        "src": "13797:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$68",
                          "typeString": "contract IERC20"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 602,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 578,
                                "src": "13827:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$68",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "id": 603,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "approve",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 40,
                              "src": "13827:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                "typeString": "function (address,uint256) external returns (bool)"
                              }
                            },
                            "id": 604,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "selector",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "13827:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 605,
                            "name": "spender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 580,
                            "src": "13851:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 606,
                            "name": "newAllowance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 586,
                            "src": "13860: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": 600,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1547,
                            "src": "13804:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 601,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encodeWithSelector",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "13804:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function (bytes4) pure returns (bytes memory)"
                          }
                        },
                        "id": 607,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "13804:69:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_IERC20_$68",
                          "typeString": "contract IERC20"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 598,
                      "name": "callOptionalReturn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 660,
                      "src": "13778:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$68_$_t_bytes_memory_ptr_$returns$__$",
                        "typeString": "function (contract IERC20,bytes memory)"
                      }
                    },
                    "id": 608,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13778:96:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 609,
                  "nodeType": "ExpressionStatement",
                  "src": "13778:96:0"
                }
              ]
            },
            "documentation": null,
            "id": 611,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "safeDecreaseAllowance",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 583,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 578,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 611,
                  "src": "13630:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$68",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 577,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 68,
                    "src": "13630:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$68",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 580,
                  "name": "spender",
                  "nodeType": "VariableDeclaration",
                  "scope": 611,
                  "src": "13644:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 579,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13644:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 582,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 611,
                  "src": "13661:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 581,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13661:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13629:46:0"
            },
            "returnParameters": {
              "id": 584,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "13685:0:0"
            },
            "scope": 661,
            "src": "13599:282:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 659,
              "nodeType": "Block",
              "src": "14333:1026:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "expression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 620,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 613,
                                "src": "14867:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$68",
                                  "typeString": "contract IERC20"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20_$68",
                                  "typeString": "contract IERC20"
                                }
                              ],
                              "id": 619,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "14859:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": "address"
                            },
                            "id": 621,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "14859:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 622,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "isContract",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 446,
                          "src": "14859:25:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$bound_to$_t_address_$",
                            "typeString": "function (address) view returns (bool)"
                          }
                        },
                        "id": 623,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "14859:27:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374",
                        "id": 624,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "14888:33:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f6ce7bfd656f35145dec774d6f7e67f4cba158373d2dd7a0f8273e232f86148d",
                          "typeString": "literal_string \"SafeERC20: call to non-contract\""
                        },
                        "value": "SafeERC20: call to non-contract"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f6ce7bfd656f35145dec774d6f7e67f4cba158373d2dd7a0f8273e232f86148d",
                          "typeString": "literal_string \"SafeERC20: call to non-contract\""
                        }
                      ],
                      "id": 618,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "14851:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 625,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "14851:71:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 626,
                  "nodeType": "ExpressionStatement",
                  "src": "14851:71:0"
                },
                {
                  "assignments": [
                    628,
                    630
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 628,
                      "name": "success",
                      "nodeType": "VariableDeclaration",
                      "scope": 659,
                      "src": "14993:12:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 627,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "14993:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 630,
                      "name": "returndata",
                      "nodeType": "VariableDeclaration",
                      "scope": 659,
                      "src": "15007:23:0",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 629,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "15007:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 637,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 635,
                        "name": "data",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 615,
                        "src": "15054:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 632,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 613,
                            "src": "15042:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$68",
                              "typeString": "contract IERC20"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_IERC20_$68",
                              "typeString": "contract IERC20"
                            }
                          ],
                          "id": 631,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "15034:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 633,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "15034:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "id": 634,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "call",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "15034:19: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": 636,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "15034:25:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                      "typeString": "tuple(bool,bytes memory)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "14992:67:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 639,
                        "name": "success",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 628,
                        "src": "15077:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564",
                        "id": 640,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "15086: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_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_47fb62c2c272651d2f0f342bac006756b8ba07f21cc5cb87e0fbb9d50c0c585b",
                          "typeString": "literal_string \"SafeERC20: low-level call failed\""
                        }
                      ],
                      "id": 638,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "15069:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 641,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "15069:52:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 642,
                  "nodeType": "ExpressionStatement",
                  "src": "15069:52:0"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 646,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 643,
                        "name": "returndata",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 630,
                        "src": "15136:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      "id": 644,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "15136:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 645,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "15156:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "15136:21:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 658,
                  "nodeType": "IfStatement",
                  "src": "15132:221:0",
                  "trueBody": {
                    "id": 657,
                    "nodeType": "Block",
                    "src": "15159:194:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 650,
                                  "name": "returndata",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 630,
                                  "src": "15276:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "components": [
                                    {
                                      "argumentTypes": null,
                                      "id": 651,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "15289:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_bool_$",
                                        "typeString": "type(bool)"
                                      },
                                      "typeName": "bool"
                                    }
                                  ],
                                  "id": 652,
                                  "isConstant": false,
                                  "isInlineArray": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "TupleExpression",
                                  "src": "15288: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": 648,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1547,
                                  "src": "15265:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 649,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "decode",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "15265:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                  "typeString": "function () pure"
                                }
                              },
                              "id": 653,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "15265:30:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564",
                              "id": 654,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "15297: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": 647,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              1563,
                              1564
                            ],
                            "referencedDeclaration": 1564,
                            "src": "15257:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 655,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15257:85:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 656,
                        "nodeType": "ExpressionStatement",
                        "src": "15257:85:0"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": "@dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\non 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": 660,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "callOptionalReturn",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 616,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 613,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 660,
                  "src": "14292:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$68",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 612,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 68,
                    "src": "14292:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$68",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 615,
                  "name": "data",
                  "nodeType": "VariableDeclaration",
                  "scope": 660,
                  "src": "14306:17:0",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 614,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "14306:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "14291:33:0"
            },
            "returnParameters": {
              "id": 617,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "14333:0:0"
            },
            "scope": 661,
            "src": "14264:1095:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "private"
          }
        ],
        "scope": 1546,
        "src": "12217:3144:0"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": "@dev Contract module that helps prevent reentrant calls to a function.\n * Inheriting from `ReentrancyGuard` will make the `nonReentrant` modifier\navailable, which can be aplied to functions to make sure there are no nested\n(reentrant) calls to them.\n * Note that because there is a single `nonReentrant` guard, functions marked as\n`nonReentrant` may not call one another. This can be worked around by making\nthose functions `private`, and then adding `external` `nonReentrant` entry\npoints to them.",
        "fullyImplemented": true,
        "id": 691,
        "linearizedBaseContracts": [
          691
        ],
        "name": "ReentrancyGuard",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 663,
            "name": "_guardCounter",
            "nodeType": "VariableDeclaration",
            "scope": 691,
            "src": "15997:29:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 662,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "15997:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 670,
              "nodeType": "Block",
              "src": "16057:173:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 668,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 666,
                      "name": "_guardCounter",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 663,
                      "src": "16206:13:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "31",
                      "id": 667,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "16222:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_1_by_1",
                        "typeString": "int_const 1"
                      },
                      "value": "1"
                    },
                    "src": "16206:17:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 669,
                  "nodeType": "ExpressionStatement",
                  "src": "16206:17:0"
                }
              ]
            },
            "documentation": null,
            "id": 671,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 664,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "16045:2:0"
            },
            "returnParameters": {
              "id": 665,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "16057:0:0"
            },
            "scope": 691,
            "src": "16033:197:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 689,
              "nodeType": "Block",
              "src": "16629:175:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 675,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 673,
                      "name": "_guardCounter",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 663,
                      "src": "16639:13:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "+=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "31",
                      "id": 674,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "16656:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_1_by_1",
                        "typeString": "int_const 1"
                      },
                      "value": "1"
                    },
                    "src": "16639:18:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 676,
                  "nodeType": "ExpressionStatement",
                  "src": "16639:18:0"
                },
                {
                  "assignments": [
                    678
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 678,
                      "name": "localCounter",
                      "nodeType": "VariableDeclaration",
                      "scope": 689,
                      "src": "16667:20:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 677,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "16667:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 680,
                  "initialValue": {
                    "argumentTypes": null,
                    "id": 679,
                    "name": "_guardCounter",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 663,
                    "src": "16690:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "16667:36:0"
                },
                {
                  "id": 681,
                  "nodeType": "PlaceholderStatement",
                  "src": "16713:1:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 685,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 683,
                          "name": "localCounter",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 678,
                          "src": "16732:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 684,
                          "name": "_guardCounter",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 663,
                          "src": "16748:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "16732:29:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5265656e7472616e637947756172643a207265656e7472616e742063616c6c",
                        "id": 686,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "16763: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": 682,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "16724:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 687,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16724:73:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 688,
                  "nodeType": "ExpressionStatement",
                  "src": "16724:73:0"
                }
              ]
            },
            "documentation": "@dev Prevents a contract from calling itself, directly or indirectly.\nCalling a `nonReentrant` function from another `nonReentrant`\nfunction is not supported. It is possible to prevent this from happening\nby making the `nonReentrant` function external, and make it call a\n`private` function that does the actual work.",
            "id": 690,
            "name": "nonReentrant",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 672,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "16626:2:0"
            },
            "src": "16605:199:0",
            "visibility": "internal"
          }
        ],
        "scope": 1546,
        "src": "15894:912:0"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "interface",
        "documentation": null,
        "fullyImplemented": false,
        "id": 742,
        "linearizedBaseContracts": [
          742
        ],
        "name": "IStakingRewards",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": null,
            "documentation": null,
            "id": 696,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "lastTimeRewardApplicable",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 692,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "16901:2:0"
            },
            "returnParameters": {
              "id": 695,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 694,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 696,
                  "src": "16927:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 693,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "16927:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "16926:9:0"
            },
            "scope": 742,
            "src": "16868:68:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "id": 701,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "rewardPerToken",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 697,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "16965:2:0"
            },
            "returnParameters": {
              "id": 700,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 699,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 701,
                  "src": "16991:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 698,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "16991:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "16990:9:0"
            },
            "scope": 742,
            "src": "16942:58:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "id": 708,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "earned",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 704,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 703,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 708,
                  "src": "17022:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 702,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "17022:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "17021:17:0"
            },
            "returnParameters": {
              "id": 707,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 706,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 708,
                  "src": "17062:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 705,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "17062:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "17061:9:0"
            },
            "scope": 742,
            "src": "17006:65:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "id": 713,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "getRewardForDuration",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 709,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17106:2:0"
            },
            "returnParameters": {
              "id": 712,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 711,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 713,
                  "src": "17132:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 710,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "17132:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "17131:9:0"
            },
            "scope": 742,
            "src": "17077:64:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "id": 718,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "totalSupply",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 714,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17167:2:0"
            },
            "returnParameters": {
              "id": 717,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 716,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 718,
                  "src": "17193:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 715,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "17193:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "17192:9:0"
            },
            "scope": 742,
            "src": "17147:55:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "id": 725,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "balanceOf",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 721,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 720,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 725,
                  "src": "17227:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 719,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "17227:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "17226:17:0"
            },
            "returnParameters": {
              "id": 724,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 723,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 725,
                  "src": "17267:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 722,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "17267:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "17266:9:0"
            },
            "scope": 742,
            "src": "17208:68:0",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "id": 730,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "stake",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 728,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 727,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 730,
                  "src": "17314:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 726,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "17314:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "17313:16:0"
            },
            "returnParameters": {
              "id": 729,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17338:0:0"
            },
            "scope": 742,
            "src": "17299:40:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "id": 735,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "withdraw",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 733,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 732,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 735,
                  "src": "17363:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 731,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "17363:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "17362:16:0"
            },
            "returnParameters": {
              "id": 734,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17387:0:0"
            },
            "scope": 742,
            "src": "17345:43:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "id": 738,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "getReward",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 736,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17412:2:0"
            },
            "returnParameters": {
              "id": 737,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17423:0:0"
            },
            "scope": 742,
            "src": "17394:30:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "id": 741,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "exit",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 739,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17443:2:0"
            },
            "returnParameters": {
              "id": 740,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17454:0:0"
            },
            "scope": 742,
            "src": "17430:25:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          }
        ],
        "scope": 1546,
        "src": "16823:634:0"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": false,
        "id": 762,
        "linearizedBaseContracts": [
          762
        ],
        "name": "RewardsDistributionRecipient",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 744,
            "name": "rewardsDistribution",
            "nodeType": "VariableDeclaration",
            "scope": 762,
            "src": "17503:34:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 743,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "17503:7:0",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "body": null,
            "documentation": null,
            "id": 749,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "notifyRewardAmount",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 747,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 746,
                  "name": "reward",
                  "nodeType": "VariableDeclaration",
                  "scope": 749,
                  "src": "17572:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 745,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "17572:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "17571:16:0"
            },
            "returnParameters": {
              "id": 748,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17596:0:0"
            },
            "scope": 762,
            "src": "17544:53:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": {
              "id": 760,
              "nodeType": "Block",
              "src": "17638:116:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 755,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 752,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1560,
                            "src": "17656:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 753,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "17656:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 754,
                          "name": "rewardsDistribution",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 744,
                          "src": "17670:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "17656:33:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "43616c6c6572206973206e6f742052657761726473446973747269627574696f6e20636f6e7472616374",
                        "id": 756,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "17691:44:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_d50b095422f4cbfcb4c90fbd4d55aaf0967bf1d90e94bb6a1ae9fc4ee7e733de",
                          "typeString": "literal_string \"Caller is not RewardsDistribution contract\""
                        },
                        "value": "Caller is not RewardsDistribution contract"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_d50b095422f4cbfcb4c90fbd4d55aaf0967bf1d90e94bb6a1ae9fc4ee7e733de",
                          "typeString": "literal_string \"Caller is not RewardsDistribution contract\""
                        }
                      ],
                      "id": 751,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "17648:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 757,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "17648:88:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 758,
                  "nodeType": "ExpressionStatement",
                  "src": "17648:88:0"
                },
                {
                  "id": 759,
                  "nodeType": "PlaceholderStatement",
                  "src": "17746:1:0"
                }
              ]
            },
            "documentation": null,
            "id": 761,
            "name": "onlyRewardsDistribution",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 750,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17635:2:0"
            },
            "src": "17603:151:0",
            "visibility": "internal"
          }
        ],
        "scope": 1546,
        "src": "17459:297:0"
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 763,
              "name": "IStakingRewards",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 742,
              "src": "17785:15:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IStakingRewards_$742",
                "typeString": "contract IStakingRewards"
              }
            },
            "id": 764,
            "nodeType": "InheritanceSpecifier",
            "src": "17785:15:0"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 765,
              "name": "RewardsDistributionRecipient",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 762,
              "src": "17802:28:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_RewardsDistributionRecipient_$762",
                "typeString": "contract RewardsDistributionRecipient"
              }
            },
            "id": 766,
            "nodeType": "InheritanceSpecifier",
            "src": "17802:28:0"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 767,
              "name": "ReentrancyGuard",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 691,
              "src": "17832:15:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ReentrancyGuard_$691",
                "typeString": "contract ReentrancyGuard"
              }
            },
            "id": 768,
            "nodeType": "InheritanceSpecifier",
            "src": "17832:15:0"
          }
        ],
        "contractDependencies": [
          691,
          742,
          762
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 1336,
        "linearizedBaseContracts": [
          1336,
          691,
          762,
          742
        ],
        "name": "StakingRewards",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 771,
            "libraryName": {
              "contractScope": null,
              "id": 769,
              "name": "SafeMath",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 308,
              "src": "17860:8:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMath_$308",
                "typeString": "library SafeMath"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "17854:27:0",
            "typeName": {
              "id": 770,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "17873:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "id": 774,
            "libraryName": {
              "contractScope": null,
              "id": 772,
              "name": "SafeERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 661,
              "src": "17892:9:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeERC20_$661",
                "typeString": "library SafeERC20"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "17886:27:0",
            "typeName": {
              "contractScope": null,
              "id": 773,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 68,
              "src": "17906:6:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$68",
                "typeString": "contract IERC20"
              }
            }
          },
          {
            "constant": false,
            "id": 776,
            "name": "rewardsToken",
            "nodeType": "VariableDeclaration",
            "scope": 1336,
            "src": "17968:26:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IERC20_$68",
              "typeString": "contract IERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 775,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 68,
              "src": "17968:6:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$68",
                "typeString": "contract IERC20"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 778,
            "name": "stakingToken",
            "nodeType": "VariableDeclaration",
            "scope": 1336,
            "src": "18000:26:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IERC20_$68",
              "typeString": "contract IERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 777,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 68,
              "src": "18000:6:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$68",
                "typeString": "contract IERC20"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 781,
            "name": "periodFinish",
            "nodeType": "VariableDeclaration",
            "scope": 1336,
            "src": "18032:31:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 779,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "18032:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30",
              "id": 780,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "18062:1:0",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 784,
            "name": "rewardRate",
            "nodeType": "VariableDeclaration",
            "scope": 1336,
            "src": "18069:29:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 782,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "18069:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30",
              "id": 783,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "18097:1:0",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 786,
            "name": "rewardsDuration",
            "nodeType": "VariableDeclaration",
            "scope": 1336,
            "src": "18104:30:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 785,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "18104:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 788,
            "name": "lastUpdateTime",
            "nodeType": "VariableDeclaration",
            "scope": 1336,
            "src": "18140:29:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 787,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "18140:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 790,
            "name": "rewardPerTokenStored",
            "nodeType": "VariableDeclaration",
            "scope": 1336,
            "src": "18175:35:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 789,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "18175:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 794,
            "name": "userRewardPerTokenPaid",
            "nodeType": "VariableDeclaration",
            "scope": 1336,
            "src": "18217:57:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
              "typeString": "mapping(address => uint256)"
            },
            "typeName": {
              "id": 793,
              "keyType": {
                "id": 791,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "18225:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "18217:27:0",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                "typeString": "mapping(address => uint256)"
              },
              "valueType": {
                "id": 792,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "18236:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 798,
            "name": "rewards",
            "nodeType": "VariableDeclaration",
            "scope": 1336,
            "src": "18280:42:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
              "typeString": "mapping(address => uint256)"
            },
            "typeName": {
              "id": 797,
              "keyType": {
                "id": 795,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "18288:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "18280:27:0",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                "typeString": "mapping(address => uint256)"
              },
              "valueType": {
                "id": 796,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "18299:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 800,
            "name": "_totalSupply",
            "nodeType": "VariableDeclaration",
            "scope": 1336,
            "src": "18329:28:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 799,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "18329:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 804,
            "name": "_balances",
            "nodeType": "VariableDeclaration",
            "scope": 1336,
            "src": "18363:45:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
              "typeString": "mapping(address => uint256)"
            },
            "typeName": {
              "id": 803,
              "keyType": {
                "id": 801,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "18371:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "18363:27:0",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                "typeString": "mapping(address => uint256)"
              },
              "valueType": {
                "id": 802,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "18382:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 835,
              "nodeType": "Block",
              "src": "18619:195:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 819,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 815,
                      "name": "rewardsToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 776,
                      "src": "18629:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$68",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 817,
                          "name": "_rewardsToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 808,
                          "src": "18651:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 816,
                        "name": "IERC20",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 68,
                        "src": "18644:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_IERC20_$68_$",
                          "typeString": "type(contract IERC20)"
                        }
                      },
                      "id": 818,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "18644:21:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$68",
                        "typeString": "contract IERC20"
                      }
                    },
                    "src": "18629:36:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$68",
                      "typeString": "contract IERC20"
                    }
                  },
                  "id": 820,
                  "nodeType": "ExpressionStatement",
                  "src": "18629:36:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 825,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 821,
                      "name": "stakingToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 778,
                      "src": "18675:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$68",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 823,
                          "name": "_stakingToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 810,
                          "src": "18697:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 822,
                        "name": "IERC20",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 68,
                        "src": "18690:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_IERC20_$68_$",
                          "typeString": "type(contract IERC20)"
                        }
                      },
                      "id": 824,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "18690:21:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$68",
                        "typeString": "contract IERC20"
                      }
                    },
                    "src": "18675:36:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$68",
                      "typeString": "contract IERC20"
                    }
                  },
                  "id": 826,
                  "nodeType": "ExpressionStatement",
                  "src": "18675:36:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 829,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 827,
                      "name": "rewardsDistribution",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 744,
                      "src": "18721:19:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 828,
                      "name": "_rewardsDistribution",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 806,
                      "src": "18743:20:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "18721:42:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 830,
                  "nodeType": "ExpressionStatement",
                  "src": "18721:42:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 833,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 831,
                      "name": "rewardsDuration",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 786,
                      "src": "18773:15:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 832,
                      "name": "_rewardsDuration",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 812,
                      "src": "18791:16:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "18773:34:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 834,
                  "nodeType": "ExpressionStatement",
                  "src": "18773:34:0"
                }
              ]
            },
            "documentation": null,
            "id": 836,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 813,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 806,
                  "name": "_rewardsDistribution",
                  "nodeType": "VariableDeclaration",
                  "scope": 836,
                  "src": "18481:28:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 805,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "18481:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 808,
                  "name": "_rewardsToken",
                  "nodeType": "VariableDeclaration",
                  "scope": 836,
                  "src": "18519:21:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 807,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "18519:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 810,
                  "name": "_stakingToken",
                  "nodeType": "VariableDeclaration",
                  "scope": 836,
                  "src": "18550:21:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 809,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "18550:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 812,
                  "name": "_rewardsDuration",
                  "nodeType": "VariableDeclaration",
                  "scope": 836,
                  "src": "18581:24:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 811,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "18581:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "18471:140:0"
            },
            "returnParameters": {
              "id": 814,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "18619:0:0"
            },
            "scope": 1336,
            "src": "18460:354:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 843,
              "nodeType": "Block",
              "src": "18914:36:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 841,
                    "name": "_totalSupply",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 800,
                    "src": "18931:12:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 840,
                  "id": 842,
                  "nodeType": "Return",
                  "src": "18924:19:0"
                }
              ]
            },
            "documentation": null,
            "id": 844,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "totalSupply",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 837,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "18879:2:0"
            },
            "returnParameters": {
              "id": 840,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 839,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 844,
                  "src": "18905:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 838,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "18905:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "18904:9:0"
            },
            "scope": 1336,
            "src": "18859:91:0",
            "stateMutability": "view",
            "superFunction": 718,
            "visibility": "external"
          },
          {
            "body": {
              "id": 855,
              "nodeType": "Block",
              "src": "19024:42:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 851,
                      "name": "_balances",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 804,
                      "src": "19041:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                        "typeString": "mapping(address => uint256)"
                      }
                    },
                    "id": 853,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 852,
                      "name": "account",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 846,
                      "src": "19051:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "19041:18:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 850,
                  "id": 854,
                  "nodeType": "Return",
                  "src": "19034:25:0"
                }
              ]
            },
            "documentation": null,
            "id": 856,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "balanceOf",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 847,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 846,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 856,
                  "src": "18975:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 845,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "18975:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "18974:17:0"
            },
            "returnParameters": {
              "id": 850,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 849,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 856,
                  "src": "19015:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 848,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "19015:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "19014:9:0"
            },
            "scope": 1336,
            "src": "18956:110:0",
            "stateMutability": "view",
            "superFunction": 725,
            "visibility": "external"
          },
          {
            "body": {
              "id": 868,
              "nodeType": "Block",
              "src": "19138:63:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 863,
                          "name": "block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1550,
                          "src": "19164:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_block",
                            "typeString": "block"
                          }
                        },
                        "id": 864,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "timestamp",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "19164:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 865,
                        "name": "periodFinish",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 781,
                        "src": "19181:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 861,
                        "name": "Math",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 375,
                        "src": "19155:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_Math_$375_$",
                          "typeString": "type(library Math)"
                        }
                      },
                      "id": 862,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "min",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 342,
                      "src": "19155:8:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 866,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "19155:39:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 860,
                  "id": 867,
                  "nodeType": "Return",
                  "src": "19148:46:0"
                }
              ]
            },
            "documentation": null,
            "id": 869,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "lastTimeRewardApplicable",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 857,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "19105:2:0"
            },
            "returnParameters": {
              "id": 860,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 859,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 869,
                  "src": "19129:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 858,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "19129:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "19128:9:0"
            },
            "scope": 1336,
            "src": "19072:129:0",
            "stateMutability": "view",
            "superFunction": 696,
            "visibility": "public"
          },
          {
            "body": {
              "id": 899,
              "nodeType": "Block",
              "src": "19263:266:0",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 876,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 874,
                      "name": "_totalSupply",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 800,
                      "src": "19277:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 875,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "19293:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "19277:17:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 880,
                  "nodeType": "IfStatement",
                  "src": "19273:75:0",
                  "trueBody": {
                    "id": 879,
                    "nodeType": "Block",
                    "src": "19296:52:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 877,
                          "name": "rewardPerTokenStored",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 790,
                          "src": "19317:20:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 873,
                        "id": 878,
                        "nodeType": "Return",
                        "src": "19310:27:0"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 895,
                            "name": "_totalSupply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 800,
                            "src": "19495:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "31653138",
                                "id": 892,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "19485: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": 889,
                                    "name": "rewardRate",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 784,
                                    "src": "19469:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 886,
                                        "name": "lastUpdateTime",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 788,
                                        "src": "19449:14:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "arguments": [],
                                        "expression": {
                                          "argumentTypes": [],
                                          "id": 883,
                                          "name": "lastTimeRewardApplicable",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 869,
                                          "src": "19418:24:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                            "typeString": "function () view returns (uint256)"
                                          }
                                        },
                                        "id": 884,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "19418:26:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 885,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "sub",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 227,
                                      "src": "19418:30: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": 887,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "19418:46:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 888,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "mul",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 261,
                                  "src": "19418:50: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": 890,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "19418:62:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 891,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "mul",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 261,
                              "src": "19418:66: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": 893,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "19418:72:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 894,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "div",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 286,
                          "src": "19418:76: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": 896,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "19418:90:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 881,
                        "name": "rewardPerTokenStored",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 790,
                        "src": "19376:20:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 882,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "add",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 202,
                      "src": "19376: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": 897,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "19376:146:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 873,
                  "id": 898,
                  "nodeType": "Return",
                  "src": "19357:165:0"
                }
              ]
            },
            "documentation": null,
            "id": 900,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "rewardPerToken",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 870,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "19230:2:0"
            },
            "returnParameters": {
              "id": 873,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 872,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 900,
                  "src": "19254:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 871,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "19254:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "19253:9:0"
            },
            "scope": 1336,
            "src": "19207:322:0",
            "stateMutability": "view",
            "superFunction": 701,
            "visibility": "public"
          },
          {
            "body": {
              "id": 928,
              "nodeType": "Block",
              "src": "19598:133:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 923,
                          "name": "rewards",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 798,
                          "src": "19707:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                            "typeString": "mapping(address => uint256)"
                          }
                        },
                        "id": 925,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 924,
                          "name": "account",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 902,
                          "src": "19715:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "19707:16:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "hexValue": "31653138",
                            "id": 920,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "19697: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": 914,
                                      "name": "userRewardPerTokenPaid",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 794,
                                      "src": "19659:22:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                        "typeString": "mapping(address => uint256)"
                                      }
                                    },
                                    "id": 916,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 915,
                                      "name": "account",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 902,
                                      "src": "19682:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "19659:31:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "id": 911,
                                      "name": "rewardPerToken",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 900,
                                      "src": "19638:14:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                        "typeString": "function () view returns (uint256)"
                                      }
                                    },
                                    "id": 912,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "19638:16:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 913,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sub",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 227,
                                  "src": "19638: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": 917,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "19638:53:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 907,
                                  "name": "_balances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 804,
                                  "src": "19615:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 909,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 908,
                                  "name": "account",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 902,
                                  "src": "19625:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "19615:18:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 910,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "mul",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 261,
                              "src": "19615: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": 918,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "19615:77:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 919,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "div",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 286,
                          "src": "19615:81: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": 921,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "19615:87:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 922,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "add",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 202,
                      "src": "19615:91: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": 926,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "19615:109:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 906,
                  "id": 927,
                  "nodeType": "Return",
                  "src": "19608:116:0"
                }
              ]
            },
            "documentation": null,
            "id": 929,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "earned",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 903,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 902,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 929,
                  "src": "19551:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 901,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "19551:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "19550:17:0"
            },
            "returnParameters": {
              "id": 906,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 905,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 929,
                  "src": "19589:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 904,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "19589:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "19588:9:0"
            },
            "scope": 1336,
            "src": "19535:196:0",
            "stateMutability": "view",
            "superFunction": 708,
            "visibility": "public"
          },
          {
            "body": {
              "id": 939,
              "nodeType": "Block",
              "src": "19801:55:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 936,
                        "name": "rewardsDuration",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 786,
                        "src": "19833:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 934,
                        "name": "rewardRate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 784,
                        "src": "19818:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 935,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "mul",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 261,
                      "src": "19818: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": 937,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "19818:31:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 933,
                  "id": 938,
                  "nodeType": "Return",
                  "src": "19811:38:0"
                }
              ]
            },
            "documentation": null,
            "id": 940,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getRewardForDuration",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 930,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "19766:2:0"
            },
            "returnParameters": {
              "id": 933,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 932,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 940,
                  "src": "19792:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 931,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "19792:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "19791:9:0"
            },
            "scope": 1336,
            "src": "19737:119:0",
            "stateMutability": "view",
            "superFunction": 713,
            "visibility": "external"
          },
          {
            "body": {
              "id": 1021,
              "nodeType": "Block",
              "src": "20048:414:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 962,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 960,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 942,
                          "src": "20066:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 961,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "20075:1:0",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "20066:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "43616e6e6f74207374616b652030",
                        "id": 963,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "20078:16:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_2972ce884b95fc24c703b7f04fae79e4ca7287e77fa26ed09d1faa4263e887ab",
                          "typeString": "literal_string \"Cannot stake 0\""
                        },
                        "value": "Cannot stake 0"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_2972ce884b95fc24c703b7f04fae79e4ca7287e77fa26ed09d1faa4263e887ab",
                          "typeString": "literal_string \"Cannot stake 0\""
                        }
                      ],
                      "id": 959,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "20058:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 964,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "20058:37:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 965,
                  "nodeType": "ExpressionStatement",
                  "src": "20058:37:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 971,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 966,
                      "name": "_totalSupply",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 800,
                      "src": "20105:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 969,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 942,
                          "src": "20137:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 967,
                          "name": "_totalSupply",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 800,
                          "src": "20120:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 968,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 202,
                        "src": "20120: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": 970,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "20120:24:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "20105:39:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 972,
                  "nodeType": "ExpressionStatement",
                  "src": "20105:39:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 984,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 973,
                        "name": "_balances",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 804,
                        "src": "20154:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                          "typeString": "mapping(address => uint256)"
                        }
                      },
                      "id": 976,
                      "indexExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 974,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1560,
                          "src": "20164:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 975,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "20164:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "20154:21:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 982,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 942,
                          "src": "20204:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 977,
                            "name": "_balances",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 804,
                            "src": "20178:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 980,
                          "indexExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 978,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1560,
                              "src": "20188:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 979,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "20188:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "20178:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 981,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 202,
                        "src": "20178: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": 983,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "20178:33:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "20154:57:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 985,
                  "nodeType": "ExpressionStatement",
                  "src": "20154:57:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 992,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1560,
                          "src": "20286:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 993,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "20286:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 995,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1594,
                            "src": "20306:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_StakingRewards_$1336",
                              "typeString": "contract StakingRewards"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_StakingRewards_$1336",
                              "typeString": "contract StakingRewards"
                            }
                          ],
                          "id": 994,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "20298:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 996,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "20298:13:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 997,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 942,
                        "src": "20313:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 998,
                        "name": "deadline",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 944,
                        "src": "20321:8:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 999,
                        "name": "v",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 946,
                        "src": "20331:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 1000,
                        "name": "r",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 948,
                        "src": "20334:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 1001,
                        "name": "s",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 950,
                        "src": "20337:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 988,
                                "name": "stakingToken",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 778,
                                "src": "20264:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$68",
                                  "typeString": "contract IERC20"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20_$68",
                                  "typeString": "contract IERC20"
                                }
                              ],
                              "id": 987,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "20256:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": "address"
                            },
                            "id": 989,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "20256:21:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 986,
                          "name": "IUniswapV2ERC20",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1354,
                          "src": "20240:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IUniswapV2ERC20_$1354_$",
                            "typeString": "type(contract IUniswapV2ERC20)"
                          }
                        },
                        "id": 990,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "20240:38:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IUniswapV2ERC20_$1354",
                          "typeString": "contract IUniswapV2ERC20"
                        }
                      },
                      "id": 991,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "permit",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1353,
                      "src": "20240:45:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$__$",
                        "typeString": "function (address,address,uint256,uint256,uint8,bytes32,bytes32) external"
                      }
                    },
                    "id": 1002,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "20240:99:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1003,
                  "nodeType": "ExpressionStatement",
                  "src": "20240:99:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 1007,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1560,
                          "src": "20380:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1008,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "20380:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 1010,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1594,
                            "src": "20400:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_StakingRewards_$1336",
                              "typeString": "contract StakingRewards"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_StakingRewards_$1336",
                              "typeString": "contract StakingRewards"
                            }
                          ],
                          "id": 1009,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "20392:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 1011,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "20392:13:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 1012,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 942,
                        "src": "20407:6: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": 1004,
                        "name": "stakingToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 778,
                        "src": "20350:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$68",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 1006,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "safeTransferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 500,
                      "src": "20350:29:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$68_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$68_$",
                        "typeString": "function (contract IERC20,address,address,uint256)"
                      }
                    },
                    "id": 1013,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "20350:64:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1014,
                  "nodeType": "ExpressionStatement",
                  "src": "20350:64:0"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 1016,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1560,
                          "src": "20436:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1017,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "20436:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 1018,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 942,
                        "src": "20448:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1015,
                      "name": "Staked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1323,
                      "src": "20429:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 1019,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "20429:26:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1020,
                  "nodeType": "EmitStatement",
                  "src": "20424:31:0"
                }
              ]
            },
            "documentation": null,
            "id": 1022,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 953,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 952,
                  "name": "nonReentrant",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 690,
                  "src": "20010:12:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "20010:12:0"
              },
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "id": 955,
                      "name": "msg",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1560,
                      "src": "20036:3:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_magic_message",
                        "typeString": "msg"
                      }
                    },
                    "id": 956,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "sender",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": null,
                    "src": "20036:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  }
                ],
                "id": 957,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 954,
                  "name": "updateReward",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1313,
                  "src": "20023:12:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$_t_address_$",
                    "typeString": "modifier (address)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "20023:24:0"
              }
            ],
            "name": "stakeWithPermit",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 951,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 942,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 1022,
                  "src": "19939:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 941,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "19939:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 944,
                  "name": "deadline",
                  "nodeType": "VariableDeclaration",
                  "scope": 1022,
                  "src": "19955:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 943,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "19955:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 946,
                  "name": "v",
                  "nodeType": "VariableDeclaration",
                  "scope": 1022,
                  "src": "19970:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 945,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "19970:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 948,
                  "name": "r",
                  "nodeType": "VariableDeclaration",
                  "scope": 1022,
                  "src": "19979:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 947,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "19979:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 950,
                  "name": "s",
                  "nodeType": "VariableDeclaration",
                  "scope": 1022,
                  "src": "19990:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 949,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "19990:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "19938:62:0"
            },
            "returnParameters": {
              "id": 958,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "20048:0:0"
            },
            "scope": 1336,
            "src": "19914:548:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": {
              "id": 1077,
              "nodeType": "Block",
              "src": "20546:285:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 1036,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 1034,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1024,
                          "src": "20564:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 1035,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "20573:1:0",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "20564:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "43616e6e6f74207374616b652030",
                        "id": 1037,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "20576:16:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_2972ce884b95fc24c703b7f04fae79e4ca7287e77fa26ed09d1faa4263e887ab",
                          "typeString": "literal_string \"Cannot stake 0\""
                        },
                        "value": "Cannot stake 0"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_2972ce884b95fc24c703b7f04fae79e4ca7287e77fa26ed09d1faa4263e887ab",
                          "typeString": "literal_string \"Cannot stake 0\""
                        }
                      ],
                      "id": 1033,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "20556:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 1038,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "20556:37:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1039,
                  "nodeType": "ExpressionStatement",
                  "src": "20556:37:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 1045,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 1040,
                      "name": "_totalSupply",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 800,
                      "src": "20603:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 1043,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1024,
                          "src": "20635:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 1041,
                          "name": "_totalSupply",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 800,
                          "src": "20618:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1042,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 202,
                        "src": "20618: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": 1044,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "20618:24:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "20603:39:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1046,
                  "nodeType": "ExpressionStatement",
                  "src": "20603:39:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 1058,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 1047,
                        "name": "_balances",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 804,
                        "src": "20652:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                          "typeString": "mapping(address => uint256)"
                        }
                      },
                      "id": 1050,
                      "indexExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 1048,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1560,
                          "src": "20662:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1049,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "20662:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "20652:21:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 1056,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1024,
                          "src": "20702:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 1051,
                            "name": "_balances",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 804,
                            "src": "20676:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 1054,
                          "indexExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1052,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1560,
                              "src": "20686:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 1053,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "20686:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "20676:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1055,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 202,
                        "src": "20676: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": 1057,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "20676:33:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "20652:57:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1059,
                  "nodeType": "ExpressionStatement",
                  "src": "20652:57:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 1063,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1560,
                          "src": "20749:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1064,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "20749:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 1066,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1594,
                            "src": "20769:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_StakingRewards_$1336",
                              "typeString": "contract StakingRewards"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_StakingRewards_$1336",
                              "typeString": "contract StakingRewards"
                            }
                          ],
                          "id": 1065,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "20761:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 1067,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "20761:13:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 1068,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1024,
                        "src": "20776:6: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": 1060,
                        "name": "stakingToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 778,
                        "src": "20719:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$68",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 1062,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "safeTransferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 500,
                      "src": "20719:29:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$68_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$68_$",
                        "typeString": "function (contract IERC20,address,address,uint256)"
                      }
                    },
                    "id": 1069,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "20719:64:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1070,
                  "nodeType": "ExpressionStatement",
                  "src": "20719:64:0"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 1072,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1560,
                          "src": "20805:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1073,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "20805:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 1074,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1024,
                        "src": "20817:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1071,
                      "name": "Staked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1323,
                      "src": "20798:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 1075,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "20798:26:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1076,
                  "nodeType": "EmitStatement",
                  "src": "20793:31:0"
                }
              ]
            },
            "documentation": null,
            "id": 1078,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 1027,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 1026,
                  "name": "nonReentrant",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 690,
                  "src": "20508:12:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "20508:12:0"
              },
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "id": 1029,
                      "name": "msg",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1560,
                      "src": "20534:3:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_magic_message",
                        "typeString": "msg"
                      }
                    },
                    "id": 1030,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "sender",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": null,
                    "src": "20534:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  }
                ],
                "id": 1031,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 1028,
                  "name": "updateReward",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1313,
                  "src": "20521:12:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$_t_address_$",
                    "typeString": "modifier (address)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "20521:24:0"
              }
            ],
            "name": "stake",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1025,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1024,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 1078,
                  "src": "20483:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1023,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "20483:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "20482:16:0"
            },
            "returnParameters": {
              "id": 1032,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "20546:0:0"
            },
            "scope": 1336,
            "src": "20468:363:0",
            "stateMutability": "nonpayable",
            "superFunction": 730,
            "visibility": "external"
          },
          {
            "body": {
              "id": 1130,
              "nodeType": "Block",
              "src": "20916:272:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 1092,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 1090,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1080,
                          "src": "20934:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 1091,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "20943:1:0",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "20934:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "43616e6e6f742077697468647261772030",
                        "id": 1093,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "20946:19:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_8d85b8e7f4404d04d93e8d532ad219ceeba0becfbc18622bad46b31e08b1f0b0",
                          "typeString": "literal_string \"Cannot withdraw 0\""
                        },
                        "value": "Cannot withdraw 0"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_8d85b8e7f4404d04d93e8d532ad219ceeba0becfbc18622bad46b31e08b1f0b0",
                          "typeString": "literal_string \"Cannot withdraw 0\""
                        }
                      ],
                      "id": 1089,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "20926:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 1094,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "20926:40:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1095,
                  "nodeType": "ExpressionStatement",
                  "src": "20926:40:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 1101,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 1096,
                      "name": "_totalSupply",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 800,
                      "src": "20976:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 1099,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1080,
                          "src": "21008:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 1097,
                          "name": "_totalSupply",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 800,
                          "src": "20991:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1098,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sub",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 227,
                        "src": "20991: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": 1100,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "20991:24:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "20976:39:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1102,
                  "nodeType": "ExpressionStatement",
                  "src": "20976:39:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 1114,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 1103,
                        "name": "_balances",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 804,
                        "src": "21025:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                          "typeString": "mapping(address => uint256)"
                        }
                      },
                      "id": 1106,
                      "indexExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 1104,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1560,
                          "src": "21035:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1105,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "21035:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "21025:21:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 1112,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1080,
                          "src": "21075:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 1107,
                            "name": "_balances",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 804,
                            "src": "21049:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 1110,
                          "indexExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1108,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1560,
                              "src": "21059:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 1109,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "21059:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "21049:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1111,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sub",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 227,
                        "src": "21049: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": 1113,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "21049:33:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "21025:57:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1115,
                  "nodeType": "ExpressionStatement",
                  "src": "21025:57:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 1119,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1560,
                          "src": "21118:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1120,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "21118:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 1121,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1080,
                        "src": "21130: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,
                        "id": 1116,
                        "name": "stakingToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 778,
                        "src": "21092:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$68",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 1118,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "safeTransfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 475,
                      "src": "21092:25:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$68_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$68_$",
                        "typeString": "function (contract IERC20,address,uint256)"
                      }
                    },
                    "id": 1122,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "21092:45:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1123,
                  "nodeType": "ExpressionStatement",
                  "src": "21092:45:0"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 1125,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1560,
                          "src": "21162:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1126,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "21162:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 1127,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1080,
                        "src": "21174:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1124,
                      "name": "Withdrawn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1329,
                      "src": "21152:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 1128,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "21152:29:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1129,
                  "nodeType": "EmitStatement",
                  "src": "21147:34:0"
                }
              ]
            },
            "documentation": null,
            "id": 1131,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 1083,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 1082,
                  "name": "nonReentrant",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 690,
                  "src": "20878:12:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "20878:12:0"
              },
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "id": 1085,
                      "name": "msg",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1560,
                      "src": "20904:3:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_magic_message",
                        "typeString": "msg"
                      }
                    },
                    "id": 1086,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "sender",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": null,
                    "src": "20904:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  }
                ],
                "id": 1087,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 1084,
                  "name": "updateReward",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1313,
                  "src": "20891:12:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$_t_address_$",
                    "typeString": "modifier (address)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "20891:24:0"
              }
            ],
            "name": "withdraw",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1081,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1080,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 1131,
                  "src": "20855:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1079,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "20855:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "20854:16:0"
            },
            "returnParameters": {
              "id": 1088,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "20916:0:0"
            },
            "scope": 1336,
            "src": "20837:351:0",
            "stateMutability": "nonpayable",
            "superFunction": 735,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1173,
              "nodeType": "Block",
              "src": "21260:234:0",
              "statements": [
                {
                  "assignments": [
                    1141
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1141,
                      "name": "reward",
                      "nodeType": "VariableDeclaration",
                      "scope": 1173,
                      "src": "21270:14:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1140,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "21270:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 1146,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 1142,
                      "name": "rewards",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 798,
                      "src": "21287:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                        "typeString": "mapping(address => uint256)"
                      }
                    },
                    "id": 1145,
                    "indexExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 1143,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1560,
                        "src": "21295:3:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 1144,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "21295:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "21287:19:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "21270:36:0"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1149,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 1147,
                      "name": "reward",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1141,
                      "src": "21320:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 1148,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "21329:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "21320:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 1172,
                  "nodeType": "IfStatement",
                  "src": "21316:172:0",
                  "trueBody": {
                    "id": 1171,
                    "nodeType": "Block",
                    "src": "21332:156:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1155,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 1150,
                              "name": "rewards",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 798,
                              "src": "21346:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 1153,
                            "indexExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 1151,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1560,
                                "src": "21354:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 1152,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "21354:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "21346:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 1154,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "21368:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "21346:23:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1156,
                        "nodeType": "ExpressionStatement",
                        "src": "21346:23:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 1160,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1560,
                                "src": "21409:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 1161,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "21409:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1162,
                              "name": "reward",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1141,
                              "src": "21421: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,
                              "id": 1157,
                              "name": "rewardsToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 776,
                              "src": "21383:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$68",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 1159,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeTransfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 475,
                            "src": "21383:25:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$68_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$68_$",
                              "typeString": "function (contract IERC20,address,uint256)"
                            }
                          },
                          "id": 1163,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21383:45:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1164,
                        "nodeType": "ExpressionStatement",
                        "src": "21383:45:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 1166,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1560,
                                "src": "21458:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 1167,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "21458:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1168,
                              "name": "reward",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1141,
                              "src": "21470:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1165,
                            "name": "RewardPaid",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1335,
                            "src": "21447:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 1169,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21447:30:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1170,
                        "nodeType": "EmitStatement",
                        "src": "21442:35:0"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "id": 1174,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 1134,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 1133,
                  "name": "nonReentrant",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 690,
                  "src": "21222:12:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "21222:12:0"
              },
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "id": 1136,
                      "name": "msg",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1560,
                      "src": "21248:3:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_magic_message",
                        "typeString": "msg"
                      }
                    },
                    "id": 1137,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "sender",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": null,
                    "src": "21248:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  }
                ],
                "id": 1138,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 1135,
                  "name": "updateReward",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1313,
                  "src": "21235:12:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$_t_address_$",
                    "typeString": "modifier (address)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "21235:24:0"
              }
            ],
            "name": "getReward",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1132,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "21212:2:0"
            },
            "returnParameters": {
              "id": 1139,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "21260:0:0"
            },
            "scope": 1336,
            "src": "21194:300:0",
            "stateMutability": "nonpayable",
            "superFunction": 738,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1187,
              "nodeType": "Block",
              "src": "21525:69:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 1178,
                          "name": "_balances",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 804,
                          "src": "21544:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                            "typeString": "mapping(address => uint256)"
                          }
                        },
                        "id": 1181,
                        "indexExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 1179,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1560,
                            "src": "21554:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 1180,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "21554:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "21544:21:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1177,
                      "name": "withdraw",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1131,
                      "src": "21535:8:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                        "typeString": "function (uint256)"
                      }
                    },
                    "id": 1182,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "21535:31:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1183,
                  "nodeType": "ExpressionStatement",
                  "src": "21535:31:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 1184,
                      "name": "getReward",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1174,
                      "src": "21576:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 1185,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "21576:11:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1186,
                  "nodeType": "ExpressionStatement",
                  "src": "21576:11:0"
                }
              ]
            },
            "documentation": null,
            "id": 1188,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "exit",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1175,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "21513:2:0"
            },
            "returnParameters": {
              "id": 1176,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "21525:0:0"
            },
            "scope": 1336,
            "src": "21500:94:0",
            "stateMutability": "nonpayable",
            "superFunction": 741,
            "visibility": "external"
          },
          {
            "body": {
              "id": 1275,
              "nodeType": "Block",
              "src": "21756:962:0",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1203,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 1200,
                        "name": "block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1550,
                        "src": "21770:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_block",
                          "typeString": "block"
                        }
                      },
                      "id": 1201,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "timestamp",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "21770:15:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 1202,
                      "name": "periodFinish",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 781,
                      "src": "21789:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "21770:31:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 1237,
                    "nodeType": "Block",
                    "src": "21874:204:0",
                    "statements": [
                      {
                        "assignments": [
                          1213
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1213,
                            "name": "remaining",
                            "nodeType": "VariableDeclaration",
                            "scope": 1237,
                            "src": "21888:17:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 1212,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "21888:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1219,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 1216,
                                "name": "block",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1550,
                                "src": "21925:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_block",
                                  "typeString": "block"
                                }
                              },
                              "id": 1217,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "timestamp",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "21925:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 1214,
                              "name": "periodFinish",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 781,
                              "src": "21908:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 1215,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sub",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 227,
                            "src": "21908: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": 1218,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21908:33:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "21888:53:0"
                      },
                      {
                        "assignments": [
                          1221
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1221,
                            "name": "leftover",
                            "nodeType": "VariableDeclaration",
                            "scope": 1237,
                            "src": "21955:16:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 1220,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "21955:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1226,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1224,
                              "name": "rewardRate",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 784,
                              "src": "21988:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 1222,
                              "name": "remaining",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1213,
                              "src": "21974:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 1223,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "mul",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 261,
                            "src": "21974: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": 1225,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21974:25:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "21955:44:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1235,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1227,
                            "name": "rewardRate",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 784,
                            "src": "22013:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1233,
                                "name": "rewardsDuration",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 786,
                                "src": "22051:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 1230,
                                    "name": "leftover",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1221,
                                    "src": "22037:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1228,
                                    "name": "reward",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1190,
                                    "src": "22026:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 1229,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "add",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 202,
                                  "src": "22026: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": 1231,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "22026:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1232,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "div",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 286,
                              "src": "22026: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": 1234,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "22026:41:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "22013:54:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1236,
                        "nodeType": "ExpressionStatement",
                        "src": "22013:54:0"
                      }
                    ]
                  },
                  "id": 1238,
                  "nodeType": "IfStatement",
                  "src": "21766:312:0",
                  "trueBody": {
                    "id": 1211,
                    "nodeType": "Block",
                    "src": "21803:65:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1209,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1204,
                            "name": "rewardRate",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 784,
                            "src": "21817:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1207,
                                "name": "rewardsDuration",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 786,
                                "src": "21841:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 1205,
                                "name": "reward",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1190,
                                "src": "21830:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1206,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "div",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 286,
                              "src": "21830: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": 1208,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "21830:27:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "21817:40:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1210,
                        "nodeType": "ExpressionStatement",
                        "src": "21817:40:0"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    1240
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1240,
                      "name": "balance",
                      "nodeType": "VariableDeclaration",
                      "scope": 1275,
                      "src": "22432:12:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1239,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "22432:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 1247,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 1244,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1594,
                            "src": "22478:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_StakingRewards_$1336",
                              "typeString": "contract StakingRewards"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_StakingRewards_$1336",
                              "typeString": "contract StakingRewards"
                            }
                          ],
                          "id": 1243,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "22470:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 1245,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "22470:13:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 1241,
                        "name": "rewardsToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 776,
                        "src": "22447:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$68",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 1242,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "balanceOf",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 13,
                      "src": "22447:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) view external returns (uint256)"
                      }
                    },
                    "id": 1246,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "22447:37:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "22432:52:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 1254,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 1249,
                          "name": "rewardRate",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 784,
                          "src": "22502:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1252,
                              "name": "rewardsDuration",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 786,
                              "src": "22528:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 1250,
                              "name": "balance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1240,
                              "src": "22516:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 1251,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "div",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 286,
                            "src": "22516:11: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": 1253,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22516:28:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "22502:42:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "50726f76696465642072657761726420746f6f2068696768",
                        "id": 1255,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "22546:26:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_af294828ccb7807394ab9c640e14eb2534ed0e75bb2e1346f1bb81dd84cda810",
                          "typeString": "literal_string \"Provided reward too high\""
                        },
                        "value": "Provided reward too high"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_af294828ccb7807394ab9c640e14eb2534ed0e75bb2e1346f1bb81dd84cda810",
                          "typeString": "literal_string \"Provided reward too high\""
                        }
                      ],
                      "id": 1248,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "22494:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 1256,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "22494:79:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1257,
                  "nodeType": "ExpressionStatement",
                  "src": "22494:79:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 1261,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 1258,
                      "name": "lastUpdateTime",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 788,
                      "src": "22584:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 1259,
                        "name": "block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1550,
                        "src": "22601:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_block",
                          "typeString": "block"
                        }
                      },
                      "id": 1260,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "timestamp",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "22601:15:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "22584:32:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1262,
                  "nodeType": "ExpressionStatement",
                  "src": "22584:32:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 1269,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 1263,
                      "name": "periodFinish",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 781,
                      "src": "22626:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 1267,
                          "name": "rewardsDuration",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 786,
                          "src": "22661:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 1264,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1550,
                            "src": "22641:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 1265,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "22641:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1266,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 202,
                        "src": "22641: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": 1268,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "22641:36:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "22626:51:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1270,
                  "nodeType": "ExpressionStatement",
                  "src": "22626:51:0"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 1272,
                        "name": "reward",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1190,
                        "src": "22704:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1271,
                      "name": "RewardAdded",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1317,
                      "src": "22692:11:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                        "typeString": "function (uint256)"
                      }
                    },
                    "id": 1273,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "22692:19:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1274,
                  "nodeType": "EmitStatement",
                  "src": "22687:24:0"
                }
              ]
            },
            "documentation": null,
            "id": 1276,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 1193,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 1192,
                  "name": "onlyRewardsDistribution",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 761,
                  "src": "21707:23:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "21707:23:0"
              },
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "hexValue": "30",
                        "id": 1196,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "21752: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": 1195,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "21744:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_address_$",
                        "typeString": "type(address)"
                      },
                      "typeName": "address"
                    },
                    "id": 1197,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "21744:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  }
                ],
                "id": 1198,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 1194,
                  "name": "updateReward",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1313,
                  "src": "21731:12:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$_t_address_$",
                    "typeString": "modifier (address)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "21731:24:0"
              }
            ],
            "name": "notifyRewardAmount",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1191,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1190,
                  "name": "reward",
                  "nodeType": "VariableDeclaration",
                  "scope": 1276,
                  "src": "21682:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1189,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "21682:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "21681:16:0"
            },
            "returnParameters": {
              "id": 1199,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "21756:0:0"
            },
            "scope": 1336,
            "src": "21654:1064:0",
            "stateMutability": "nonpayable",
            "superFunction": 749,
            "visibility": "external"
          },
          {
            "body": {
              "id": 1312,
              "nodeType": "Block",
              "src": "22806:283:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 1283,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 1280,
                      "name": "rewardPerTokenStored",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 790,
                      "src": "22816:20:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1281,
                        "name": "rewardPerToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 900,
                        "src": "22839:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                          "typeString": "function () view returns (uint256)"
                        }
                      },
                      "id": 1282,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "22839:16:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "22816:39:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1284,
                  "nodeType": "ExpressionStatement",
                  "src": "22816:39:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 1288,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 1285,
                      "name": "lastUpdateTime",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 788,
                      "src": "22865:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1286,
                        "name": "lastTimeRewardApplicable",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 869,
                        "src": "22882:24:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                          "typeString": "function () view returns (uint256)"
                        }
                      },
                      "id": 1287,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "22882:26:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "22865:43:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1289,
                  "nodeType": "ExpressionStatement",
                  "src": "22865:43:0"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 1294,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 1290,
                      "name": "account",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1278,
                      "src": "22922:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 1292,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "22941: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": 1291,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "22933:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 1293,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "22933:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "src": "22922:21:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 1310,
                  "nodeType": "IfStatement",
                  "src": "22918:154:0",
                  "trueBody": {
                    "id": 1309,
                    "nodeType": "Block",
                    "src": "22945:127:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1301,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 1295,
                              "name": "rewards",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 798,
                              "src": "22959:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 1297,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1296,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1278,
                              "src": "22967:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "22959:16:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1299,
                                "name": "account",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1278,
                                "src": "22985:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 1298,
                              "name": "earned",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 929,
                              "src": "22978:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_uint256_$",
                                "typeString": "function (address) view returns (uint256)"
                              }
                            },
                            "id": 1300,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "22978:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "22959:34:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1302,
                        "nodeType": "ExpressionStatement",
                        "src": "22959:34:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1307,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 1303,
                              "name": "userRewardPerTokenPaid",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 794,
                              "src": "23007:22:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 1305,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1304,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1278,
                              "src": "23030:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "23007:31:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1306,
                            "name": "rewardPerTokenStored",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 790,
                            "src": "23041:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "23007:54:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1308,
                        "nodeType": "ExpressionStatement",
                        "src": "23007:54:0"
                      }
                    ]
                  }
                },
                {
                  "id": 1311,
                  "nodeType": "PlaceholderStatement",
                  "src": "23081:1:0"
                }
              ]
            },
            "documentation": null,
            "id": 1313,
            "name": "updateReward",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 1279,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1278,
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "scope": 1313,
                  "src": "22789:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1277,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "22789:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "22788:17:0"
            },
            "src": "22767:322:0",
            "visibility": "internal"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 1317,
            "name": "RewardAdded",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 1316,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1315,
                  "indexed": false,
                  "name": "reward",
                  "nodeType": "VariableDeclaration",
                  "scope": 1317,
                  "src": "23153:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1314,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "23153:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "23152:16:0"
            },
            "src": "23135:34:0"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 1323,
            "name": "Staked",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 1322,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1319,
                  "indexed": true,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 1323,
                  "src": "23187:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1318,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "23187:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1321,
                  "indexed": false,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 1323,
                  "src": "23209:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1320,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "23209:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "23186:38:0"
            },
            "src": "23174:51:0"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 1329,
            "name": "Withdrawn",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 1328,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1325,
                  "indexed": true,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 1329,
                  "src": "23246:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1324,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "23246:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1327,
                  "indexed": false,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 1329,
                  "src": "23268:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1326,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "23268:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "23245:38:0"
            },
            "src": "23230:54:0"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 1335,
            "name": "RewardPaid",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 1334,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1331,
                  "indexed": true,
                  "name": "user",
                  "nodeType": "VariableDeclaration",
                  "scope": 1335,
                  "src": "23306:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1330,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "23306:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1333,
                  "indexed": false,
                  "name": "reward",
                  "nodeType": "VariableDeclaration",
                  "scope": 1335,
                  "src": "23328:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1332,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "23328:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "23305:38:0"
            },
            "src": "23289:55:0"
          }
        ],
        "scope": 1546,
        "src": "17758:5588:0"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "interface",
        "documentation": null,
        "fullyImplemented": false,
        "id": 1354,
        "linearizedBaseContracts": [
          1354
        ],
        "name": "IUniswapV2ERC20",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": null,
            "documentation": null,
            "id": 1353,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "permit",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1351,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1338,
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "scope": 1353,
                  "src": "23396:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1337,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "23396:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1340,
                  "name": "spender",
                  "nodeType": "VariableDeclaration",
                  "scope": 1353,
                  "src": "23411:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1339,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "23411:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1342,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 1353,
                  "src": "23428:10:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1341,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "23428:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1344,
                  "name": "deadline",
                  "nodeType": "VariableDeclaration",
                  "scope": 1353,
                  "src": "23440:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1343,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "23440:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1346,
                  "name": "v",
                  "nodeType": "VariableDeclaration",
                  "scope": 1353,
                  "src": "23455:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 1345,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "23455:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1348,
                  "name": "r",
                  "nodeType": "VariableDeclaration",
                  "scope": 1353,
                  "src": "23464:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1347,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "23464:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1350,
                  "name": "s",
                  "nodeType": "VariableDeclaration",
                  "scope": 1353,
                  "src": "23475:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1349,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "23475:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "23395:90:0"
            },
            "returnParameters": {
              "id": 1352,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "23494:0:0"
            },
            "scope": 1354,
            "src": "23380:115:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          }
        ],
        "scope": 1546,
        "src": "23348:149:0"
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 1355,
              "name": "Ownable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 177,
              "src": "23533:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Ownable_$177",
                "typeString": "contract Ownable"
              }
            },
            "id": 1356,
            "nodeType": "InheritanceSpecifier",
            "src": "23533:7:0"
          }
        ],
        "contractDependencies": [
          177,
          1336
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 1545,
        "linearizedBaseContracts": [
          1545,
          177
        ],
        "name": "StakingRewardsFactory",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 1358,
            "name": "rewardsToken",
            "nodeType": "VariableDeclaration",
            "scope": 1545,
            "src": "23565:27:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 1357,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "23565:7:0",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 1360,
            "name": "stakingRewardsGenesis",
            "nodeType": "VariableDeclaration",
            "scope": 1545,
            "src": "23598:33:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 1359,
              "name": "uint",
              "nodeType": "ElementaryTypeName",
              "src": "23598:4:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 1363,
            "name": "stakingTokens",
            "nodeType": "VariableDeclaration",
            "scope": 1545,
            "src": "23713:30:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_address_$dyn_storage",
              "typeString": "address[]"
            },
            "typeName": {
              "baseType": {
                "id": 1361,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "23713:7:0",
                "stateMutability": "nonpayable",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "id": 1362,
              "length": null,
              "nodeType": "ArrayTypeName",
              "src": "23713:9:0",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                "typeString": "address[]"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "canonicalName": "StakingRewardsFactory.StakingRewardsInfo",
            "id": 1368,
            "members": [
              {
                "constant": false,
                "id": 1365,
                "name": "stakingRewards",
                "nodeType": "VariableDeclaration",
                "scope": 1368,
                "src": "23843:22:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                },
                "typeName": {
                  "id": 1364,
                  "name": "address",
                  "nodeType": "ElementaryTypeName",
                  "src": "23843:7:0",
                  "stateMutability": "nonpayable",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 1367,
                "name": "rewardAmount",
                "nodeType": "VariableDeclaration",
                "scope": 1368,
                "src": "23875:17:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 1366,
                  "name": "uint",
                  "nodeType": "ElementaryTypeName",
                  "src": "23875:4:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "StakingRewardsInfo",
            "nodeType": "StructDefinition",
            "scope": 1545,
            "src": "23807:92:0",
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 1372,
            "name": "stakingRewardsInfoByStakingToken",
            "nodeType": "VariableDeclaration",
            "scope": 1545,
            "src": "23942:78:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_StakingRewardsInfo_$1368_storage_$",
              "typeString": "mapping(address => struct StakingRewardsFactory.StakingRewardsInfo)"
            },
            "typeName": {
              "id": 1371,
              "keyType": {
                "id": 1369,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "23950:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "23942:38:0",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_StakingRewardsInfo_$1368_storage_$",
                "typeString": "mapping(address => struct StakingRewardsFactory.StakingRewardsInfo)"
              },
              "valueType": {
                "contractScope": null,
                "id": 1370,
                "name": "StakingRewardsInfo",
                "nodeType": "UserDefinedTypeName",
                "referencedDeclaration": 1368,
                "src": "23961:18:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage_ptr",
                  "typeString": "struct StakingRewardsFactory.StakingRewardsInfo"
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1389,
              "nodeType": "Block",
              "src": "24130:102:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 1383,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 1381,
                      "name": "rewardsToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1358,
                      "src": "24141:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 1382,
                      "name": "_rewardsToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1374,
                      "src": "24156:13:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "24141:28:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 1384,
                  "nodeType": "ExpressionStatement",
                  "src": "24141:28:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 1387,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 1385,
                      "name": "stakingRewardsGenesis",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1360,
                      "src": "24179:21:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 1386,
                      "name": "_stakingRewardsGenesis",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1376,
                      "src": "24203:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "24179:46:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1388,
                  "nodeType": "ExpressionStatement",
                  "src": "24179:46:0"
                }
              ]
            },
            "documentation": null,
            "id": 1390,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [
              {
                "arguments": [],
                "id": 1379,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 1378,
                  "name": "Ownable",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 177,
                  "src": "24113:7:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_type$_t_contract$_Ownable_$177_$",
                    "typeString": "type(contract Ownable)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "24113:9:0"
              }
            ],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1377,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1374,
                  "name": "_rewardsToken",
                  "nodeType": "VariableDeclaration",
                  "scope": 1390,
                  "src": "24048:21:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1373,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "24048:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1376,
                  "name": "_stakingRewardsGenesis",
                  "nodeType": "VariableDeclaration",
                  "scope": 1390,
                  "src": "24079:27:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1375,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "24079:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "24038:74:0"
            },
            "returnParameters": {
              "id": 1380,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "24130:0:0"
            },
            "scope": 1545,
            "src": "24027:205:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1445,
              "nodeType": "Block",
              "src": "24558:430:0",
              "statements": [
                {
                  "assignments": [
                    1402
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1402,
                      "name": "info",
                      "nodeType": "VariableDeclaration",
                      "scope": 1445,
                      "src": "24568:31:0",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage_ptr",
                        "typeString": "struct StakingRewardsFactory.StakingRewardsInfo"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 1401,
                        "name": "StakingRewardsInfo",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 1368,
                        "src": "24568:18:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage_ptr",
                          "typeString": "struct StakingRewardsFactory.StakingRewardsInfo"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 1406,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 1403,
                      "name": "stakingRewardsInfoByStakingToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1372,
                      "src": "24602:32:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_StakingRewardsInfo_$1368_storage_$",
                        "typeString": "mapping(address => struct StakingRewardsFactory.StakingRewardsInfo storage ref)"
                      }
                    },
                    "id": 1405,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 1404,
                      "name": "stakingToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1392,
                      "src": "24635:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "24602:46:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage",
                      "typeString": "struct StakingRewardsFactory.StakingRewardsInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "24568:80:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 1413,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 1408,
                            "name": "info",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1402,
                            "src": "24666:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage_ptr",
                              "typeString": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer"
                            }
                          },
                          "id": 1409,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "stakingRewards",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1365,
                          "src": "24666:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 1411,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "24697: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": 1410,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "24689:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 1412,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "24689:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "24666:33:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5374616b696e6752657761726473466163746f72793a3a6465706c6f793a20616c7265616479206465706c6f796564",
                        "id": 1414,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "24701:49:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_77d8567a7b7bf9a9a30ea727f6e525cae6667d736cdaff555c86db8d81648a1a",
                          "typeString": "literal_string \"StakingRewardsFactory::deploy: already deployed\""
                        },
                        "value": "StakingRewardsFactory::deploy: already deployed"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_77d8567a7b7bf9a9a30ea727f6e525cae6667d736cdaff555c86db8d81648a1a",
                          "typeString": "literal_string \"StakingRewardsFactory::deploy: already deployed\""
                        }
                      ],
                      "id": 1407,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "24658:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 1415,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "24658:93:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1416,
                  "nodeType": "ExpressionStatement",
                  "src": "24658:93:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 1431,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 1417,
                        "name": "info",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1402,
                        "src": "24762:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage_ptr",
                          "typeString": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer"
                        }
                      },
                      "id": 1419,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "stakingRewards",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1365,
                      "src": "24762:19:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1424,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1598,
                                  "src": "24845:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_StakingRewardsFactory_$1545",
                                    "typeString": "contract StakingRewardsFactory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_StakingRewardsFactory_$1545",
                                    "typeString": "contract StakingRewardsFactory"
                                  }
                                ],
                                "id": 1423,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "24837:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": "address"
                              },
                              "id": 1425,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "24837:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1426,
                              "name": "rewardsToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1358,
                              "src": "24852:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1427,
                              "name": "stakingToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1392,
                              "src": "24866:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1428,
                              "name": "rewardsDuration",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1396,
                              "src": "24880:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1422,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "NewExpression",
                            "src": "24792:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_creation_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$_t_contract$_StakingRewards_$1336_$",
                              "typeString": "function (address,address,address,uint256) returns (contract StakingRewards)"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 1421,
                              "name": "StakingRewards",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1336,
                              "src": "24796:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_StakingRewards_$1336",
                                "typeString": "contract StakingRewards"
                              }
                            }
                          },
                          "id": 1429,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "24792:104:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_StakingRewards_$1336",
                            "typeString": "contract StakingRewards"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_StakingRewards_$1336",
                            "typeString": "contract StakingRewards"
                          }
                        ],
                        "id": 1420,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "24784:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 1430,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "24784:113:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "24762:135:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 1432,
                  "nodeType": "ExpressionStatement",
                  "src": "24762:135:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 1437,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 1433,
                        "name": "info",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1402,
                        "src": "24907:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage_ptr",
                          "typeString": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer"
                        }
                      },
                      "id": 1435,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "rewardAmount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1367,
                      "src": "24907:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 1436,
                      "name": "rewardAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1394,
                      "src": "24927:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "24907:32:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1438,
                  "nodeType": "ExpressionStatement",
                  "src": "24907:32:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 1442,
                        "name": "stakingToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1392,
                        "src": "24968:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 1439,
                        "name": "stakingTokens",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1363,
                        "src": "24949:13:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_storage",
                          "typeString": "address[] storage ref"
                        }
                      },
                      "id": 1441,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "push",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "24949:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_arraypush_nonpayable$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) returns (uint256)"
                      }
                    },
                    "id": 1443,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "24949:32:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1444,
                  "nodeType": "ExpressionStatement",
                  "src": "24949:32:0"
                }
              ]
            },
            "documentation": "// permissioned functions",
            "id": 1446,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 1399,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 1398,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 110,
                  "src": "24548:9:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "24548:9:0"
              }
            ],
            "name": "deploy",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1397,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1392,
                  "name": "stakingToken",
                  "nodeType": "VariableDeclaration",
                  "scope": 1446,
                  "src": "24475:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1391,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "24475:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1394,
                  "name": "rewardAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 1446,
                  "src": "24497:17:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1393,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "24497:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1396,
                  "name": "rewardsDuration",
                  "nodeType": "VariableDeclaration",
                  "scope": 1446,
                  "src": "24516:23:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1395,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "24516:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "24474:66:0"
            },
            "returnParameters": {
              "id": 1400,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "24558:0:0"
            },
            "scope": 1545,
            "src": "24459:529:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1476,
              "nodeType": "Block",
              "src": "25123:241:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 1453,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 1450,
                            "name": "stakingTokens",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1363,
                            "src": "25141:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_storage",
                              "typeString": "address[] storage ref"
                            }
                          },
                          "id": 1451,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "25141:20:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 1452,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "25164:1:0",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "25141:24:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e74733a2063616c6c6564206265666f726520616e79206465706c6f7973",
                        "id": 1454,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "25167:71:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_ae1f87e20c157d2878a2e48b377d209dfddfc6d5ec9b80ceecc5addd0ef6ffdb",
                          "typeString": "literal_string \"StakingRewardsFactory::notifyRewardAmounts: called before any deploys\""
                        },
                        "value": "StakingRewardsFactory::notifyRewardAmounts: called before any deploys"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_ae1f87e20c157d2878a2e48b377d209dfddfc6d5ec9b80ceecc5addd0ef6ffdb",
                          "typeString": "literal_string \"StakingRewardsFactory::notifyRewardAmounts: called before any deploys\""
                        }
                      ],
                      "id": 1449,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "25133:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 1455,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "25133:106:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1456,
                  "nodeType": "ExpressionStatement",
                  "src": "25133:106:0"
                },
                {
                  "body": {
                    "id": 1474,
                    "nodeType": "Block",
                    "src": "25297:61:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 1469,
                                "name": "stakingTokens",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1363,
                                "src": "25330:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_address_$dyn_storage",
                                  "typeString": "address[] storage ref"
                                }
                              },
                              "id": 1471,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 1470,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1458,
                                "src": "25344:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "25330:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 1468,
                            "name": "notifyRewardAmount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1544,
                            "src": "25311:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 1472,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25311:36:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1473,
                        "nodeType": "ExpressionStatement",
                        "src": "25311:36:0"
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1464,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 1461,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1458,
                      "src": "25266:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 1462,
                        "name": "stakingTokens",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1363,
                        "src": "25270:13:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_storage",
                          "typeString": "address[] storage ref"
                        }
                      },
                      "id": 1463,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "25270:20:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "25266:24:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1475,
                  "initializationExpression": {
                    "assignments": [
                      1458
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 1458,
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "scope": 1475,
                        "src": "25254:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1457,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "25254:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 1460,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 1459,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "25263:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "25254:10:0"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 1466,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "25292:3:0",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 1465,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1458,
                        "src": "25292:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 1467,
                    "nodeType": "ExpressionStatement",
                    "src": "25292:3:0"
                  },
                  "nodeType": "ForStatement",
                  "src": "25249:109:0"
                }
              ]
            },
            "documentation": "// permissionless functions",
            "id": 1477,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "notifyRewardAmounts",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1447,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "25113:2:0"
            },
            "returnParameters": {
              "id": 1448,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "25123:0:0"
            },
            "scope": 1545,
            "src": "25085:279:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1543,
              "nodeType": "Block",
              "src": "25591:736:0",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 1486,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 1483,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1550,
                            "src": "25609:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 1484,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "25609:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 1485,
                          "name": "stakingRewardsGenesis",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1360,
                          "src": "25628:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "25609:40:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e743a206e6f74207265616479",
                        "id": 1487,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "25651:54:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_e71986032604f829ccaec9386c51e838a85cdbf506769bd103c829f640682adf",
                          "typeString": "literal_string \"StakingRewardsFactory::notifyRewardAmount: not ready\""
                        },
                        "value": "StakingRewardsFactory::notifyRewardAmount: not ready"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_e71986032604f829ccaec9386c51e838a85cdbf506769bd103c829f640682adf",
                          "typeString": "literal_string \"StakingRewardsFactory::notifyRewardAmount: not ready\""
                        }
                      ],
                      "id": 1482,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "25601:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 1488,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "25601:105:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1489,
                  "nodeType": "ExpressionStatement",
                  "src": "25601:105:0"
                },
                {
                  "assignments": [
                    1491
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1491,
                      "name": "info",
                      "nodeType": "VariableDeclaration",
                      "scope": 1543,
                      "src": "25717:31:0",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage_ptr",
                        "typeString": "struct StakingRewardsFactory.StakingRewardsInfo"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 1490,
                        "name": "StakingRewardsInfo",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 1368,
                        "src": "25717:18:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage_ptr",
                          "typeString": "struct StakingRewardsFactory.StakingRewardsInfo"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 1495,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 1492,
                      "name": "stakingRewardsInfoByStakingToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1372,
                      "src": "25751:32:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_StakingRewardsInfo_$1368_storage_$",
                        "typeString": "mapping(address => struct StakingRewardsFactory.StakingRewardsInfo storage ref)"
                      }
                    },
                    "id": 1494,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 1493,
                      "name": "stakingToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1479,
                      "src": "25784:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "25751:46:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage",
                      "typeString": "struct StakingRewardsFactory.StakingRewardsInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "25717:80:0"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 1502,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 1497,
                            "name": "info",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1491,
                            "src": "25815:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage_ptr",
                              "typeString": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer"
                            }
                          },
                          "id": 1498,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "stakingRewards",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1365,
                          "src": "25815:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 1500,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "25846: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": 1499,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "25838:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 1501,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25838:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "25815:33:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e743a206e6f74206465706c6f796564",
                        "id": 1503,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "25850:57:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_e8f5c4ca6631f4bfe6ffabf099741b79e5c6b86618ddcbeee6ba3c5940184427",
                          "typeString": "literal_string \"StakingRewardsFactory::notifyRewardAmount: not deployed\""
                        },
                        "value": "StakingRewardsFactory::notifyRewardAmount: not deployed"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_e8f5c4ca6631f4bfe6ffabf099741b79e5c6b86618ddcbeee6ba3c5940184427",
                          "typeString": "literal_string \"StakingRewardsFactory::notifyRewardAmount: not deployed\""
                        }
                      ],
                      "id": 1496,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1563,
                        1564
                      ],
                      "referencedDeclaration": 1564,
                      "src": "25807:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 1504,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "25807:101:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1505,
                  "nodeType": "ExpressionStatement",
                  "src": "25807:101:0"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1509,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 1506,
                        "name": "info",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1491,
                        "src": "25923:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage_ptr",
                          "typeString": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer"
                        }
                      },
                      "id": 1507,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "rewardAmount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1367,
                      "src": "25923:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 1508,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "25943:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "25923:21:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 1542,
                  "nodeType": "IfStatement",
                  "src": "25919:402:0",
                  "trueBody": {
                    "id": 1541,
                    "nodeType": "Block",
                    "src": "25946:375:0",
                    "statements": [
                      {
                        "assignments": [
                          1511
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1511,
                            "name": "rewardAmount",
                            "nodeType": "VariableDeclaration",
                            "scope": 1541,
                            "src": "25960:17:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 1510,
                              "name": "uint",
                              "nodeType": "ElementaryTypeName",
                              "src": "25960:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1514,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 1512,
                            "name": "info",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1491,
                            "src": "25980:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage_ptr",
                              "typeString": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer"
                            }
                          },
                          "id": 1513,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "rewardAmount",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1367,
                          "src": "25980:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "25960:37:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1519,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1515,
                              "name": "info",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1491,
                              "src": "26011:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage_ptr",
                                "typeString": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer"
                              }
                            },
                            "id": 1517,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "rewardAmount",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1367,
                            "src": "26011:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 1518,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "26031:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "26011:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1520,
                        "nodeType": "ExpressionStatement",
                        "src": "26011:21:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1526,
                                    "name": "info",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1491,
                                    "src": "26102:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage_ptr",
                                      "typeString": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer"
                                    }
                                  },
                                  "id": 1527,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "stakingRewards",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1365,
                                  "src": "26102:19:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1528,
                                  "name": "rewardAmount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1511,
                                  "src": "26123:12: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,
                                      "id": 1523,
                                      "name": "rewardsToken",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1358,
                                      "src": "26079:12:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "id": 1522,
                                    "name": "IERC20",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 68,
                                    "src": "26072:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_IERC20_$68_$",
                                      "typeString": "type(contract IERC20)"
                                    }
                                  },
                                  "id": 1524,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "26072:20:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$68",
                                    "typeString": "contract IERC20"
                                  }
                                },
                                "id": 1525,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "transfer",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 22,
                                "src": "26072:29:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                  "typeString": "function (address,uint256) external returns (bool)"
                                }
                              },
                              "id": 1529,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "26072:64:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e743a207472616e73666572206661696c6564",
                              "id": 1530,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "26154:60:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_afbe2226aded12cd2f0d3c83ff167eedc78632dc0894f92eea331d3f2b56d089",
                                "typeString": "literal_string \"StakingRewardsFactory::notifyRewardAmount: transfer failed\""
                              },
                              "value": "StakingRewardsFactory::notifyRewardAmount: transfer failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_afbe2226aded12cd2f0d3c83ff167eedc78632dc0894f92eea331d3f2b56d089",
                                "typeString": "literal_string \"StakingRewardsFactory::notifyRewardAmount: transfer failed\""
                              }
                            ],
                            "id": 1521,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              1563,
                              1564
                            ],
                            "referencedDeclaration": 1564,
                            "src": "26047:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1531,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26047:181:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1532,
                        "nodeType": "ExpressionStatement",
                        "src": "26047:181:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1538,
                              "name": "rewardAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1511,
                              "src": "26297:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1534,
                                    "name": "info",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1491,
                                    "src": "26257:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_StakingRewardsInfo_$1368_storage_ptr",
                                      "typeString": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer"
                                    }
                                  },
                                  "id": 1535,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "stakingRewards",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1365,
                                  "src": "26257:19:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 1533,
                                "name": "StakingRewards",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1336,
                                "src": "26242:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_StakingRewards_$1336_$",
                                  "typeString": "type(contract StakingRewards)"
                                }
                              },
                              "id": 1536,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "26242:35:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_StakingRewards_$1336",
                                "typeString": "contract StakingRewards"
                              }
                            },
                            "id": 1537,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "notifyRewardAmount",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1276,
                            "src": "26242:54:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256) external"
                            }
                          },
                          "id": 1539,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26242:68:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1540,
                        "nodeType": "ExpressionStatement",
                        "src": "26242:68:0"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "id": 1544,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "notifyRewardAmount",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1480,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1479,
                  "name": "stakingToken",
                  "nodeType": "VariableDeclaration",
                  "scope": 1544,
                  "src": "25562:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1478,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "25562:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "25561:22:0"
            },
            "returnParameters": {
              "id": 1481,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "25591:0:0"
            },
            "scope": 1545,
            "src": "25534:793:0",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          }
        ],
        "scope": 1546,
        "src": "23499:2830:0"
      }
    ],
    "src": "31:26298:0"
  },
  "legacyAST": {
    "attributes": {
      "absolutePath": "/Users/warrenmason/Documents/UniswapV3Contracts/Core/LiveContracts/StakingRewardsFactory/contracts/StakingRewardsFactory.sol",
      "exportedSymbols": {
        "Address": [
          447
        ],
        "ERC20Detailed": [
          430
        ],
        "IERC20": [
          68
        ],
        "IStakingRewards": [
          742
        ],
        "IUniswapV2ERC20": [
          1354
        ],
        "Math": [
          375
        ],
        "Ownable": [
          177
        ],
        "ReentrancyGuard": [
          691
        ],
        "RewardsDistributionRecipient": [
          762
        ],
        "SafeERC20": [
          661
        ],
        "SafeMath": [
          308
        ],
        "StakingRewards": [
          1336
        ],
        "StakingRewardsFactory": [
          1545
        ]
      }
    },
    "children": [
      {
        "attributes": {
          "literals": [
            "solidity",
            ">=",
            "0.5",
            ".16"
          ]
        },
        "id": 1,
        "name": "PragmaDirective",
        "src": "31:25:0"
      },
      {
        "attributes": {
          "baseContracts": [
            null
          ],
          "contractDependencies": [
            null
          ],
          "contractKind": "interface",
          "documentation": "@dev Interface of the ERC20 standard as defined in the EIP. Does not include\nthe optional functions; to access them see `ERC20Detailed`.",
          "fullyImplemented": false,
          "linearizedBaseContracts": [
            68
          ],
          "name": "IERC20",
          "scope": 1546
        },
        "children": [
          {
            "attributes": {
              "body": null,
              "documentation": "@dev Returns the amount of tokens in existence.",
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "totalSupply",
              "scope": 68,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 2,
                "name": "ParameterList",
                "src": "323:2:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 6,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 3,
                        "name": "ElementaryTypeName",
                        "src": "349:7:0"
                      }
                    ],
                    "id": 4,
                    "name": "VariableDeclaration",
                    "src": "349:7:0"
                  }
                ],
                "id": 5,
                "name": "ParameterList",
                "src": "348:9:0"
              }
            ],
            "id": 6,
            "name": "FunctionDefinition",
            "src": "303:55:0"
          },
          {
            "attributes": {
              "body": null,
              "documentation": "@dev Returns the amount of tokens owned by `account`.",
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "balanceOf",
              "scope": 68,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "account",
                      "scope": 13,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 7,
                        "name": "ElementaryTypeName",
                        "src": "460:7:0"
                      }
                    ],
                    "id": 8,
                    "name": "VariableDeclaration",
                    "src": "460:15:0"
                  }
                ],
                "id": 9,
                "name": "ParameterList",
                "src": "459:17:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 13,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 10,
                        "name": "ElementaryTypeName",
                        "src": "500:7:0"
                      }
                    ],
                    "id": 11,
                    "name": "VariableDeclaration",
                    "src": "500:7:0"
                  }
                ],
                "id": 12,
                "name": "ParameterList",
                "src": "499:9:0"
              }
            ],
            "id": 13,
            "name": "FunctionDefinition",
            "src": "441:68:0"
          },
          {
            "attributes": {
              "body": null,
              "documentation": "@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.",
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "transfer",
              "scope": 68,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "recipient",
                      "scope": 22,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 14,
                        "name": "ElementaryTypeName",
                        "src": "747:7:0"
                      }
                    ],
                    "id": 15,
                    "name": "VariableDeclaration",
                    "src": "747:17:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "amount",
                      "scope": 22,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 16,
                        "name": "ElementaryTypeName",
                        "src": "766:7:0"
                      }
                    ],
                    "id": 17,
                    "name": "VariableDeclaration",
                    "src": "766:14:0"
                  }
                ],
                "id": 18,
                "name": "ParameterList",
                "src": "746:35:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 22,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bool",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bool",
                          "type": "bool"
                        },
                        "id": 19,
                        "name": "ElementaryTypeName",
                        "src": "800:4:0"
                      }
                    ],
                    "id": 20,
                    "name": "VariableDeclaration",
                    "src": "800:4:0"
                  }
                ],
                "id": 21,
                "name": "ParameterList",
                "src": "799:6:0"
              }
            ],
            "id": 22,
            "name": "FunctionDefinition",
            "src": "729:77:0"
          },
          {
            "attributes": {
              "body": null,
              "documentation": "@dev Returns the remaining number of tokens that `spender` will be\nallowed to spend on behalf of `owner` through `transferFrom`. This is\nzero by default.\n     * This value changes when `approve` or `transferFrom` are called.",
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "allowance",
              "scope": 68,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "owner",
                      "scope": 31,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 23,
                        "name": "ElementaryTypeName",
                        "src": "1100:7:0"
                      }
                    ],
                    "id": 24,
                    "name": "VariableDeclaration",
                    "src": "1100:13:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "spender",
                      "scope": 31,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 25,
                        "name": "ElementaryTypeName",
                        "src": "1115:7:0"
                      }
                    ],
                    "id": 26,
                    "name": "VariableDeclaration",
                    "src": "1115:15:0"
                  }
                ],
                "id": 27,
                "name": "ParameterList",
                "src": "1099:32:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 31,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 28,
                        "name": "ElementaryTypeName",
                        "src": "1155:7:0"
                      }
                    ],
                    "id": 29,
                    "name": "VariableDeclaration",
                    "src": "1155:7:0"
                  }
                ],
                "id": 30,
                "name": "ParameterList",
                "src": "1154:9:0"
              }
            ],
            "id": 31,
            "name": "FunctionDefinition",
            "src": "1081:83:0"
          },
          {
            "attributes": {
              "body": null,
              "documentation": "@dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     * Returns a boolean value indicating whether the operation succeeded.\n     * > Beware that changing an allowance with this method brings the risk\nthat someone may use both the old and the new allowance by unfortunate\ntransaction ordering. One possible solution to mitigate this race\ncondition is to first reduce the spender's allowance to 0 and set the\ndesired value afterwards:\nhttps://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     * Emits an `Approval` event.",
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "approve",
              "scope": 68,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "spender",
                      "scope": 40,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 32,
                        "name": "ElementaryTypeName",
                        "src": "1825:7:0"
                      }
                    ],
                    "id": 33,
                    "name": "VariableDeclaration",
                    "src": "1825:15:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "amount",
                      "scope": 40,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 34,
                        "name": "ElementaryTypeName",
                        "src": "1842:7:0"
                      }
                    ],
                    "id": 35,
                    "name": "VariableDeclaration",
                    "src": "1842:14:0"
                  }
                ],
                "id": 36,
                "name": "ParameterList",
                "src": "1824:33:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 40,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bool",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bool",
                          "type": "bool"
                        },
                        "id": 37,
                        "name": "ElementaryTypeName",
                        "src": "1876:4:0"
                      }
                    ],
                    "id": 38,
                    "name": "VariableDeclaration",
                    "src": "1876:4:0"
                  }
                ],
                "id": 39,
                "name": "ParameterList",
                "src": "1875:6:0"
              }
            ],
            "id": 40,
            "name": "FunctionDefinition",
            "src": "1808:74:0"
          },
          {
            "attributes": {
              "body": null,
              "documentation": "@dev Moves `amount` tokens from `sender` to `recipient` using the\nallowance mechanism. `amount` is then deducted from the caller's\nallowance.\n     * Returns a boolean value indicating whether the operation succeeded.\n     * Emits a `Transfer` event.",
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "transferFrom",
              "scope": 68,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "sender",
                      "scope": 51,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 41,
                        "name": "ElementaryTypeName",
                        "src": "2211:7:0"
                      }
                    ],
                    "id": 42,
                    "name": "VariableDeclaration",
                    "src": "2211:14:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "recipient",
                      "scope": 51,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 43,
                        "name": "ElementaryTypeName",
                        "src": "2227:7:0"
                      }
                    ],
                    "id": 44,
                    "name": "VariableDeclaration",
                    "src": "2227:17:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "amount",
                      "scope": 51,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 45,
                        "name": "ElementaryTypeName",
                        "src": "2246:7:0"
                      }
                    ],
                    "id": 46,
                    "name": "VariableDeclaration",
                    "src": "2246:14:0"
                  }
                ],
                "id": 47,
                "name": "ParameterList",
                "src": "2210:51:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 51,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bool",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bool",
                          "type": "bool"
                        },
                        "id": 48,
                        "name": "ElementaryTypeName",
                        "src": "2280:4:0"
                      }
                    ],
                    "id": 49,
                    "name": "VariableDeclaration",
                    "src": "2280:4:0"
                  }
                ],
                "id": 50,
                "name": "ParameterList",
                "src": "2279:6:0"
              }
            ],
            "id": 51,
            "name": "FunctionDefinition",
            "src": "2189:97:0"
          },
          {
            "attributes": {
              "anonymous": false,
              "documentation": "@dev Emitted when `value` tokens are moved from one account (`from`) to\nanother (`to`).\n     * Note that `value` may be zero.",
              "name": "Transfer"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": true,
                      "name": "from",
                      "scope": 59,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 52,
                        "name": "ElementaryTypeName",
                        "src": "2470:7:0"
                      }
                    ],
                    "id": 53,
                    "name": "VariableDeclaration",
                    "src": "2470:20:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": true,
                      "name": "to",
                      "scope": 59,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 54,
                        "name": "ElementaryTypeName",
                        "src": "2492:7:0"
                      }
                    ],
                    "id": 55,
                    "name": "VariableDeclaration",
                    "src": "2492:18:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": false,
                      "name": "value",
                      "scope": 59,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 56,
                        "name": "ElementaryTypeName",
                        "src": "2512:7:0"
                      }
                    ],
                    "id": 57,
                    "name": "VariableDeclaration",
                    "src": "2512:13:0"
                  }
                ],
                "id": 58,
                "name": "ParameterList",
                "src": "2469:57:0"
              }
            ],
            "id": 59,
            "name": "EventDefinition",
            "src": "2455:72:0"
          },
          {
            "attributes": {
              "anonymous": false,
              "documentation": "@dev Emitted when the allowance of a `spender` for an `owner` is set by\na call to `approve`. `value` is the new allowance.",
              "name": "Approval"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": true,
                      "name": "owner",
                      "scope": 67,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 60,
                        "name": "ElementaryTypeName",
                        "src": "2701:7:0"
                      }
                    ],
                    "id": 61,
                    "name": "VariableDeclaration",
                    "src": "2701:21:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": true,
                      "name": "spender",
                      "scope": 67,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 62,
                        "name": "ElementaryTypeName",
                        "src": "2724:7:0"
                      }
                    ],
                    "id": 63,
                    "name": "VariableDeclaration",
                    "src": "2724:23:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": false,
                      "name": "value",
                      "scope": 67,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 64,
                        "name": "ElementaryTypeName",
                        "src": "2749:7:0"
                      }
                    ],
                    "id": 65,
                    "name": "VariableDeclaration",
                    "src": "2749:13:0"
                  }
                ],
                "id": 66,
                "name": "ParameterList",
                "src": "2700:63:0"
              }
            ],
            "id": 67,
            "name": "EventDefinition",
            "src": "2686:78:0"
          }
        ],
        "id": 68,
        "name": "ContractDefinition",
        "src": "209:2557:0"
      },
      {
        "attributes": {
          "baseContracts": [
            null
          ],
          "contractDependencies": [
            null
          ],
          "contractKind": "contract",
          "documentation": "@dev Contract module which provides a basic access control mechanism, where\nthere is an account (an owner) that can be granted exclusive access to\nspecific functions.\n * This module is used through inheritance. It will make available the modifier\n`onlyOwner`, which can be aplied to your functions to restrict their use to\nthe owner.",
          "fullyImplemented": true,
          "linearizedBaseContracts": [
            177
          ],
          "name": "Ownable",
          "scope": 1546
        },
        "children": [
          {
            "attributes": {
              "constant": false,
              "name": "_owner",
              "scope": 177,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "address",
              "value": null,
              "visibility": "private"
            },
            "children": [
              {
                "attributes": {
                  "name": "address",
                  "stateMutability": "nonpayable",
                  "type": "address"
                },
                "id": 69,
                "name": "ElementaryTypeName",
                "src": "3151:7:0"
              }
            ],
            "id": 70,
            "name": "VariableDeclaration",
            "src": "3151:22:0"
          },
          {
            "attributes": {
              "anonymous": false,
              "documentation": null,
              "name": "OwnershipTransferred"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": true,
                      "name": "previousOwner",
                      "scope": 76,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 71,
                        "name": "ElementaryTypeName",
                        "src": "3207:7:0"
                      }
                    ],
                    "id": 72,
                    "name": "VariableDeclaration",
                    "src": "3207:29:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": true,
                      "name": "newOwner",
                      "scope": 76,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 73,
                        "name": "ElementaryTypeName",
                        "src": "3238:7:0"
                      }
                    ],
                    "id": 74,
                    "name": "VariableDeclaration",
                    "src": "3238:24:0"
                  }
                ],
                "id": 75,
                "name": "ParameterList",
                "src": "3206:57:0"
              }
            ],
            "id": 76,
            "name": "EventDefinition",
            "src": "3180:84:0"
          },
          {
            "attributes": {
              "documentation": "@dev Initializes the contract setting the deployer as the initial owner.",
              "implemented": true,
              "isConstructor": true,
              "kind": "constructor",
              "modifiers": [
                null
              ],
              "name": "",
              "scope": 177,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 77,
                "name": "ParameterList",
                "src": "3378:2:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 78,
                "name": "ParameterList",
                "src": "3389:0:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "address"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 70,
                              "type": "address",
                              "value": "_owner"
                            },
                            "id": 79,
                            "name": "Identifier",
                            "src": "3399:6:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "sender",
                              "referencedDeclaration": null,
                              "type": "address payable"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1560,
                                  "type": "msg",
                                  "value": "msg"
                                },
                                "id": 80,
                                "name": "Identifier",
                                "src": "3408:3:0"
                              }
                            ],
                            "id": 81,
                            "name": "MemberAccess",
                            "src": "3408:10:0"
                          }
                        ],
                        "id": 82,
                        "name": "Assignment",
                        "src": "3399:19:0"
                      }
                    ],
                    "id": 83,
                    "name": "ExpressionStatement",
                    "src": "3399:19:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                },
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 76,
                              "type": "function (address,address)",
                              "value": "OwnershipTransferred"
                            },
                            "id": 84,
                            "name": "Identifier",
                            "src": "3433:20:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "address payable",
                              "type_conversion": true
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "type": "type(address)",
                                  "value": "address"
                                },
                                "id": 85,
                                "name": "ElementaryTypeNameExpression",
                                "src": "3454:7:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "hexvalue": "30",
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "subdenomination": null,
                                  "token": "number",
                                  "type": "int_const 0",
                                  "value": "0"
                                },
                                "id": 86,
                                "name": "Literal",
                                "src": "3462:1:0"
                              }
                            ],
                            "id": 87,
                            "name": "FunctionCall",
                            "src": "3454:10:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 70,
                              "type": "address",
                              "value": "_owner"
                            },
                            "id": 88,
                            "name": "Identifier",
                            "src": "3466:6:0"
                          }
                        ],
                        "id": 89,
                        "name": "FunctionCall",
                        "src": "3433:40:0"
                      }
                    ],
                    "id": 90,
                    "name": "EmitStatement",
                    "src": "3428:45:0"
                  }
                ],
                "id": 91,
                "name": "Block",
                "src": "3389:91:0"
              }
            ],
            "id": 92,
            "name": "FunctionDefinition",
            "src": "3366:114:0"
          },
          {
            "attributes": {
              "documentation": "@dev Returns the address of the current owner.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "owner",
              "scope": 177,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 93,
                "name": "ParameterList",
                "src": "3570:2:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 100,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 94,
                        "name": "ElementaryTypeName",
                        "src": "3594:7:0"
                      }
                    ],
                    "id": 95,
                    "name": "VariableDeclaration",
                    "src": "3594:7:0"
                  }
                ],
                "id": 96,
                "name": "ParameterList",
                "src": "3593:9:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 96
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "overloadedDeclarations": [
                            null
                          ],
                          "referencedDeclaration": 70,
                          "type": "address",
                          "value": "_owner"
                        },
                        "id": 97,
                        "name": "Identifier",
                        "src": "3620:6:0"
                      }
                    ],
                    "id": 98,
                    "name": "Return",
                    "src": "3613:13:0"
                  }
                ],
                "id": 99,
                "name": "Block",
                "src": "3603:30:0"
              }
            ],
            "id": 100,
            "name": "FunctionDefinition",
            "src": "3556:77:0"
          },
          {
            "attributes": {
              "documentation": "@dev Throws if called by any account other than the owner.",
              "name": "onlyOwner",
              "visibility": "internal"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 101,
                "name": "ParameterList",
                "src": "3739:2:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe",
                                  "typeString": "literal_string \"Ownable: caller is not the owner\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 102,
                            "name": "Identifier",
                            "src": "3752:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "arguments": [
                                null
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "bool",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    null
                                  ],
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 121,
                                  "type": "function () view returns (bool)",
                                  "value": "isOwner"
                                },
                                "id": 103,
                                "name": "Identifier",
                                "src": "3760:7:0"
                              }
                            ],
                            "id": 104,
                            "name": "FunctionCall",
                            "src": "3760:9:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"Ownable: caller is not the owner\"",
                              "value": "Ownable: caller is not the owner"
                            },
                            "id": 105,
                            "name": "Literal",
                            "src": "3771:34:0"
                          }
                        ],
                        "id": 106,
                        "name": "FunctionCall",
                        "src": "3752:54:0"
                      }
                    ],
                    "id": 107,
                    "name": "ExpressionStatement",
                    "src": "3752:54:0"
                  },
                  {
                    "id": 108,
                    "name": "PlaceholderStatement",
                    "src": "3816:1:0"
                  }
                ],
                "id": 109,
                "name": "Block",
                "src": "3742:82:0"
              }
            ],
            "id": 110,
            "name": "ModifierDefinition",
            "src": "3721:103:0"
          },
          {
            "attributes": {
              "documentation": "@dev Returns true if the caller is the current owner.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "isOwner",
              "scope": 177,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 111,
                "name": "ParameterList",
                "src": "3923:2:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 121,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bool",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bool",
                          "type": "bool"
                        },
                        "id": 112,
                        "name": "ElementaryTypeName",
                        "src": "3947:4:0"
                      }
                    ],
                    "id": 113,
                    "name": "VariableDeclaration",
                    "src": "3947:4:0"
                  }
                ],
                "id": 114,
                "name": "ParameterList",
                "src": "3946:6:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 114
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "==",
                          "type": "bool"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "sender",
                              "referencedDeclaration": null,
                              "type": "address payable"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1560,
                                  "type": "msg",
                                  "value": "msg"
                                },
                                "id": 115,
                                "name": "Identifier",
                                "src": "3970:3:0"
                              }
                            ],
                            "id": 116,
                            "name": "MemberAccess",
                            "src": "3970:10:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 70,
                              "type": "address",
                              "value": "_owner"
                            },
                            "id": 117,
                            "name": "Identifier",
                            "src": "3984:6:0"
                          }
                        ],
                        "id": 118,
                        "name": "BinaryOperation",
                        "src": "3970:20:0"
                      }
                    ],
                    "id": 119,
                    "name": "Return",
                    "src": "3963:27:0"
                  }
                ],
                "id": 120,
                "name": "Block",
                "src": "3953:44:0"
              }
            ],
            "id": 121,
            "name": "FunctionDefinition",
            "src": "3907:90:0"
          },
          {
            "attributes": {
              "documentation": "@dev Leaves the contract without owner. It will not be possible to call\n`onlyOwner` functions anymore. Can only be called by the current owner.\n     * > Note: Renouncing ownership will leave the contract without an owner,\nthereby removing any functionality that is only available to the owner.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "name": "renounceOwnership",
              "scope": 177,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 122,
                "name": "ParameterList",
                "src": "4367:2:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 125,
                "name": "ParameterList",
                "src": "4387:0:0"
              },
              {
                "attributes": {
                  "arguments": null
                },
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 110,
                      "type": "modifier ()",
                      "value": "onlyOwner"
                    },
                    "id": 123,
                    "name": "Identifier",
                    "src": "4377:9:0"
                  }
                ],
                "id": 124,
                "name": "ModifierInvocation",
                "src": "4377:9:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 76,
                              "type": "function (address,address)",
                              "value": "OwnershipTransferred"
                            },
                            "id": 126,
                            "name": "Identifier",
                            "src": "4402:20:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 70,
                              "type": "address",
                              "value": "_owner"
                            },
                            "id": 127,
                            "name": "Identifier",
                            "src": "4423:6:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "address payable",
                              "type_conversion": true
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "type": "type(address)",
                                  "value": "address"
                                },
                                "id": 128,
                                "name": "ElementaryTypeNameExpression",
                                "src": "4431:7:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "hexvalue": "30",
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "subdenomination": null,
                                  "token": "number",
                                  "type": "int_const 0",
                                  "value": "0"
                                },
                                "id": 129,
                                "name": "Literal",
                                "src": "4439:1:0"
                              }
                            ],
                            "id": 130,
                            "name": "FunctionCall",
                            "src": "4431:10:0"
                          }
                        ],
                        "id": 131,
                        "name": "FunctionCall",
                        "src": "4402:40:0"
                      }
                    ],
                    "id": 132,
                    "name": "EmitStatement",
                    "src": "4397:45:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "address"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 70,
                              "type": "address",
                              "value": "_owner"
                            },
                            "id": 133,
                            "name": "Identifier",
                            "src": "4452:6:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "address payable",
                              "type_conversion": true
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "type": "type(address)",
                                  "value": "address"
                                },
                                "id": 134,
                                "name": "ElementaryTypeNameExpression",
                                "src": "4461:7:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "hexvalue": "30",
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "subdenomination": null,
                                  "token": "number",
                                  "type": "int_const 0",
                                  "value": "0"
                                },
                                "id": 135,
                                "name": "Literal",
                                "src": "4469:1:0"
                              }
                            ],
                            "id": 136,
                            "name": "FunctionCall",
                            "src": "4461:10:0"
                          }
                        ],
                        "id": 137,
                        "name": "Assignment",
                        "src": "4452:19:0"
                      }
                    ],
                    "id": 138,
                    "name": "ExpressionStatement",
                    "src": "4452:19:0"
                  }
                ],
                "id": 139,
                "name": "Block",
                "src": "4387:91:0"
              }
            ],
            "id": 140,
            "name": "FunctionDefinition",
            "src": "4341:137:0"
          },
          {
            "attributes": {
              "documentation": "@dev Transfers ownership of the contract to a new account (`newOwner`).\nCan only be called by the current owner.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "name": "transferOwnership",
              "scope": 177,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "public"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "newOwner",
                      "scope": 152,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 141,
                        "name": "ElementaryTypeName",
                        "src": "4654:7:0"
                      }
                    ],
                    "id": 142,
                    "name": "VariableDeclaration",
                    "src": "4654:16:0"
                  }
                ],
                "id": 143,
                "name": "ParameterList",
                "src": "4653:18:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 146,
                "name": "ParameterList",
                "src": "4689:0:0"
              },
              {
                "attributes": {
                  "arguments": null
                },
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 110,
                      "type": "modifier ()",
                      "value": "onlyOwner"
                    },
                    "id": 144,
                    "name": "Identifier",
                    "src": "4679:9:0"
                  }
                ],
                "id": 145,
                "name": "ModifierInvocation",
                "src": "4679:9:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 176,
                              "type": "function (address)",
                              "value": "_transferOwnership"
                            },
                            "id": 147,
                            "name": "Identifier",
                            "src": "4699:18:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 142,
                              "type": "address",
                              "value": "newOwner"
                            },
                            "id": 148,
                            "name": "Identifier",
                            "src": "4718:8:0"
                          }
                        ],
                        "id": 149,
                        "name": "FunctionCall",
                        "src": "4699:28:0"
                      }
                    ],
                    "id": 150,
                    "name": "ExpressionStatement",
                    "src": "4699:28:0"
                  }
                ],
                "id": 151,
                "name": "Block",
                "src": "4689:45:0"
              }
            ],
            "id": 152,
            "name": "FunctionDefinition",
            "src": "4627:107:0"
          },
          {
            "attributes": {
              "documentation": "@dev Transfers ownership of the contract to a new account (`newOwner`).",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "_transferOwnership",
              "scope": 177,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "newOwner",
                      "scope": 176,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 153,
                        "name": "ElementaryTypeName",
                        "src": "4863:7:0"
                      }
                    ],
                    "id": 154,
                    "name": "VariableDeclaration",
                    "src": "4863:16:0"
                  }
                ],
                "id": 155,
                "name": "ParameterList",
                "src": "4862:18:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 156,
                "name": "ParameterList",
                "src": "4890:0:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe",
                                  "typeString": "literal_string \"Ownable: new owner is the zero address\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 157,
                            "name": "Identifier",
                            "src": "4900:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": "!=",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 154,
                                  "type": "address",
                                  "value": "newOwner"
                                },
                                "id": 158,
                                "name": "Identifier",
                                "src": "4908:8:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "address payable",
                                  "type_conversion": true
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        }
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "type": "type(address)",
                                      "value": "address"
                                    },
                                    "id": 159,
                                    "name": "ElementaryTypeNameExpression",
                                    "src": "4920:7:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "hexvalue": "30",
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "subdenomination": null,
                                      "token": "number",
                                      "type": "int_const 0",
                                      "value": "0"
                                    },
                                    "id": 160,
                                    "name": "Literal",
                                    "src": "4928:1:0"
                                  }
                                ],
                                "id": 161,
                                "name": "FunctionCall",
                                "src": "4920:10:0"
                              }
                            ],
                            "id": 162,
                            "name": "BinaryOperation",
                            "src": "4908:22:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"Ownable: new owner is the zero address\"",
                              "value": "Ownable: new owner is the zero address"
                            },
                            "id": 163,
                            "name": "Literal",
                            "src": "4932:40:0"
                          }
                        ],
                        "id": 164,
                        "name": "FunctionCall",
                        "src": "4900:73:0"
                      }
                    ],
                    "id": 165,
                    "name": "ExpressionStatement",
                    "src": "4900:73:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 76,
                              "type": "function (address,address)",
                              "value": "OwnershipTransferred"
                            },
                            "id": 166,
                            "name": "Identifier",
                            "src": "4988:20:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 70,
                              "type": "address",
                              "value": "_owner"
                            },
                            "id": 167,
                            "name": "Identifier",
                            "src": "5009:6:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 154,
                              "type": "address",
                              "value": "newOwner"
                            },
                            "id": 168,
                            "name": "Identifier",
                            "src": "5017:8:0"
                          }
                        ],
                        "id": 169,
                        "name": "FunctionCall",
                        "src": "4988:38:0"
                      }
                    ],
                    "id": 170,
                    "name": "EmitStatement",
                    "src": "4983:43:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "address"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 70,
                              "type": "address",
                              "value": "_owner"
                            },
                            "id": 171,
                            "name": "Identifier",
                            "src": "5036:6:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 154,
                              "type": "address",
                              "value": "newOwner"
                            },
                            "id": 172,
                            "name": "Identifier",
                            "src": "5045:8:0"
                          }
                        ],
                        "id": 173,
                        "name": "Assignment",
                        "src": "5036:17:0"
                      }
                    ],
                    "id": 174,
                    "name": "ExpressionStatement",
                    "src": "5036:17:0"
                  }
                ],
                "id": 175,
                "name": "Block",
                "src": "4890:170:0"
              }
            ],
            "id": 176,
            "name": "FunctionDefinition",
            "src": "4835:225:0"
          }
        ],
        "id": 177,
        "name": "ContractDefinition",
        "src": "3128:1934:0"
      },
      {
        "attributes": {
          "baseContracts": [
            null
          ],
          "contractDependencies": [
            null
          ],
          "contractKind": "library",
          "documentation": "@dev Wrappers over Solidity's arithmetic operations with added overflow\nchecks.\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\nin bugs, because programmers usually assume that an overflow raises an\nerror, which is the standard behavior in high level programming languages.\n`SafeMath` restores this intuition by reverting the transaction when an\noperation overflows.\n * Using this library instead of the unchecked operations eliminates an entire\nclass of bugs, so it's recommended to use it always.",
          "fullyImplemented": true,
          "linearizedBaseContracts": [
            308
          ],
          "name": "SafeMath",
          "scope": 1546
        },
        "children": [
          {
            "attributes": {
              "documentation": "@dev Returns the addition of two unsigned integers, reverting on\noverflow.\n     * Counterpart to Solidity's `+` operator.\n     * Requirements:\n- Addition cannot overflow.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "add",
              "scope": 308,
              "stateMutability": "pure",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "a",
                      "scope": 202,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 178,
                        "name": "ElementaryTypeName",
                        "src": "5886:7:0"
                      }
                    ],
                    "id": 179,
                    "name": "VariableDeclaration",
                    "src": "5886:9:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "b",
                      "scope": 202,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 180,
                        "name": "ElementaryTypeName",
                        "src": "5897:7:0"
                      }
                    ],
                    "id": 181,
                    "name": "VariableDeclaration",
                    "src": "5897:9:0"
                  }
                ],
                "id": 182,
                "name": "ParameterList",
                "src": "5885:22:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 202,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 183,
                        "name": "ElementaryTypeName",
                        "src": "5931:7:0"
                      }
                    ],
                    "id": 184,
                    "name": "VariableDeclaration",
                    "src": "5931:7:0"
                  }
                ],
                "id": 185,
                "name": "ParameterList",
                "src": "5930:9:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "assignments": [
                        187
                      ]
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "name": "c",
                          "scope": 201,
                          "stateVariable": false,
                          "storageLocation": "default",
                          "type": "uint256",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "name": "uint256",
                              "type": "uint256"
                            },
                            "id": 186,
                            "name": "ElementaryTypeName",
                            "src": "5950:7:0"
                          }
                        ],
                        "id": 187,
                        "name": "VariableDeclaration",
                        "src": "5950:9:0"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "+",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 179,
                              "type": "uint256",
                              "value": "a"
                            },
                            "id": 188,
                            "name": "Identifier",
                            "src": "5962:1:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 181,
                              "type": "uint256",
                              "value": "b"
                            },
                            "id": 189,
                            "name": "Identifier",
                            "src": "5966:1:0"
                          }
                        ],
                        "id": 190,
                        "name": "BinaryOperation",
                        "src": "5962:5:0"
                      }
                    ],
                    "id": 191,
                    "name": "VariableDeclarationStatement",
                    "src": "5950:17:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_30cc447bcc13b3e22b45cef0dd9b0b514842d836dd9b6eb384e20dedfb47723a",
                                  "typeString": "literal_string \"SafeMath: addition overflow\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 192,
                            "name": "Identifier",
                            "src": "5977:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": ">=",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 187,
                                  "type": "uint256",
                                  "value": "c"
                                },
                                "id": 193,
                                "name": "Identifier",
                                "src": "5985:1:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 179,
                                  "type": "uint256",
                                  "value": "a"
                                },
                                "id": 194,
                                "name": "Identifier",
                                "src": "5990:1:0"
                              }
                            ],
                            "id": 195,
                            "name": "BinaryOperation",
                            "src": "5985:6:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "536166654d6174683a206164646974696f6e206f766572666c6f77",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"SafeMath: addition overflow\"",
                              "value": "SafeMath: addition overflow"
                            },
                            "id": 196,
                            "name": "Literal",
                            "src": "5993:29:0"
                          }
                        ],
                        "id": 197,
                        "name": "FunctionCall",
                        "src": "5977:46:0"
                      }
                    ],
                    "id": 198,
                    "name": "ExpressionStatement",
                    "src": "5977:46:0"
                  },
                  {
                    "attributes": {
                      "functionReturnParameters": 185
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "overloadedDeclarations": [
                            null
                          ],
                          "referencedDeclaration": 187,
                          "type": "uint256",
                          "value": "c"
                        },
                        "id": 199,
                        "name": "Identifier",
                        "src": "6041:1:0"
                      }
                    ],
                    "id": 200,
                    "name": "Return",
                    "src": "6034:8:0"
                  }
                ],
                "id": 201,
                "name": "Block",
                "src": "5940:109:0"
              }
            ],
            "id": 202,
            "name": "FunctionDefinition",
            "src": "5873:176:0"
          },
          {
            "attributes": {
              "documentation": "@dev Returns the subtraction of two unsigned integers, reverting on\noverflow (when the result is negative).\n     * Counterpart to Solidity's `-` operator.\n     * Requirements:\n- Subtraction cannot overflow.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "sub",
              "scope": 308,
              "stateMutability": "pure",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "a",
                      "scope": 227,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 203,
                        "name": "ElementaryTypeName",
                        "src": "6326:7:0"
                      }
                    ],
                    "id": 204,
                    "name": "VariableDeclaration",
                    "src": "6326:9:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "b",
                      "scope": 227,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 205,
                        "name": "ElementaryTypeName",
                        "src": "6337:7:0"
                      }
                    ],
                    "id": 206,
                    "name": "VariableDeclaration",
                    "src": "6337:9:0"
                  }
                ],
                "id": 207,
                "name": "ParameterList",
                "src": "6325:22:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 227,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 208,
                        "name": "ElementaryTypeName",
                        "src": "6371:7:0"
                      }
                    ],
                    "id": 209,
                    "name": "VariableDeclaration",
                    "src": "6371:7:0"
                  }
                ],
                "id": 210,
                "name": "ParameterList",
                "src": "6370:9:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_50b058e9b5320e58880d88223c9801cd9eecdcf90323d5c2318bc1b6b916e862",
                                  "typeString": "literal_string \"SafeMath: subtraction overflow\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 211,
                            "name": "Identifier",
                            "src": "6390:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": "<=",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 206,
                                  "type": "uint256",
                                  "value": "b"
                                },
                                "id": 212,
                                "name": "Identifier",
                                "src": "6398:1:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 204,
                                  "type": "uint256",
                                  "value": "a"
                                },
                                "id": 213,
                                "name": "Identifier",
                                "src": "6403:1:0"
                              }
                            ],
                            "id": 214,
                            "name": "BinaryOperation",
                            "src": "6398:6:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "536166654d6174683a207375627472616374696f6e206f766572666c6f77",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"SafeMath: subtraction overflow\"",
                              "value": "SafeMath: subtraction overflow"
                            },
                            "id": 215,
                            "name": "Literal",
                            "src": "6406:32:0"
                          }
                        ],
                        "id": 216,
                        "name": "FunctionCall",
                        "src": "6390:49:0"
                      }
                    ],
                    "id": 217,
                    "name": "ExpressionStatement",
                    "src": "6390:49:0"
                  },
                  {
                    "attributes": {
                      "assignments": [
                        219
                      ]
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "name": "c",
                          "scope": 226,
                          "stateVariable": false,
                          "storageLocation": "default",
                          "type": "uint256",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "name": "uint256",
                              "type": "uint256"
                            },
                            "id": 218,
                            "name": "ElementaryTypeName",
                            "src": "6449:7:0"
                          }
                        ],
                        "id": 219,
                        "name": "VariableDeclaration",
                        "src": "6449:9:0"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "-",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 204,
                              "type": "uint256",
                              "value": "a"
                            },
                            "id": 220,
                            "name": "Identifier",
                            "src": "6461:1:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 206,
                              "type": "uint256",
                              "value": "b"
                            },
                            "id": 221,
                            "name": "Identifier",
                            "src": "6465:1:0"
                          }
                        ],
                        "id": 222,
                        "name": "BinaryOperation",
                        "src": "6461:5:0"
                      }
                    ],
                    "id": 223,
                    "name": "VariableDeclarationStatement",
                    "src": "6449:17:0"
                  },
                  {
                    "attributes": {
                      "functionReturnParameters": 210
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "overloadedDeclarations": [
                            null
                          ],
                          "referencedDeclaration": 219,
                          "type": "uint256",
                          "value": "c"
                        },
                        "id": 224,
                        "name": "Identifier",
                        "src": "6484:1:0"
                      }
                    ],
                    "id": 225,
                    "name": "Return",
                    "src": "6477:8:0"
                  }
                ],
                "id": 226,
                "name": "Block",
                "src": "6380:112:0"
              }
            ],
            "id": 227,
            "name": "FunctionDefinition",
            "src": "6313:179:0"
          },
          {
            "attributes": {
              "documentation": "@dev Returns the multiplication of two unsigned integers, reverting on\noverflow.\n     * Counterpart to Solidity's `*` operator.\n     * Requirements:\n- Multiplication cannot overflow.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "mul",
              "scope": 308,
              "stateMutability": "pure",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "a",
                      "scope": 261,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 228,
                        "name": "ElementaryTypeName",
                        "src": "6745:7:0"
                      }
                    ],
                    "id": 229,
                    "name": "VariableDeclaration",
                    "src": "6745:9:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "b",
                      "scope": 261,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 230,
                        "name": "ElementaryTypeName",
                        "src": "6756:7:0"
                      }
                    ],
                    "id": 231,
                    "name": "VariableDeclaration",
                    "src": "6756:9:0"
                  }
                ],
                "id": 232,
                "name": "ParameterList",
                "src": "6744:22:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 261,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 233,
                        "name": "ElementaryTypeName",
                        "src": "6790:7:0"
                      }
                    ],
                    "id": 234,
                    "name": "VariableDeclaration",
                    "src": "6790:7:0"
                  }
                ],
                "id": 235,
                "name": "ParameterList",
                "src": "6789:9:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "falseBody": null
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "==",
                          "type": "bool"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 229,
                              "type": "uint256",
                              "value": "a"
                            },
                            "id": 236,
                            "name": "Identifier",
                            "src": "7030:1:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "30",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "number",
                              "type": "int_const 0",
                              "value": "0"
                            },
                            "id": 237,
                            "name": "Literal",
                            "src": "7035:1:0"
                          }
                        ],
                        "id": 238,
                        "name": "BinaryOperation",
                        "src": "7030:6:0"
                      },
                      {
                        "children": [
                          {
                            "attributes": {
                              "functionReturnParameters": 235
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "hexvalue": "30",
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "subdenomination": null,
                                  "token": "number",
                                  "type": "int_const 0",
                                  "value": "0"
                                },
                                "id": 239,
                                "name": "Literal",
                                "src": "7059:1:0"
                              }
                            ],
                            "id": 240,
                            "name": "Return",
                            "src": "7052:8:0"
                          }
                        ],
                        "id": 241,
                        "name": "Block",
                        "src": "7038:33:0"
                      }
                    ],
                    "id": 242,
                    "name": "IfStatement",
                    "src": "7026:45:0"
                  },
                  {
                    "attributes": {
                      "assignments": [
                        244
                      ]
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "name": "c",
                          "scope": 260,
                          "stateVariable": false,
                          "storageLocation": "default",
                          "type": "uint256",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "name": "uint256",
                              "type": "uint256"
                            },
                            "id": 243,
                            "name": "ElementaryTypeName",
                            "src": "7081:7:0"
                          }
                        ],
                        "id": 244,
                        "name": "VariableDeclaration",
                        "src": "7081:9:0"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "*",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 229,
                              "type": "uint256",
                              "value": "a"
                            },
                            "id": 245,
                            "name": "Identifier",
                            "src": "7093:1:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 231,
                              "type": "uint256",
                              "value": "b"
                            },
                            "id": 246,
                            "name": "Identifier",
                            "src": "7097:1:0"
                          }
                        ],
                        "id": 247,
                        "name": "BinaryOperation",
                        "src": "7093:5:0"
                      }
                    ],
                    "id": 248,
                    "name": "VariableDeclarationStatement",
                    "src": "7081:17:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_9113bb53c2876a3805b2c9242029423fc540a728243ce887ab24c82cf119fba3",
                                  "typeString": "literal_string \"SafeMath: multiplication overflow\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 249,
                            "name": "Identifier",
                            "src": "7108:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": "==",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "operator": "/",
                                  "type": "uint256"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 244,
                                      "type": "uint256",
                                      "value": "c"
                                    },
                                    "id": 250,
                                    "name": "Identifier",
                                    "src": "7116:1:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 229,
                                      "type": "uint256",
                                      "value": "a"
                                    },
                                    "id": 251,
                                    "name": "Identifier",
                                    "src": "7120:1:0"
                                  }
                                ],
                                "id": 252,
                                "name": "BinaryOperation",
                                "src": "7116:5:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 231,
                                  "type": "uint256",
                                  "value": "b"
                                },
                                "id": 253,
                                "name": "Identifier",
                                "src": "7125:1:0"
                              }
                            ],
                            "id": 254,
                            "name": "BinaryOperation",
                            "src": "7116:10:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"SafeMath: multiplication overflow\"",
                              "value": "SafeMath: multiplication overflow"
                            },
                            "id": 255,
                            "name": "Literal",
                            "src": "7128:35:0"
                          }
                        ],
                        "id": 256,
                        "name": "FunctionCall",
                        "src": "7108:56:0"
                      }
                    ],
                    "id": 257,
                    "name": "ExpressionStatement",
                    "src": "7108:56:0"
                  },
                  {
                    "attributes": {
                      "functionReturnParameters": 235
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "overloadedDeclarations": [
                            null
                          ],
                          "referencedDeclaration": 244,
                          "type": "uint256",
                          "value": "c"
                        },
                        "id": 258,
                        "name": "Identifier",
                        "src": "7182:1:0"
                      }
                    ],
                    "id": 259,
                    "name": "Return",
                    "src": "7175:8:0"
                  }
                ],
                "id": 260,
                "name": "Block",
                "src": "6799:391:0"
              }
            ],
            "id": 261,
            "name": "FunctionDefinition",
            "src": "6732:458:0"
          },
          {
            "attributes": {
              "documentation": "@dev Returns the integer division of two unsigned integers. Reverts on\ndivision 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\nuses an invalid opcode to revert (consuming all remaining gas).\n     * Requirements:\n- The divisor cannot be zero.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "div",
              "scope": 308,
              "stateMutability": "pure",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "a",
                      "scope": 286,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 262,
                        "name": "ElementaryTypeName",
                        "src": "7658:7:0"
                      }
                    ],
                    "id": 263,
                    "name": "VariableDeclaration",
                    "src": "7658:9:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "b",
                      "scope": 286,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 264,
                        "name": "ElementaryTypeName",
                        "src": "7669:7:0"
                      }
                    ],
                    "id": 265,
                    "name": "VariableDeclaration",
                    "src": "7669:9:0"
                  }
                ],
                "id": 266,
                "name": "ParameterList",
                "src": "7657:22:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 286,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 267,
                        "name": "ElementaryTypeName",
                        "src": "7703:7:0"
                      }
                    ],
                    "id": 268,
                    "name": "VariableDeclaration",
                    "src": "7703:7:0"
                  }
                ],
                "id": 269,
                "name": "ParameterList",
                "src": "7702:9:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_5b7cc70dda4dc2143e5adb63bd5d1f349504f461dbdfd9bc76fac1f8ca6d019f",
                                  "typeString": "literal_string \"SafeMath: division by zero\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 270,
                            "name": "Identifier",
                            "src": "7788:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": ">",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 265,
                                  "type": "uint256",
                                  "value": "b"
                                },
                                "id": 271,
                                "name": "Identifier",
                                "src": "7796:1:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "hexvalue": "30",
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "subdenomination": null,
                                  "token": "number",
                                  "type": "int_const 0",
                                  "value": "0"
                                },
                                "id": 272,
                                "name": "Literal",
                                "src": "7800:1:0"
                              }
                            ],
                            "id": 273,
                            "name": "BinaryOperation",
                            "src": "7796:5:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "536166654d6174683a206469766973696f6e206279207a65726f",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"SafeMath: division by zero\"",
                              "value": "SafeMath: division by zero"
                            },
                            "id": 274,
                            "name": "Literal",
                            "src": "7803:28:0"
                          }
                        ],
                        "id": 275,
                        "name": "FunctionCall",
                        "src": "7788:44:0"
                      }
                    ],
                    "id": 276,
                    "name": "ExpressionStatement",
                    "src": "7788:44:0"
                  },
                  {
                    "attributes": {
                      "assignments": [
                        278
                      ]
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "name": "c",
                          "scope": 285,
                          "stateVariable": false,
                          "storageLocation": "default",
                          "type": "uint256",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "name": "uint256",
                              "type": "uint256"
                            },
                            "id": 277,
                            "name": "ElementaryTypeName",
                            "src": "7842:7:0"
                          }
                        ],
                        "id": 278,
                        "name": "VariableDeclaration",
                        "src": "7842:9:0"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "/",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 263,
                              "type": "uint256",
                              "value": "a"
                            },
                            "id": 279,
                            "name": "Identifier",
                            "src": "7854:1:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 265,
                              "type": "uint256",
                              "value": "b"
                            },
                            "id": 280,
                            "name": "Identifier",
                            "src": "7858:1:0"
                          }
                        ],
                        "id": 281,
                        "name": "BinaryOperation",
                        "src": "7854:5:0"
                      }
                    ],
                    "id": 282,
                    "name": "VariableDeclarationStatement",
                    "src": "7842:17:0"
                  },
                  {
                    "attributes": {
                      "functionReturnParameters": 269
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "overloadedDeclarations": [
                            null
                          ],
                          "referencedDeclaration": 278,
                          "type": "uint256",
                          "value": "c"
                        },
                        "id": 283,
                        "name": "Identifier",
                        "src": "7963:1:0"
                      }
                    ],
                    "id": 284,
                    "name": "Return",
                    "src": "7956:8:0"
                  }
                ],
                "id": 285,
                "name": "Block",
                "src": "7712:259:0"
              }
            ],
            "id": 286,
            "name": "FunctionDefinition",
            "src": "7645:326:0"
          },
          {
            "attributes": {
              "documentation": "@dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\nReverts when dividing by zero.\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\nopcode (which leaves remaining gas untouched) while Solidity uses an\ninvalid opcode to revert (consuming all remaining gas).\n     * Requirements:\n- The divisor cannot be zero.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "mod",
              "scope": 308,
              "stateMutability": "pure",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "a",
                      "scope": 307,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 287,
                        "name": "ElementaryTypeName",
                        "src": "8428:7:0"
                      }
                    ],
                    "id": 288,
                    "name": "VariableDeclaration",
                    "src": "8428:9:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "b",
                      "scope": 307,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 289,
                        "name": "ElementaryTypeName",
                        "src": "8439:7:0"
                      }
                    ],
                    "id": 290,
                    "name": "VariableDeclaration",
                    "src": "8439:9:0"
                  }
                ],
                "id": 291,
                "name": "ParameterList",
                "src": "8427:22:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 307,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 292,
                        "name": "ElementaryTypeName",
                        "src": "8473:7:0"
                      }
                    ],
                    "id": 293,
                    "name": "VariableDeclaration",
                    "src": "8473:7:0"
                  }
                ],
                "id": 294,
                "name": "ParameterList",
                "src": "8472:9:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_726e51f7b81fce0a68f5f214f445e275313b20b1633f08ce954ee39abf8d7832",
                                  "typeString": "literal_string \"SafeMath: modulo by zero\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 295,
                            "name": "Identifier",
                            "src": "8492:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": "!=",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 290,
                                  "type": "uint256",
                                  "value": "b"
                                },
                                "id": 296,
                                "name": "Identifier",
                                "src": "8500:1:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "hexvalue": "30",
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "subdenomination": null,
                                  "token": "number",
                                  "type": "int_const 0",
                                  "value": "0"
                                },
                                "id": 297,
                                "name": "Literal",
                                "src": "8505:1:0"
                              }
                            ],
                            "id": 298,
                            "name": "BinaryOperation",
                            "src": "8500:6:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "536166654d6174683a206d6f64756c6f206279207a65726f",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"SafeMath: modulo by zero\"",
                              "value": "SafeMath: modulo by zero"
                            },
                            "id": 299,
                            "name": "Literal",
                            "src": "8508:26:0"
                          }
                        ],
                        "id": 300,
                        "name": "FunctionCall",
                        "src": "8492:43:0"
                      }
                    ],
                    "id": 301,
                    "name": "ExpressionStatement",
                    "src": "8492:43:0"
                  },
                  {
                    "attributes": {
                      "functionReturnParameters": 294
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "%",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 288,
                              "type": "uint256",
                              "value": "a"
                            },
                            "id": 302,
                            "name": "Identifier",
                            "src": "8552:1:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 290,
                              "type": "uint256",
                              "value": "b"
                            },
                            "id": 303,
                            "name": "Identifier",
                            "src": "8556:1:0"
                          }
                        ],
                        "id": 304,
                        "name": "BinaryOperation",
                        "src": "8552:5:0"
                      }
                    ],
                    "id": 305,
                    "name": "Return",
                    "src": "8545:12:0"
                  }
                ],
                "id": 306,
                "name": "Block",
                "src": "8482:82:0"
              }
            ],
            "id": 307,
            "name": "FunctionDefinition",
            "src": "8415:149:0"
          }
        ],
        "id": 308,
        "name": "ContractDefinition",
        "src": "5628:2938:0"
      },
      {
        "attributes": {
          "baseContracts": [
            null
          ],
          "contractDependencies": [
            null
          ],
          "contractKind": "library",
          "documentation": "@dev Standard math utilities missing in the Solidity language.",
          "fullyImplemented": true,
          "linearizedBaseContracts": [
            375
          ],
          "name": "Math",
          "scope": 1546
        },
        "children": [
          {
            "attributes": {
              "documentation": "@dev Returns the largest of two numbers.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "max",
              "scope": 375,
              "stateMutability": "pure",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "a",
                      "scope": 325,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 309,
                        "name": "ElementaryTypeName",
                        "src": "8738:7:0"
                      }
                    ],
                    "id": 310,
                    "name": "VariableDeclaration",
                    "src": "8738:9:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "b",
                      "scope": 325,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 311,
                        "name": "ElementaryTypeName",
                        "src": "8749:7:0"
                      }
                    ],
                    "id": 312,
                    "name": "VariableDeclaration",
                    "src": "8749:9:0"
                  }
                ],
                "id": 313,
                "name": "ParameterList",
                "src": "8737:22:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 325,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 314,
                        "name": "ElementaryTypeName",
                        "src": "8783:7:0"
                      }
                    ],
                    "id": 315,
                    "name": "VariableDeclaration",
                    "src": "8783:7:0"
                  }
                ],
                "id": 316,
                "name": "ParameterList",
                "src": "8782:9:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 316
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": ">=",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 310,
                                  "type": "uint256",
                                  "value": "a"
                                },
                                "id": 317,
                                "name": "Identifier",
                                "src": "8809:1:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 312,
                                  "type": "uint256",
                                  "value": "b"
                                },
                                "id": 318,
                                "name": "Identifier",
                                "src": "8814:1:0"
                              }
                            ],
                            "id": 319,
                            "name": "BinaryOperation",
                            "src": "8809:6:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 310,
                              "type": "uint256",
                              "value": "a"
                            },
                            "id": 320,
                            "name": "Identifier",
                            "src": "8818:1:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 312,
                              "type": "uint256",
                              "value": "b"
                            },
                            "id": 321,
                            "name": "Identifier",
                            "src": "8822:1:0"
                          }
                        ],
                        "id": 322,
                        "name": "Conditional",
                        "src": "8809:14:0"
                      }
                    ],
                    "id": 323,
                    "name": "Return",
                    "src": "8802:21:0"
                  }
                ],
                "id": 324,
                "name": "Block",
                "src": "8792:38:0"
              }
            ],
            "id": 325,
            "name": "FunctionDefinition",
            "src": "8725:105:0"
          },
          {
            "attributes": {
              "documentation": "@dev Returns the smallest of two numbers.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "min",
              "scope": 375,
              "stateMutability": "pure",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "a",
                      "scope": 342,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 326,
                        "name": "ElementaryTypeName",
                        "src": "8914:7:0"
                      }
                    ],
                    "id": 327,
                    "name": "VariableDeclaration",
                    "src": "8914:9:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "b",
                      "scope": 342,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 328,
                        "name": "ElementaryTypeName",
                        "src": "8925:7:0"
                      }
                    ],
                    "id": 329,
                    "name": "VariableDeclaration",
                    "src": "8925:9:0"
                  }
                ],
                "id": 330,
                "name": "ParameterList",
                "src": "8913:22:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 342,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 331,
                        "name": "ElementaryTypeName",
                        "src": "8959:7:0"
                      }
                    ],
                    "id": 332,
                    "name": "VariableDeclaration",
                    "src": "8959:7:0"
                  }
                ],
                "id": 333,
                "name": "ParameterList",
                "src": "8958:9:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 333
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": "<",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 327,
                                  "type": "uint256",
                                  "value": "a"
                                },
                                "id": 334,
                                "name": "Identifier",
                                "src": "8985:1:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 329,
                                  "type": "uint256",
                                  "value": "b"
                                },
                                "id": 335,
                                "name": "Identifier",
                                "src": "8989:1:0"
                              }
                            ],
                            "id": 336,
                            "name": "BinaryOperation",
                            "src": "8985:5:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 327,
                              "type": "uint256",
                              "value": "a"
                            },
                            "id": 337,
                            "name": "Identifier",
                            "src": "8993:1:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 329,
                              "type": "uint256",
                              "value": "b"
                            },
                            "id": 338,
                            "name": "Identifier",
                            "src": "8997:1:0"
                          }
                        ],
                        "id": 339,
                        "name": "Conditional",
                        "src": "8985:13:0"
                      }
                    ],
                    "id": 340,
                    "name": "Return",
                    "src": "8978:20:0"
                  }
                ],
                "id": 341,
                "name": "Block",
                "src": "8968:37:0"
              }
            ],
            "id": 342,
            "name": "FunctionDefinition",
            "src": "8901:104:0"
          },
          {
            "attributes": {
              "documentation": "@dev Returns the average of two numbers. The result is rounded towards\nzero.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "average",
              "scope": 375,
              "stateMutability": "pure",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "a",
                      "scope": 374,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 343,
                        "name": "ElementaryTypeName",
                        "src": "9135:7:0"
                      }
                    ],
                    "id": 344,
                    "name": "VariableDeclaration",
                    "src": "9135:9:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "b",
                      "scope": 374,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 345,
                        "name": "ElementaryTypeName",
                        "src": "9146:7:0"
                      }
                    ],
                    "id": 346,
                    "name": "VariableDeclaration",
                    "src": "9146:9:0"
                  }
                ],
                "id": 347,
                "name": "ParameterList",
                "src": "9134:22:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 374,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 348,
                        "name": "ElementaryTypeName",
                        "src": "9180:7:0"
                      }
                    ],
                    "id": 349,
                    "name": "VariableDeclaration",
                    "src": "9180:7:0"
                  }
                ],
                "id": 350,
                "name": "ParameterList",
                "src": "9179:9:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 350
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "+",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": "+",
                              "type": "uint256"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isInlineArray": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "type": "uint256"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "operator": "/",
                                      "type": "uint256"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 344,
                                          "type": "uint256",
                                          "value": "a"
                                        },
                                        "id": 351,
                                        "name": "Identifier",
                                        "src": "9261:1:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "hexvalue": "32",
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "subdenomination": null,
                                          "token": "number",
                                          "type": "int_const 2",
                                          "value": "2"
                                        },
                                        "id": 352,
                                        "name": "Literal",
                                        "src": "9265:1:0"
                                      }
                                    ],
                                    "id": 353,
                                    "name": "BinaryOperation",
                                    "src": "9261:5:0"
                                  }
                                ],
                                "id": 354,
                                "name": "TupleExpression",
                                "src": "9260:7:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isInlineArray": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "type": "uint256"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "operator": "/",
                                      "type": "uint256"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 346,
                                          "type": "uint256",
                                          "value": "b"
                                        },
                                        "id": 355,
                                        "name": "Identifier",
                                        "src": "9271:1:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "hexvalue": "32",
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "subdenomination": null,
                                          "token": "number",
                                          "type": "int_const 2",
                                          "value": "2"
                                        },
                                        "id": 356,
                                        "name": "Literal",
                                        "src": "9275:1:0"
                                      }
                                    ],
                                    "id": 357,
                                    "name": "BinaryOperation",
                                    "src": "9271:5:0"
                                  }
                                ],
                                "id": 358,
                                "name": "TupleExpression",
                                "src": "9270:7:0"
                              }
                            ],
                            "id": 359,
                            "name": "BinaryOperation",
                            "src": "9260:17:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isInlineArray": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "type": "uint256"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "operator": "/",
                                  "type": "uint256"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isInlineArray": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "type": "uint256"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "operator": "+",
                                          "type": "uint256"
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "commonType": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              },
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "operator": "%",
                                              "type": "uint256"
                                            },
                                            "children": [
                                              {
                                                "attributes": {
                                                  "argumentTypes": null,
                                                  "overloadedDeclarations": [
                                                    null
                                                  ],
                                                  "referencedDeclaration": 344,
                                                  "type": "uint256",
                                                  "value": "a"
                                                },
                                                "id": 360,
                                                "name": "Identifier",
                                                "src": "9282:1:0"
                                              },
                                              {
                                                "attributes": {
                                                  "argumentTypes": null,
                                                  "hexvalue": "32",
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "lValueRequested": false,
                                                  "subdenomination": null,
                                                  "token": "number",
                                                  "type": "int_const 2",
                                                  "value": "2"
                                                },
                                                "id": 361,
                                                "name": "Literal",
                                                "src": "9286:1:0"
                                              }
                                            ],
                                            "id": 362,
                                            "name": "BinaryOperation",
                                            "src": "9282:5:0"
                                          },
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "commonType": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              },
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "operator": "%",
                                              "type": "uint256"
                                            },
                                            "children": [
                                              {
                                                "attributes": {
                                                  "argumentTypes": null,
                                                  "overloadedDeclarations": [
                                                    null
                                                  ],
                                                  "referencedDeclaration": 346,
                                                  "type": "uint256",
                                                  "value": "b"
                                                },
                                                "id": 363,
                                                "name": "Identifier",
                                                "src": "9290:1:0"
                                              },
                                              {
                                                "attributes": {
                                                  "argumentTypes": null,
                                                  "hexvalue": "32",
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "lValueRequested": false,
                                                  "subdenomination": null,
                                                  "token": "number",
                                                  "type": "int_const 2",
                                                  "value": "2"
                                                },
                                                "id": 364,
                                                "name": "Literal",
                                                "src": "9294:1:0"
                                              }
                                            ],
                                            "id": 365,
                                            "name": "BinaryOperation",
                                            "src": "9290:5:0"
                                          }
                                        ],
                                        "id": 366,
                                        "name": "BinaryOperation",
                                        "src": "9282:13:0"
                                      }
                                    ],
                                    "id": 367,
                                    "name": "TupleExpression",
                                    "src": "9281:15:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "hexvalue": "32",
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "subdenomination": null,
                                      "token": "number",
                                      "type": "int_const 2",
                                      "value": "2"
                                    },
                                    "id": 368,
                                    "name": "Literal",
                                    "src": "9299:1:0"
                                  }
                                ],
                                "id": 369,
                                "name": "BinaryOperation",
                                "src": "9281:19:0"
                              }
                            ],
                            "id": 370,
                            "name": "TupleExpression",
                            "src": "9280:21:0"
                          }
                        ],
                        "id": 371,
                        "name": "BinaryOperation",
                        "src": "9260:41:0"
                      }
                    ],
                    "id": 372,
                    "name": "Return",
                    "src": "9253:48:0"
                  }
                ],
                "id": 373,
                "name": "Block",
                "src": "9189:119:0"
              }
            ],
            "id": 374,
            "name": "FunctionDefinition",
            "src": "9118:190:0"
          }
        ],
        "id": 375,
        "name": "ContractDefinition",
        "src": "8642:668:0"
      },
      {
        "attributes": {
          "contractDependencies": [
            68
          ],
          "contractKind": "contract",
          "documentation": "@dev Optional functions from the ERC20 standard.",
          "fullyImplemented": false,
          "linearizedBaseContracts": [
            430,
            68
          ],
          "name": "ERC20Detailed",
          "scope": 1546
        },
        "children": [
          {
            "attributes": {
              "arguments": null
            },
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "IERC20",
                  "referencedDeclaration": 68,
                  "type": "contract IERC20"
                },
                "id": 376,
                "name": "UserDefinedTypeName",
                "src": "9398:6:0"
              }
            ],
            "id": 377,
            "name": "InheritanceSpecifier",
            "src": "9398:6:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "_name",
              "scope": 430,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "string",
              "value": null,
              "visibility": "private"
            },
            "children": [
              {
                "attributes": {
                  "name": "string",
                  "type": "string"
                },
                "id": 378,
                "name": "ElementaryTypeName",
                "src": "9411:6:0"
              }
            ],
            "id": 379,
            "name": "VariableDeclaration",
            "src": "9411:20:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "_symbol",
              "scope": 430,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "string",
              "value": null,
              "visibility": "private"
            },
            "children": [
              {
                "attributes": {
                  "name": "string",
                  "type": "string"
                },
                "id": 380,
                "name": "ElementaryTypeName",
                "src": "9437:6:0"
              }
            ],
            "id": 381,
            "name": "VariableDeclaration",
            "src": "9437:22:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "_decimals",
              "scope": 430,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "uint8",
              "value": null,
              "visibility": "private"
            },
            "children": [
              {
                "attributes": {
                  "name": "uint8",
                  "type": "uint8"
                },
                "id": 382,
                "name": "ElementaryTypeName",
                "src": "9465:5:0"
              }
            ],
            "id": 383,
            "name": "VariableDeclaration",
            "src": "9465:23:0"
          },
          {
            "attributes": {
              "documentation": "@dev Sets the values for `name`, `symbol`, and `decimals`. All three of\nthese values are immutable: they can only be set once during\nconstruction.",
              "implemented": true,
              "isConstructor": true,
              "kind": "constructor",
              "modifiers": [
                null
              ],
              "name": "",
              "scope": 430,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "public"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "name",
                      "scope": 405,
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "type": "string",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "string",
                          "type": "string"
                        },
                        "id": 384,
                        "name": "ElementaryTypeName",
                        "src": "9692:6:0"
                      }
                    ],
                    "id": 385,
                    "name": "VariableDeclaration",
                    "src": "9692:18:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "symbol",
                      "scope": 405,
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "type": "string",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "string",
                          "type": "string"
                        },
                        "id": 386,
                        "name": "ElementaryTypeName",
                        "src": "9712:6:0"
                      }
                    ],
                    "id": 387,
                    "name": "VariableDeclaration",
                    "src": "9712:20:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "decimals",
                      "scope": 405,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint8",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint8",
                          "type": "uint8"
                        },
                        "id": 388,
                        "name": "ElementaryTypeName",
                        "src": "9734:5:0"
                      }
                    ],
                    "id": 389,
                    "name": "VariableDeclaration",
                    "src": "9734:14:0"
                  }
                ],
                "id": 390,
                "name": "ParameterList",
                "src": "9691:58:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 391,
                "name": "ParameterList",
                "src": "9757:0:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "string storage ref"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 379,
                              "type": "string storage ref",
                              "value": "_name"
                            },
                            "id": 392,
                            "name": "Identifier",
                            "src": "9767:5:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 385,
                              "type": "string memory",
                              "value": "name"
                            },
                            "id": 393,
                            "name": "Identifier",
                            "src": "9775:4:0"
                          }
                        ],
                        "id": 394,
                        "name": "Assignment",
                        "src": "9767:12:0"
                      }
                    ],
                    "id": 395,
                    "name": "ExpressionStatement",
                    "src": "9767:12:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "string storage ref"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 381,
                              "type": "string storage ref",
                              "value": "_symbol"
                            },
                            "id": 396,
                            "name": "Identifier",
                            "src": "9789:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 387,
                              "type": "string memory",
                              "value": "symbol"
                            },
                            "id": 397,
                            "name": "Identifier",
                            "src": "9799:6:0"
                          }
                        ],
                        "id": 398,
                        "name": "Assignment",
                        "src": "9789:16:0"
                      }
                    ],
                    "id": 399,
                    "name": "ExpressionStatement",
                    "src": "9789:16:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "uint8"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 383,
                              "type": "uint8",
                              "value": "_decimals"
                            },
                            "id": 400,
                            "name": "Identifier",
                            "src": "9815:9:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 389,
                              "type": "uint8",
                              "value": "decimals"
                            },
                            "id": 401,
                            "name": "Identifier",
                            "src": "9827:8:0"
                          }
                        ],
                        "id": 402,
                        "name": "Assignment",
                        "src": "9815:20:0"
                      }
                    ],
                    "id": 403,
                    "name": "ExpressionStatement",
                    "src": "9815:20:0"
                  }
                ],
                "id": 404,
                "name": "Block",
                "src": "9757:85:0"
              }
            ],
            "id": 405,
            "name": "FunctionDefinition",
            "src": "9679:163:0"
          },
          {
            "attributes": {
              "documentation": "@dev Returns the name of the token.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "name",
              "scope": 430,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 406,
                "name": "ParameterList",
                "src": "9920:2:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 413,
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "type": "string",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "string",
                          "type": "string"
                        },
                        "id": 407,
                        "name": "ElementaryTypeName",
                        "src": "9944:6:0"
                      }
                    ],
                    "id": 408,
                    "name": "VariableDeclaration",
                    "src": "9944:13:0"
                  }
                ],
                "id": 409,
                "name": "ParameterList",
                "src": "9943:15:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 409
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "overloadedDeclarations": [
                            null
                          ],
                          "referencedDeclaration": 379,
                          "type": "string storage ref",
                          "value": "_name"
                        },
                        "id": 410,
                        "name": "Identifier",
                        "src": "9976:5:0"
                      }
                    ],
                    "id": 411,
                    "name": "Return",
                    "src": "9969:12:0"
                  }
                ],
                "id": 412,
                "name": "Block",
                "src": "9959:29:0"
              }
            ],
            "id": 413,
            "name": "FunctionDefinition",
            "src": "9907:81:0"
          },
          {
            "attributes": {
              "documentation": "@dev Returns the symbol of the token, usually a shorter version of the\nname.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "symbol",
              "scope": 430,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 414,
                "name": "ParameterList",
                "src": "10116:2:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 421,
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "type": "string",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "string",
                          "type": "string"
                        },
                        "id": 415,
                        "name": "ElementaryTypeName",
                        "src": "10140:6:0"
                      }
                    ],
                    "id": 416,
                    "name": "VariableDeclaration",
                    "src": "10140:13:0"
                  }
                ],
                "id": 417,
                "name": "ParameterList",
                "src": "10139:15:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 417
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "overloadedDeclarations": [
                            null
                          ],
                          "referencedDeclaration": 381,
                          "type": "string storage ref",
                          "value": "_symbol"
                        },
                        "id": 418,
                        "name": "Identifier",
                        "src": "10172:7:0"
                      }
                    ],
                    "id": 419,
                    "name": "Return",
                    "src": "10165:14:0"
                  }
                ],
                "id": 420,
                "name": "Block",
                "src": "10155:31:0"
              }
            ],
            "id": 421,
            "name": "FunctionDefinition",
            "src": "10101:85:0"
          },
          {
            "attributes": {
              "documentation": "@dev Returns the number of decimals used to get its user representation.\nFor example, if `decimals` equals `2`, a balance of `505` tokens should\nbe displayed to a user as `5,05` (`505 / 10 ** 2`).\n     * Tokens usually opt for a value of 18, imitating the relationship between\nEther and Wei.\n     * > Note that this information is only used for _display_ purposes: it in\nno way affects any of the arithmetic of the contract, including\n`IERC20.balanceOf` and `IERC20.transfer`.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "decimals",
              "scope": 430,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 422,
                "name": "ParameterList",
                "src": "10758:2:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 429,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint8",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint8",
                          "type": "uint8"
                        },
                        "id": 423,
                        "name": "ElementaryTypeName",
                        "src": "10782:5:0"
                      }
                    ],
                    "id": 424,
                    "name": "VariableDeclaration",
                    "src": "10782:5:0"
                  }
                ],
                "id": 425,
                "name": "ParameterList",
                "src": "10781:7:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 425
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "overloadedDeclarations": [
                            null
                          ],
                          "referencedDeclaration": 383,
                          "type": "uint8",
                          "value": "_decimals"
                        },
                        "id": 426,
                        "name": "Identifier",
                        "src": "10806:9:0"
                      }
                    ],
                    "id": 427,
                    "name": "Return",
                    "src": "10799:16:0"
                  }
                ],
                "id": 428,
                "name": "Block",
                "src": "10789:33:0"
              }
            ],
            "id": 429,
            "name": "FunctionDefinition",
            "src": "10741:81:0"
          }
        ],
        "id": 430,
        "name": "ContractDefinition",
        "src": "9372:1452:0"
      },
      {
        "attributes": {
          "baseContracts": [
            null
          ],
          "contractDependencies": [
            null
          ],
          "contractKind": "library",
          "documentation": "@dev Collection of functions related to the address type,",
          "fullyImplemented": true,
          "linearizedBaseContracts": [
            447
          ],
          "name": "Address",
          "scope": 1546
        },
        "children": [
          {
            "attributes": {
              "documentation": "@dev Returns true if `account` is a contract.\n     * This test is non-exhaustive, and there may be false-negatives: during the\nexecution of a contract's constructor, its address will be reported as\nnot containing a contract.\n     * > It is unsafe to assume that an address for which this function returns\nfalse is an externally-owned account (EOA) and not a contract.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "isContract",
              "scope": 447,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "account",
                      "scope": 446,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 431,
                        "name": "ElementaryTypeName",
                        "src": "11363:7:0"
                      }
                    ],
                    "id": 432,
                    "name": "VariableDeclaration",
                    "src": "11363:15:0"
                  }
                ],
                "id": 433,
                "name": "ParameterList",
                "src": "11362:17:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 446,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bool",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bool",
                          "type": "bool"
                        },
                        "id": 434,
                        "name": "ElementaryTypeName",
                        "src": "11403:4:0"
                      }
                    ],
                    "id": 435,
                    "name": "VariableDeclaration",
                    "src": "11403:4:0"
                  }
                ],
                "id": 436,
                "name": "ParameterList",
                "src": "11402:6:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "assignments": [
                        438
                      ],
                      "initialValue": null
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "name": "size",
                          "scope": 445,
                          "stateVariable": false,
                          "storageLocation": "default",
                          "type": "uint256",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "name": "uint256",
                              "type": "uint256"
                            },
                            "id": 437,
                            "name": "ElementaryTypeName",
                            "src": "11606:7:0"
                          }
                        ],
                        "id": 438,
                        "name": "VariableDeclaration",
                        "src": "11606:12:0"
                      }
                    ],
                    "id": 439,
                    "name": "VariableDeclarationStatement",
                    "src": "11606:12:0"
                  },
                  {
                    "attributes": {
                      "externalReferences": [
                        {
                          "account": {
                            "declaration": 432,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "11715:7:0",
                            "valueSize": 1
                          }
                        },
                        {
                          "size": {
                            "declaration": 438,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "11695:4:0",
                            "valueSize": 1
                          }
                        }
                      ],
                      "operations": "{ size := extcodesize(account) }"
                    },
                    "children": [],
                    "id": 440,
                    "name": "InlineAssembly",
                    "src": "11684:41:0"
                  },
                  {
                    "attributes": {
                      "functionReturnParameters": 436
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": ">",
                          "type": "bool"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 438,
                              "type": "uint256",
                              "value": "size"
                            },
                            "id": 441,
                            "name": "Identifier",
                            "src": "11741:4:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "30",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "number",
                              "type": "int_const 0",
                              "value": "0"
                            },
                            "id": 442,
                            "name": "Literal",
                            "src": "11748:1:0"
                          }
                        ],
                        "id": 443,
                        "name": "BinaryOperation",
                        "src": "11741:8:0"
                      }
                    ],
                    "id": 444,
                    "name": "Return",
                    "src": "11734:15:0"
                  }
                ],
                "id": 445,
                "name": "Block",
                "src": "11409:347:0"
              }
            ],
            "id": 446,
            "name": "FunctionDefinition",
            "src": "11343:413:0"
          }
        ],
        "id": 447,
        "name": "ContractDefinition",
        "src": "10895:863:0"
      },
      {
        "attributes": {
          "baseContracts": [
            null
          ],
          "contractDependencies": [
            null
          ],
          "contractKind": "library",
          "documentation": "@title SafeERC20\n@dev Wrappers around ERC20 operations that throw on failure (when the token\ncontract returns false). Tokens that return no value (and instead revert or\nthrow on failure) are also supported, non-reverting calls are assumed to be\nsuccessful.\nTo use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,\nwhich allows you to call the safe operations as `token.safeTransfer(...)`, etc.",
          "fullyImplemented": true,
          "linearizedBaseContracts": [
            661
          ],
          "name": "SafeERC20",
          "scope": 1546
        },
        "children": [
          {
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "SafeMath",
                  "referencedDeclaration": 308,
                  "type": "library SafeMath"
                },
                "id": 448,
                "name": "UserDefinedTypeName",
                "src": "12247:8:0"
              },
              {
                "attributes": {
                  "name": "uint256",
                  "type": "uint256"
                },
                "id": 449,
                "name": "ElementaryTypeName",
                "src": "12260:7:0"
              }
            ],
            "id": 450,
            "name": "UsingForDirective",
            "src": "12241:27:0"
          },
          {
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "Address",
                  "referencedDeclaration": 447,
                  "type": "library Address"
                },
                "id": 451,
                "name": "UserDefinedTypeName",
                "src": "12279:7:0"
              },
              {
                "attributes": {
                  "name": "address",
                  "stateMutability": "nonpayable",
                  "type": "address"
                },
                "id": 452,
                "name": "ElementaryTypeName",
                "src": "12291:7:0"
              }
            ],
            "id": 453,
            "name": "UsingForDirective",
            "src": "12273:26:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "safeTransfer",
              "scope": 661,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "token",
                      "scope": 475,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "contract IERC20",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "contractScope": null,
                          "name": "IERC20",
                          "referencedDeclaration": 68,
                          "type": "contract IERC20"
                        },
                        "id": 454,
                        "name": "UserDefinedTypeName",
                        "src": "12327:6:0"
                      }
                    ],
                    "id": 455,
                    "name": "VariableDeclaration",
                    "src": "12327:12:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "to",
                      "scope": 475,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 456,
                        "name": "ElementaryTypeName",
                        "src": "12341:7:0"
                      }
                    ],
                    "id": 457,
                    "name": "VariableDeclaration",
                    "src": "12341:10:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "value",
                      "scope": 475,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 458,
                        "name": "ElementaryTypeName",
                        "src": "12353:7:0"
                      }
                    ],
                    "id": 459,
                    "name": "VariableDeclaration",
                    "src": "12353:13:0"
                  }
                ],
                "id": 460,
                "name": "ParameterList",
                "src": "12326:41:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 461,
                "name": "ParameterList",
                "src": "12377:0:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20_$68",
                                  "typeString": "contract IERC20"
                                },
                                {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 660,
                              "type": "function (contract IERC20,bytes memory)",
                              "value": "callOptionalReturn"
                            },
                            "id": 462,
                            "name": "Identifier",
                            "src": "12387:18:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 455,
                              "type": "contract IERC20",
                              "value": "token"
                            },
                            "id": 463,
                            "name": "Identifier",
                            "src": "12406:5:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "bytes memory",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes4",
                                      "typeString": "bytes4"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "member_name": "encodeWithSelector",
                                  "referencedDeclaration": null,
                                  "type": "function (bytes4) pure returns (bytes memory)"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1547,
                                      "type": "abi",
                                      "value": "abi"
                                    },
                                    "id": 464,
                                    "name": "Identifier",
                                    "src": "12413:3:0"
                                  }
                                ],
                                "id": 465,
                                "name": "MemberAccess",
                                "src": "12413:22:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "selector",
                                  "referencedDeclaration": null,
                                  "type": "bytes4"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "transfer",
                                      "referencedDeclaration": 22,
                                      "type": "function (address,uint256) external returns (bool)"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 455,
                                          "type": "contract IERC20",
                                          "value": "token"
                                        },
                                        "id": 466,
                                        "name": "Identifier",
                                        "src": "12436:5:0"
                                      }
                                    ],
                                    "id": 467,
                                    "name": "MemberAccess",
                                    "src": "12436:14:0"
                                  }
                                ],
                                "id": 468,
                                "name": "MemberAccess",
                                "src": "12436:23:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 457,
                                  "type": "address",
                                  "value": "to"
                                },
                                "id": 469,
                                "name": "Identifier",
                                "src": "12461:2:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 459,
                                  "type": "uint256",
                                  "value": "value"
                                },
                                "id": 470,
                                "name": "Identifier",
                                "src": "12465:5:0"
                              }
                            ],
                            "id": 471,
                            "name": "FunctionCall",
                            "src": "12413:58:0"
                          }
                        ],
                        "id": 472,
                        "name": "FunctionCall",
                        "src": "12387:85:0"
                      }
                    ],
                    "id": 473,
                    "name": "ExpressionStatement",
                    "src": "12387:85:0"
                  }
                ],
                "id": 474,
                "name": "Block",
                "src": "12377:102:0"
              }
            ],
            "id": 475,
            "name": "FunctionDefinition",
            "src": "12305:174:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "safeTransferFrom",
              "scope": 661,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "token",
                      "scope": 500,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "contract IERC20",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "contractScope": null,
                          "name": "IERC20",
                          "referencedDeclaration": 68,
                          "type": "contract IERC20"
                        },
                        "id": 476,
                        "name": "UserDefinedTypeName",
                        "src": "12511:6:0"
                      }
                    ],
                    "id": 477,
                    "name": "VariableDeclaration",
                    "src": "12511:12:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "from",
                      "scope": 500,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 478,
                        "name": "ElementaryTypeName",
                        "src": "12525:7:0"
                      }
                    ],
                    "id": 479,
                    "name": "VariableDeclaration",
                    "src": "12525:12:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "to",
                      "scope": 500,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 480,
                        "name": "ElementaryTypeName",
                        "src": "12539:7:0"
                      }
                    ],
                    "id": 481,
                    "name": "VariableDeclaration",
                    "src": "12539:10:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "value",
                      "scope": 500,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 482,
                        "name": "ElementaryTypeName",
                        "src": "12551:7:0"
                      }
                    ],
                    "id": 483,
                    "name": "VariableDeclaration",
                    "src": "12551:13:0"
                  }
                ],
                "id": 484,
                "name": "ParameterList",
                "src": "12510:55:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 485,
                "name": "ParameterList",
                "src": "12575:0:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20_$68",
                                  "typeString": "contract IERC20"
                                },
                                {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 660,
                              "type": "function (contract IERC20,bytes memory)",
                              "value": "callOptionalReturn"
                            },
                            "id": 486,
                            "name": "Identifier",
                            "src": "12585:18:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 477,
                              "type": "contract IERC20",
                              "value": "token"
                            },
                            "id": 487,
                            "name": "Identifier",
                            "src": "12604:5:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "bytes memory",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes4",
                                      "typeString": "bytes4"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "member_name": "encodeWithSelector",
                                  "referencedDeclaration": null,
                                  "type": "function (bytes4) pure returns (bytes memory)"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1547,
                                      "type": "abi",
                                      "value": "abi"
                                    },
                                    "id": 488,
                                    "name": "Identifier",
                                    "src": "12611:3:0"
                                  }
                                ],
                                "id": 489,
                                "name": "MemberAccess",
                                "src": "12611:22:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "selector",
                                  "referencedDeclaration": null,
                                  "type": "bytes4"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "transferFrom",
                                      "referencedDeclaration": 51,
                                      "type": "function (address,address,uint256) external returns (bool)"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 477,
                                          "type": "contract IERC20",
                                          "value": "token"
                                        },
                                        "id": 490,
                                        "name": "Identifier",
                                        "src": "12634:5:0"
                                      }
                                    ],
                                    "id": 491,
                                    "name": "MemberAccess",
                                    "src": "12634:18:0"
                                  }
                                ],
                                "id": 492,
                                "name": "MemberAccess",
                                "src": "12634:27:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 479,
                                  "type": "address",
                                  "value": "from"
                                },
                                "id": 493,
                                "name": "Identifier",
                                "src": "12663:4:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 481,
                                  "type": "address",
                                  "value": "to"
                                },
                                "id": 494,
                                "name": "Identifier",
                                "src": "12669:2:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 483,
                                  "type": "uint256",
                                  "value": "value"
                                },
                                "id": 495,
                                "name": "Identifier",
                                "src": "12673:5:0"
                              }
                            ],
                            "id": 496,
                            "name": "FunctionCall",
                            "src": "12611:68:0"
                          }
                        ],
                        "id": 497,
                        "name": "FunctionCall",
                        "src": "12585:95:0"
                      }
                    ],
                    "id": 498,
                    "name": "ExpressionStatement",
                    "src": "12585:95:0"
                  }
                ],
                "id": 499,
                "name": "Block",
                "src": "12575:112:0"
              }
            ],
            "id": 500,
            "name": "FunctionDefinition",
            "src": "12485:202:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "safeApprove",
              "scope": 661,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "token",
                      "scope": 541,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "contract IERC20",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "contractScope": null,
                          "name": "IERC20",
                          "referencedDeclaration": 68,
                          "type": "contract IERC20"
                        },
                        "id": 501,
                        "name": "UserDefinedTypeName",
                        "src": "12714:6:0"
                      }
                    ],
                    "id": 502,
                    "name": "VariableDeclaration",
                    "src": "12714:12:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "spender",
                      "scope": 541,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 503,
                        "name": "ElementaryTypeName",
                        "src": "12728:7:0"
                      }
                    ],
                    "id": 504,
                    "name": "VariableDeclaration",
                    "src": "12728:15:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "value",
                      "scope": 541,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 505,
                        "name": "ElementaryTypeName",
                        "src": "12745:7:0"
                      }
                    ],
                    "id": 506,
                    "name": "VariableDeclaration",
                    "src": "12745:13:0"
                  }
                ],
                "id": 507,
                "name": "ParameterList",
                "src": "12713:46:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 508,
                "name": "ParameterList",
                "src": "12769:0:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_ef945ddb1bfdc0da870feb4560d868b047642b4ac7f2fb7f8b7c51cb4a411e25",
                                  "typeString": "literal_string \"SafeERC20: approve from non-zero to non-zero allowance\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 509,
                            "name": "Identifier",
                            "src": "13049:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": "||",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isInlineArray": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "type": "bool"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "operator": "==",
                                      "type": "bool"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 506,
                                          "type": "uint256",
                                          "value": "value"
                                        },
                                        "id": 510,
                                        "name": "Identifier",
                                        "src": "13058:5:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "hexvalue": "30",
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "subdenomination": null,
                                          "token": "number",
                                          "type": "int_const 0",
                                          "value": "0"
                                        },
                                        "id": 511,
                                        "name": "Literal",
                                        "src": "13067:1:0"
                                      }
                                    ],
                                    "id": 512,
                                    "name": "BinaryOperation",
                                    "src": "13058:10:0"
                                  }
                                ],
                                "id": 513,
                                "name": "TupleExpression",
                                "src": "13057:12:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isInlineArray": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "type": "bool"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "operator": "==",
                                      "type": "bool"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "isStructConstructorCall": false,
                                          "lValueRequested": false,
                                          "names": [
                                            null
                                          ],
                                          "type": "uint256",
                                          "type_conversion": false
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                },
                                                {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                }
                                              ],
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "member_name": "allowance",
                                              "referencedDeclaration": 31,
                                              "type": "function (address,address) view external returns (uint256)"
                                            },
                                            "children": [
                                              {
                                                "attributes": {
                                                  "argumentTypes": null,
                                                  "overloadedDeclarations": [
                                                    null
                                                  ],
                                                  "referencedDeclaration": 502,
                                                  "type": "contract IERC20",
                                                  "value": "token"
                                                },
                                                "id": 514,
                                                "name": "Identifier",
                                                "src": "13074:5:0"
                                              }
                                            ],
                                            "id": 515,
                                            "name": "MemberAccess",
                                            "src": "13074:15:0"
                                          },
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "isStructConstructorCall": false,
                                              "lValueRequested": false,
                                              "names": [
                                                null
                                              ],
                                              "type": "address",
                                              "type_conversion": true
                                            },
                                            "children": [
                                              {
                                                "attributes": {
                                                  "argumentTypes": [
                                                    {
                                                      "typeIdentifier": "t_contract$_SafeERC20_$661",
                                                      "typeString": "library SafeERC20"
                                                    }
                                                  ],
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "lValueRequested": false,
                                                  "type": "type(address)",
                                                  "value": "address"
                                                },
                                                "id": 516,
                                                "name": "ElementaryTypeNameExpression",
                                                "src": "13090:7:0"
                                              },
                                              {
                                                "attributes": {
                                                  "argumentTypes": null,
                                                  "overloadedDeclarations": [
                                                    null
                                                  ],
                                                  "referencedDeclaration": 1586,
                                                  "type": "library SafeERC20",
                                                  "value": "this"
                                                },
                                                "id": 517,
                                                "name": "Identifier",
                                                "src": "13098:4:0"
                                              }
                                            ],
                                            "id": 518,
                                            "name": "FunctionCall",
                                            "src": "13090:13:0"
                                          },
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "overloadedDeclarations": [
                                                null
                                              ],
                                              "referencedDeclaration": 504,
                                              "type": "address",
                                              "value": "spender"
                                            },
                                            "id": 519,
                                            "name": "Identifier",
                                            "src": "13105:7:0"
                                          }
                                        ],
                                        "id": 520,
                                        "name": "FunctionCall",
                                        "src": "13074:39:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "hexvalue": "30",
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "subdenomination": null,
                                          "token": "number",
                                          "type": "int_const 0",
                                          "value": "0"
                                        },
                                        "id": 521,
                                        "name": "Literal",
                                        "src": "13117:1:0"
                                      }
                                    ],
                                    "id": 522,
                                    "name": "BinaryOperation",
                                    "src": "13074:44:0"
                                  }
                                ],
                                "id": 523,
                                "name": "TupleExpression",
                                "src": "13073:46:0"
                              }
                            ],
                            "id": 524,
                            "name": "BinaryOperation",
                            "src": "13057:62:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"SafeERC20: approve from non-zero to non-zero allowance\"",
                              "value": "SafeERC20: approve from non-zero to non-zero allowance"
                            },
                            "id": 525,
                            "name": "Literal",
                            "src": "13133:56:0"
                          }
                        ],
                        "id": 526,
                        "name": "FunctionCall",
                        "src": "13049:150:0"
                      }
                    ],
                    "id": 527,
                    "name": "ExpressionStatement",
                    "src": "13049:150:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20_$68",
                                  "typeString": "contract IERC20"
                                },
                                {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 660,
                              "type": "function (contract IERC20,bytes memory)",
                              "value": "callOptionalReturn"
                            },
                            "id": 528,
                            "name": "Identifier",
                            "src": "13209:18:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 502,
                              "type": "contract IERC20",
                              "value": "token"
                            },
                            "id": 529,
                            "name": "Identifier",
                            "src": "13228:5:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "bytes memory",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes4",
                                      "typeString": "bytes4"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "member_name": "encodeWithSelector",
                                  "referencedDeclaration": null,
                                  "type": "function (bytes4) pure returns (bytes memory)"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1547,
                                      "type": "abi",
                                      "value": "abi"
                                    },
                                    "id": 530,
                                    "name": "Identifier",
                                    "src": "13235:3:0"
                                  }
                                ],
                                "id": 531,
                                "name": "MemberAccess",
                                "src": "13235:22:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "selector",
                                  "referencedDeclaration": null,
                                  "type": "bytes4"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "approve",
                                      "referencedDeclaration": 40,
                                      "type": "function (address,uint256) external returns (bool)"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 502,
                                          "type": "contract IERC20",
                                          "value": "token"
                                        },
                                        "id": 532,
                                        "name": "Identifier",
                                        "src": "13258:5:0"
                                      }
                                    ],
                                    "id": 533,
                                    "name": "MemberAccess",
                                    "src": "13258:13:0"
                                  }
                                ],
                                "id": 534,
                                "name": "MemberAccess",
                                "src": "13258:22:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 504,
                                  "type": "address",
                                  "value": "spender"
                                },
                                "id": 535,
                                "name": "Identifier",
                                "src": "13282:7:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 506,
                                  "type": "uint256",
                                  "value": "value"
                                },
                                "id": 536,
                                "name": "Identifier",
                                "src": "13291:5:0"
                              }
                            ],
                            "id": 537,
                            "name": "FunctionCall",
                            "src": "13235:62:0"
                          }
                        ],
                        "id": 538,
                        "name": "FunctionCall",
                        "src": "13209:89:0"
                      }
                    ],
                    "id": 539,
                    "name": "ExpressionStatement",
                    "src": "13209:89:0"
                  }
                ],
                "id": 540,
                "name": "Block",
                "src": "12769:536:0"
              }
            ],
            "id": 541,
            "name": "FunctionDefinition",
            "src": "12693:612:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "safeIncreaseAllowance",
              "scope": 661,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "token",
                      "scope": 576,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "contract IERC20",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "contractScope": null,
                          "name": "IERC20",
                          "referencedDeclaration": 68,
                          "type": "contract IERC20"
                        },
                        "id": 542,
                        "name": "UserDefinedTypeName",
                        "src": "13342:6:0"
                      }
                    ],
                    "id": 543,
                    "name": "VariableDeclaration",
                    "src": "13342:12:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "spender",
                      "scope": 576,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 544,
                        "name": "ElementaryTypeName",
                        "src": "13356:7:0"
                      }
                    ],
                    "id": 545,
                    "name": "VariableDeclaration",
                    "src": "13356:15:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "value",
                      "scope": 576,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 546,
                        "name": "ElementaryTypeName",
                        "src": "13373:7:0"
                      }
                    ],
                    "id": 547,
                    "name": "VariableDeclaration",
                    "src": "13373:13:0"
                  }
                ],
                "id": 548,
                "name": "ParameterList",
                "src": "13341:46:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 549,
                "name": "ParameterList",
                "src": "13397:0:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "assignments": [
                        551
                      ]
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "name": "newAllowance",
                          "scope": 575,
                          "stateVariable": false,
                          "storageLocation": "default",
                          "type": "uint256",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "name": "uint256",
                              "type": "uint256"
                            },
                            "id": 550,
                            "name": "ElementaryTypeName",
                            "src": "13407:7:0"
                          }
                        ],
                        "id": 551,
                        "name": "VariableDeclaration",
                        "src": "13407:20:0"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "uint256",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "add",
                              "referencedDeclaration": 202,
                              "type": "function (uint256,uint256) pure returns (uint256)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "uint256",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        },
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "allowance",
                                      "referencedDeclaration": 31,
                                      "type": "function (address,address) view external returns (uint256)"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 543,
                                          "type": "contract IERC20",
                                          "value": "token"
                                        },
                                        "id": 552,
                                        "name": "Identifier",
                                        "src": "13430:5:0"
                                      }
                                    ],
                                    "id": 553,
                                    "name": "MemberAccess",
                                    "src": "13430:15:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "isStructConstructorCall": false,
                                      "lValueRequested": false,
                                      "names": [
                                        null
                                      ],
                                      "type": "address",
                                      "type_conversion": true
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_contract$_SafeERC20_$661",
                                              "typeString": "library SafeERC20"
                                            }
                                          ],
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "type": "type(address)",
                                          "value": "address"
                                        },
                                        "id": 554,
                                        "name": "ElementaryTypeNameExpression",
                                        "src": "13446:7:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1586,
                                          "type": "library SafeERC20",
                                          "value": "this"
                                        },
                                        "id": 555,
                                        "name": "Identifier",
                                        "src": "13454:4:0"
                                      }
                                    ],
                                    "id": 556,
                                    "name": "FunctionCall",
                                    "src": "13446:13:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 545,
                                      "type": "address",
                                      "value": "spender"
                                    },
                                    "id": 557,
                                    "name": "Identifier",
                                    "src": "13461:7:0"
                                  }
                                ],
                                "id": 558,
                                "name": "FunctionCall",
                                "src": "13430:39:0"
                              }
                            ],
                            "id": 559,
                            "name": "MemberAccess",
                            "src": "13430:43:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 547,
                              "type": "uint256",
                              "value": "value"
                            },
                            "id": 560,
                            "name": "Identifier",
                            "src": "13474:5:0"
                          }
                        ],
                        "id": 561,
                        "name": "FunctionCall",
                        "src": "13430:50:0"
                      }
                    ],
                    "id": 562,
                    "name": "VariableDeclarationStatement",
                    "src": "13407:73:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20_$68",
                                  "typeString": "contract IERC20"
                                },
                                {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 660,
                              "type": "function (contract IERC20,bytes memory)",
                              "value": "callOptionalReturn"
                            },
                            "id": 563,
                            "name": "Identifier",
                            "src": "13490:18:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 543,
                              "type": "contract IERC20",
                              "value": "token"
                            },
                            "id": 564,
                            "name": "Identifier",
                            "src": "13509:5:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "bytes memory",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes4",
                                      "typeString": "bytes4"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "member_name": "encodeWithSelector",
                                  "referencedDeclaration": null,
                                  "type": "function (bytes4) pure returns (bytes memory)"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1547,
                                      "type": "abi",
                                      "value": "abi"
                                    },
                                    "id": 565,
                                    "name": "Identifier",
                                    "src": "13516:3:0"
                                  }
                                ],
                                "id": 566,
                                "name": "MemberAccess",
                                "src": "13516:22:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "selector",
                                  "referencedDeclaration": null,
                                  "type": "bytes4"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "approve",
                                      "referencedDeclaration": 40,
                                      "type": "function (address,uint256) external returns (bool)"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 543,
                                          "type": "contract IERC20",
                                          "value": "token"
                                        },
                                        "id": 567,
                                        "name": "Identifier",
                                        "src": "13539:5:0"
                                      }
                                    ],
                                    "id": 568,
                                    "name": "MemberAccess",
                                    "src": "13539:13:0"
                                  }
                                ],
                                "id": 569,
                                "name": "MemberAccess",
                                "src": "13539:22:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 545,
                                  "type": "address",
                                  "value": "spender"
                                },
                                "id": 570,
                                "name": "Identifier",
                                "src": "13563:7:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 551,
                                  "type": "uint256",
                                  "value": "newAllowance"
                                },
                                "id": 571,
                                "name": "Identifier",
                                "src": "13572:12:0"
                              }
                            ],
                            "id": 572,
                            "name": "FunctionCall",
                            "src": "13516:69:0"
                          }
                        ],
                        "id": 573,
                        "name": "FunctionCall",
                        "src": "13490:96:0"
                      }
                    ],
                    "id": 574,
                    "name": "ExpressionStatement",
                    "src": "13490:96:0"
                  }
                ],
                "id": 575,
                "name": "Block",
                "src": "13397:196:0"
              }
            ],
            "id": 576,
            "name": "FunctionDefinition",
            "src": "13311:282:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "safeDecreaseAllowance",
              "scope": 661,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "token",
                      "scope": 611,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "contract IERC20",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "contractScope": null,
                          "name": "IERC20",
                          "referencedDeclaration": 68,
                          "type": "contract IERC20"
                        },
                        "id": 577,
                        "name": "UserDefinedTypeName",
                        "src": "13630:6:0"
                      }
                    ],
                    "id": 578,
                    "name": "VariableDeclaration",
                    "src": "13630:12:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "spender",
                      "scope": 611,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 579,
                        "name": "ElementaryTypeName",
                        "src": "13644:7:0"
                      }
                    ],
                    "id": 580,
                    "name": "VariableDeclaration",
                    "src": "13644:15:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "value",
                      "scope": 611,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 581,
                        "name": "ElementaryTypeName",
                        "src": "13661:7:0"
                      }
                    ],
                    "id": 582,
                    "name": "VariableDeclaration",
                    "src": "13661:13:0"
                  }
                ],
                "id": 583,
                "name": "ParameterList",
                "src": "13629:46:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 584,
                "name": "ParameterList",
                "src": "13685:0:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "assignments": [
                        586
                      ]
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "name": "newAllowance",
                          "scope": 610,
                          "stateVariable": false,
                          "storageLocation": "default",
                          "type": "uint256",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "name": "uint256",
                              "type": "uint256"
                            },
                            "id": 585,
                            "name": "ElementaryTypeName",
                            "src": "13695:7:0"
                          }
                        ],
                        "id": 586,
                        "name": "VariableDeclaration",
                        "src": "13695:20:0"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "uint256",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "sub",
                              "referencedDeclaration": 227,
                              "type": "function (uint256,uint256) pure returns (uint256)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "uint256",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        },
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "allowance",
                                      "referencedDeclaration": 31,
                                      "type": "function (address,address) view external returns (uint256)"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 578,
                                          "type": "contract IERC20",
                                          "value": "token"
                                        },
                                        "id": 587,
                                        "name": "Identifier",
                                        "src": "13718:5:0"
                                      }
                                    ],
                                    "id": 588,
                                    "name": "MemberAccess",
                                    "src": "13718:15:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "isStructConstructorCall": false,
                                      "lValueRequested": false,
                                      "names": [
                                        null
                                      ],
                                      "type": "address",
                                      "type_conversion": true
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_contract$_SafeERC20_$661",
                                              "typeString": "library SafeERC20"
                                            }
                                          ],
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "type": "type(address)",
                                          "value": "address"
                                        },
                                        "id": 589,
                                        "name": "ElementaryTypeNameExpression",
                                        "src": "13734:7:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1586,
                                          "type": "library SafeERC20",
                                          "value": "this"
                                        },
                                        "id": 590,
                                        "name": "Identifier",
                                        "src": "13742:4:0"
                                      }
                                    ],
                                    "id": 591,
                                    "name": "FunctionCall",
                                    "src": "13734:13:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 580,
                                      "type": "address",
                                      "value": "spender"
                                    },
                                    "id": 592,
                                    "name": "Identifier",
                                    "src": "13749:7:0"
                                  }
                                ],
                                "id": 593,
                                "name": "FunctionCall",
                                "src": "13718:39:0"
                              }
                            ],
                            "id": 594,
                            "name": "MemberAccess",
                            "src": "13718:43:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 582,
                              "type": "uint256",
                              "value": "value"
                            },
                            "id": 595,
                            "name": "Identifier",
                            "src": "13762:5:0"
                          }
                        ],
                        "id": 596,
                        "name": "FunctionCall",
                        "src": "13718:50:0"
                      }
                    ],
                    "id": 597,
                    "name": "VariableDeclarationStatement",
                    "src": "13695:73:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20_$68",
                                  "typeString": "contract IERC20"
                                },
                                {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 660,
                              "type": "function (contract IERC20,bytes memory)",
                              "value": "callOptionalReturn"
                            },
                            "id": 598,
                            "name": "Identifier",
                            "src": "13778:18:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 578,
                              "type": "contract IERC20",
                              "value": "token"
                            },
                            "id": 599,
                            "name": "Identifier",
                            "src": "13797:5:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "bytes memory",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes4",
                                      "typeString": "bytes4"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "member_name": "encodeWithSelector",
                                  "referencedDeclaration": null,
                                  "type": "function (bytes4) pure returns (bytes memory)"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1547,
                                      "type": "abi",
                                      "value": "abi"
                                    },
                                    "id": 600,
                                    "name": "Identifier",
                                    "src": "13804:3:0"
                                  }
                                ],
                                "id": 601,
                                "name": "MemberAccess",
                                "src": "13804:22:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "selector",
                                  "referencedDeclaration": null,
                                  "type": "bytes4"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "approve",
                                      "referencedDeclaration": 40,
                                      "type": "function (address,uint256) external returns (bool)"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 578,
                                          "type": "contract IERC20",
                                          "value": "token"
                                        },
                                        "id": 602,
                                        "name": "Identifier",
                                        "src": "13827:5:0"
                                      }
                                    ],
                                    "id": 603,
                                    "name": "MemberAccess",
                                    "src": "13827:13:0"
                                  }
                                ],
                                "id": 604,
                                "name": "MemberAccess",
                                "src": "13827:22:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 580,
                                  "type": "address",
                                  "value": "spender"
                                },
                                "id": 605,
                                "name": "Identifier",
                                "src": "13851:7:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 586,
                                  "type": "uint256",
                                  "value": "newAllowance"
                                },
                                "id": 606,
                                "name": "Identifier",
                                "src": "13860:12:0"
                              }
                            ],
                            "id": 607,
                            "name": "FunctionCall",
                            "src": "13804:69:0"
                          }
                        ],
                        "id": 608,
                        "name": "FunctionCall",
                        "src": "13778:96:0"
                      }
                    ],
                    "id": 609,
                    "name": "ExpressionStatement",
                    "src": "13778:96:0"
                  }
                ],
                "id": 610,
                "name": "Block",
                "src": "13685:196:0"
              }
            ],
            "id": 611,
            "name": "FunctionDefinition",
            "src": "13599:282:0"
          },
          {
            "attributes": {
              "documentation": "@dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\non 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).",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "callOptionalReturn",
              "scope": 661,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "private"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "token",
                      "scope": 660,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "contract IERC20",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "contractScope": null,
                          "name": "IERC20",
                          "referencedDeclaration": 68,
                          "type": "contract IERC20"
                        },
                        "id": 612,
                        "name": "UserDefinedTypeName",
                        "src": "14292:6:0"
                      }
                    ],
                    "id": 613,
                    "name": "VariableDeclaration",
                    "src": "14292:12:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "data",
                      "scope": 660,
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "type": "bytes",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes",
                          "type": "bytes"
                        },
                        "id": 614,
                        "name": "ElementaryTypeName",
                        "src": "14306:5:0"
                      }
                    ],
                    "id": 615,
                    "name": "VariableDeclaration",
                    "src": "14306:17:0"
                  }
                ],
                "id": 616,
                "name": "ParameterList",
                "src": "14291:33:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 617,
                "name": "ParameterList",
                "src": "14333:0:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_f6ce7bfd656f35145dec774d6f7e67f4cba158373d2dd7a0f8273e232f86148d",
                                  "typeString": "literal_string \"SafeERC20: call to non-contract\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 618,
                            "name": "Identifier",
                            "src": "14851:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "arguments": [
                                null
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "bool",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    null
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "isContract",
                                  "referencedDeclaration": 446,
                                  "type": "function (address) view returns (bool)"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "isStructConstructorCall": false,
                                      "lValueRequested": false,
                                      "names": [
                                        null
                                      ],
                                      "type": "address",
                                      "type_conversion": true
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_contract$_IERC20_$68",
                                              "typeString": "contract IERC20"
                                            }
                                          ],
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "type": "type(address)",
                                          "value": "address"
                                        },
                                        "id": 619,
                                        "name": "ElementaryTypeNameExpression",
                                        "src": "14859:7:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 613,
                                          "type": "contract IERC20",
                                          "value": "token"
                                        },
                                        "id": 620,
                                        "name": "Identifier",
                                        "src": "14867:5:0"
                                      }
                                    ],
                                    "id": 621,
                                    "name": "FunctionCall",
                                    "src": "14859:14:0"
                                  }
                                ],
                                "id": 622,
                                "name": "MemberAccess",
                                "src": "14859:25:0"
                              }
                            ],
                            "id": 623,
                            "name": "FunctionCall",
                            "src": "14859:27:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"SafeERC20: call to non-contract\"",
                              "value": "SafeERC20: call to non-contract"
                            },
                            "id": 624,
                            "name": "Literal",
                            "src": "14888:33:0"
                          }
                        ],
                        "id": 625,
                        "name": "FunctionCall",
                        "src": "14851:71:0"
                      }
                    ],
                    "id": 626,
                    "name": "ExpressionStatement",
                    "src": "14851:71:0"
                  },
                  {
                    "attributes": {
                      "assignments": [
                        628,
                        630
                      ]
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "name": "success",
                          "scope": 659,
                          "stateVariable": false,
                          "storageLocation": "default",
                          "type": "bool",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "name": "bool",
                              "type": "bool"
                            },
                            "id": 627,
                            "name": "ElementaryTypeName",
                            "src": "14993:4:0"
                          }
                        ],
                        "id": 628,
                        "name": "VariableDeclaration",
                        "src": "14993:12:0"
                      },
                      {
                        "attributes": {
                          "constant": false,
                          "name": "returndata",
                          "scope": 659,
                          "stateVariable": false,
                          "storageLocation": "memory",
                          "type": "bytes",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "name": "bytes",
                              "type": "bytes"
                            },
                            "id": 629,
                            "name": "ElementaryTypeName",
                            "src": "15007:5:0"
                          }
                        ],
                        "id": 630,
                        "name": "VariableDeclaration",
                        "src": "15007:23:0"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple(bool,bytes memory)",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "call",
                              "referencedDeclaration": null,
                              "type": "function (bytes memory) payable returns (bool,bytes memory)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "address",
                                  "type_conversion": true
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_IERC20_$68",
                                          "typeString": "contract IERC20"
                                        }
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "type": "type(address)",
                                      "value": "address"
                                    },
                                    "id": 631,
                                    "name": "ElementaryTypeNameExpression",
                                    "src": "15034:7:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 613,
                                      "type": "contract IERC20",
                                      "value": "token"
                                    },
                                    "id": 632,
                                    "name": "Identifier",
                                    "src": "15042:5:0"
                                  }
                                ],
                                "id": 633,
                                "name": "FunctionCall",
                                "src": "15034:14:0"
                              }
                            ],
                            "id": 634,
                            "name": "MemberAccess",
                            "src": "15034:19:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 615,
                              "type": "bytes memory",
                              "value": "data"
                            },
                            "id": 635,
                            "name": "Identifier",
                            "src": "15054:4:0"
                          }
                        ],
                        "id": 636,
                        "name": "FunctionCall",
                        "src": "15034:25:0"
                      }
                    ],
                    "id": 637,
                    "name": "VariableDeclarationStatement",
                    "src": "14992:67:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_47fb62c2c272651d2f0f342bac006756b8ba07f21cc5cb87e0fbb9d50c0c585b",
                                  "typeString": "literal_string \"SafeERC20: low-level call failed\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 638,
                            "name": "Identifier",
                            "src": "15069:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 628,
                              "type": "bool",
                              "value": "success"
                            },
                            "id": 639,
                            "name": "Identifier",
                            "src": "15077:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"SafeERC20: low-level call failed\"",
                              "value": "SafeERC20: low-level call failed"
                            },
                            "id": 640,
                            "name": "Literal",
                            "src": "15086:34:0"
                          }
                        ],
                        "id": 641,
                        "name": "FunctionCall",
                        "src": "15069:52:0"
                      }
                    ],
                    "id": 642,
                    "name": "ExpressionStatement",
                    "src": "15069:52:0"
                  },
                  {
                    "attributes": {
                      "falseBody": null
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": ">",
                          "type": "bool"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "length",
                              "referencedDeclaration": null,
                              "type": "uint256"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 630,
                                  "type": "bytes memory",
                                  "value": "returndata"
                                },
                                "id": 643,
                                "name": "Identifier",
                                "src": "15136:10:0"
                              }
                            ],
                            "id": 644,
                            "name": "MemberAccess",
                            "src": "15136:17:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "30",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "number",
                              "type": "int_const 0",
                              "value": "0"
                            },
                            "id": 645,
                            "name": "Literal",
                            "src": "15156:1:0"
                          }
                        ],
                        "id": 646,
                        "name": "BinaryOperation",
                        "src": "15136:21:0"
                      },
                      {
                        "children": [
                          {
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "tuple()",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        },
                                        {
                                          "typeIdentifier": "t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd",
                                          "typeString": "literal_string \"SafeERC20: ERC20 operation did not succeed\""
                                        }
                                      ],
                                      "overloadedDeclarations": [
                                        1563,
                                        1564
                                      ],
                                      "referencedDeclaration": 1564,
                                      "type": "function (bool,string memory) pure",
                                      "value": "require"
                                    },
                                    "id": 647,
                                    "name": "Identifier",
                                    "src": "15257:7:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "isStructConstructorCall": false,
                                      "lValueRequested": false,
                                      "names": [
                                        null
                                      ],
                                      "type": "bool",
                                      "type_conversion": false
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_bytes_memory_ptr",
                                              "typeString": "bytes memory"
                                            },
                                            {
                                              "typeIdentifier": "t_type$_t_bool_$",
                                              "typeString": "type(bool)"
                                            }
                                          ],
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "member_name": "decode",
                                          "referencedDeclaration": null,
                                          "type": "function () pure"
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "overloadedDeclarations": [
                                                null
                                              ],
                                              "referencedDeclaration": 1547,
                                              "type": "abi",
                                              "value": "abi"
                                            },
                                            "id": 648,
                                            "name": "Identifier",
                                            "src": "15265:3:0"
                                          }
                                        ],
                                        "id": 649,
                                        "name": "MemberAccess",
                                        "src": "15265:10:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 630,
                                          "type": "bytes memory",
                                          "value": "returndata"
                                        },
                                        "id": 650,
                                        "name": "Identifier",
                                        "src": "15276:10:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "isConstant": false,
                                          "isInlineArray": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "type": "type(bool)"
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "type": "type(bool)",
                                              "value": "bool"
                                            },
                                            "id": 651,
                                            "name": "ElementaryTypeNameExpression",
                                            "src": "15289:4:0"
                                          }
                                        ],
                                        "id": 652,
                                        "name": "TupleExpression",
                                        "src": "15288:6:0"
                                      }
                                    ],
                                    "id": 653,
                                    "name": "FunctionCall",
                                    "src": "15265:30:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "hexvalue": "5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564",
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "subdenomination": null,
                                      "token": "string",
                                      "type": "literal_string \"SafeERC20: ERC20 operation did not succeed\"",
                                      "value": "SafeERC20: ERC20 operation did not succeed"
                                    },
                                    "id": 654,
                                    "name": "Literal",
                                    "src": "15297:44:0"
                                  }
                                ],
                                "id": 655,
                                "name": "FunctionCall",
                                "src": "15257:85:0"
                              }
                            ],
                            "id": 656,
                            "name": "ExpressionStatement",
                            "src": "15257:85:0"
                          }
                        ],
                        "id": 657,
                        "name": "Block",
                        "src": "15159:194:0"
                      }
                    ],
                    "id": 658,
                    "name": "IfStatement",
                    "src": "15132:221:0"
                  }
                ],
                "id": 659,
                "name": "Block",
                "src": "14333:1026:0"
              }
            ],
            "id": 660,
            "name": "FunctionDefinition",
            "src": "14264:1095:0"
          }
        ],
        "id": 661,
        "name": "ContractDefinition",
        "src": "12217:3144:0"
      },
      {
        "attributes": {
          "baseContracts": [
            null
          ],
          "contractDependencies": [
            null
          ],
          "contractKind": "contract",
          "documentation": "@dev Contract module that helps prevent reentrant calls to a function.\n * Inheriting from `ReentrancyGuard` will make the `nonReentrant` modifier\navailable, which can be aplied to functions to make sure there are no nested\n(reentrant) calls to them.\n * Note that because there is a single `nonReentrant` guard, functions marked as\n`nonReentrant` may not call one another. This can be worked around by making\nthose functions `private`, and then adding `external` `nonReentrant` entry\npoints to them.",
          "fullyImplemented": true,
          "linearizedBaseContracts": [
            691
          ],
          "name": "ReentrancyGuard",
          "scope": 1546
        },
        "children": [
          {
            "attributes": {
              "constant": false,
              "name": "_guardCounter",
              "scope": 691,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "uint256",
              "value": null,
              "visibility": "private"
            },
            "children": [
              {
                "attributes": {
                  "name": "uint256",
                  "type": "uint256"
                },
                "id": 662,
                "name": "ElementaryTypeName",
                "src": "15997:7:0"
              }
            ],
            "id": 663,
            "name": "VariableDeclaration",
            "src": "15997:29:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": true,
              "kind": "constructor",
              "modifiers": [
                null
              ],
              "name": "",
              "scope": 691,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 664,
                "name": "ParameterList",
                "src": "16045:2:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 665,
                "name": "ParameterList",
                "src": "16057:0:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 663,
                              "type": "uint256",
                              "value": "_guardCounter"
                            },
                            "id": 666,
                            "name": "Identifier",
                            "src": "16206:13:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "31",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "number",
                              "type": "int_const 1",
                              "value": "1"
                            },
                            "id": 667,
                            "name": "Literal",
                            "src": "16222:1:0"
                          }
                        ],
                        "id": 668,
                        "name": "Assignment",
                        "src": "16206:17:0"
                      }
                    ],
                    "id": 669,
                    "name": "ExpressionStatement",
                    "src": "16206:17:0"
                  }
                ],
                "id": 670,
                "name": "Block",
                "src": "16057:173:0"
              }
            ],
            "id": 671,
            "name": "FunctionDefinition",
            "src": "16033:197:0"
          },
          {
            "attributes": {
              "documentation": "@dev Prevents a contract from calling itself, directly or indirectly.\nCalling a `nonReentrant` function from another `nonReentrant`\nfunction is not supported. It is possible to prevent this from happening\nby making the `nonReentrant` function external, and make it call a\n`private` function that does the actual work.",
              "name": "nonReentrant",
              "visibility": "internal"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 672,
                "name": "ParameterList",
                "src": "16626:2:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "+=",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 663,
                              "type": "uint256",
                              "value": "_guardCounter"
                            },
                            "id": 673,
                            "name": "Identifier",
                            "src": "16639:13:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "31",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "number",
                              "type": "int_const 1",
                              "value": "1"
                            },
                            "id": 674,
                            "name": "Literal",
                            "src": "16656:1:0"
                          }
                        ],
                        "id": 675,
                        "name": "Assignment",
                        "src": "16639:18:0"
                      }
                    ],
                    "id": 676,
                    "name": "ExpressionStatement",
                    "src": "16639:18:0"
                  },
                  {
                    "attributes": {
                      "assignments": [
                        678
                      ]
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "name": "localCounter",
                          "scope": 689,
                          "stateVariable": false,
                          "storageLocation": "default",
                          "type": "uint256",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "name": "uint256",
                              "type": "uint256"
                            },
                            "id": 677,
                            "name": "ElementaryTypeName",
                            "src": "16667:7:0"
                          }
                        ],
                        "id": 678,
                        "name": "VariableDeclaration",
                        "src": "16667:20:0"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "overloadedDeclarations": [
                            null
                          ],
                          "referencedDeclaration": 663,
                          "type": "uint256",
                          "value": "_guardCounter"
                        },
                        "id": 679,
                        "name": "Identifier",
                        "src": "16690:13:0"
                      }
                    ],
                    "id": 680,
                    "name": "VariableDeclarationStatement",
                    "src": "16667:36:0"
                  },
                  {
                    "id": 681,
                    "name": "PlaceholderStatement",
                    "src": "16713:1:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_ebf73bba305590e4764d5cb53b69bffd6d4d092d1a67551cb346f8cfcdab8619",
                                  "typeString": "literal_string \"ReentrancyGuard: reentrant call\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 682,
                            "name": "Identifier",
                            "src": "16724:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": "==",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 678,
                                  "type": "uint256",
                                  "value": "localCounter"
                                },
                                "id": 683,
                                "name": "Identifier",
                                "src": "16732:12:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 663,
                                  "type": "uint256",
                                  "value": "_guardCounter"
                                },
                                "id": 684,
                                "name": "Identifier",
                                "src": "16748:13:0"
                              }
                            ],
                            "id": 685,
                            "name": "BinaryOperation",
                            "src": "16732:29:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "5265656e7472616e637947756172643a207265656e7472616e742063616c6c",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"ReentrancyGuard: reentrant call\"",
                              "value": "ReentrancyGuard: reentrant call"
                            },
                            "id": 686,
                            "name": "Literal",
                            "src": "16763:33:0"
                          }
                        ],
                        "id": 687,
                        "name": "FunctionCall",
                        "src": "16724:73:0"
                      }
                    ],
                    "id": 688,
                    "name": "ExpressionStatement",
                    "src": "16724:73:0"
                  }
                ],
                "id": 689,
                "name": "Block",
                "src": "16629:175:0"
              }
            ],
            "id": 690,
            "name": "ModifierDefinition",
            "src": "16605:199:0"
          }
        ],
        "id": 691,
        "name": "ContractDefinition",
        "src": "15894:912:0"
      },
      {
        "attributes": {
          "baseContracts": [
            null
          ],
          "contractDependencies": [
            null
          ],
          "contractKind": "interface",
          "documentation": null,
          "fullyImplemented": false,
          "linearizedBaseContracts": [
            742
          ],
          "name": "IStakingRewards",
          "scope": 1546
        },
        "children": [
          {
            "attributes": {
              "body": null,
              "documentation": null,
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "lastTimeRewardApplicable",
              "scope": 742,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 692,
                "name": "ParameterList",
                "src": "16901:2:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 696,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 693,
                        "name": "ElementaryTypeName",
                        "src": "16927:7:0"
                      }
                    ],
                    "id": 694,
                    "name": "VariableDeclaration",
                    "src": "16927:7:0"
                  }
                ],
                "id": 695,
                "name": "ParameterList",
                "src": "16926:9:0"
              }
            ],
            "id": 696,
            "name": "FunctionDefinition",
            "src": "16868:68:0"
          },
          {
            "attributes": {
              "body": null,
              "documentation": null,
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "rewardPerToken",
              "scope": 742,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 697,
                "name": "ParameterList",
                "src": "16965:2:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 701,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 698,
                        "name": "ElementaryTypeName",
                        "src": "16991:7:0"
                      }
                    ],
                    "id": 699,
                    "name": "VariableDeclaration",
                    "src": "16991:7:0"
                  }
                ],
                "id": 700,
                "name": "ParameterList",
                "src": "16990:9:0"
              }
            ],
            "id": 701,
            "name": "FunctionDefinition",
            "src": "16942:58:0"
          },
          {
            "attributes": {
              "body": null,
              "documentation": null,
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "earned",
              "scope": 742,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "account",
                      "scope": 708,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 702,
                        "name": "ElementaryTypeName",
                        "src": "17022:7:0"
                      }
                    ],
                    "id": 703,
                    "name": "VariableDeclaration",
                    "src": "17022:15:0"
                  }
                ],
                "id": 704,
                "name": "ParameterList",
                "src": "17021:17:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 708,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 705,
                        "name": "ElementaryTypeName",
                        "src": "17062:7:0"
                      }
                    ],
                    "id": 706,
                    "name": "VariableDeclaration",
                    "src": "17062:7:0"
                  }
                ],
                "id": 707,
                "name": "ParameterList",
                "src": "17061:9:0"
              }
            ],
            "id": 708,
            "name": "FunctionDefinition",
            "src": "17006:65:0"
          },
          {
            "attributes": {
              "body": null,
              "documentation": null,
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "getRewardForDuration",
              "scope": 742,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 709,
                "name": "ParameterList",
                "src": "17106:2:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 713,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 710,
                        "name": "ElementaryTypeName",
                        "src": "17132:7:0"
                      }
                    ],
                    "id": 711,
                    "name": "VariableDeclaration",
                    "src": "17132:7:0"
                  }
                ],
                "id": 712,
                "name": "ParameterList",
                "src": "17131:9:0"
              }
            ],
            "id": 713,
            "name": "FunctionDefinition",
            "src": "17077:64:0"
          },
          {
            "attributes": {
              "body": null,
              "documentation": null,
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "totalSupply",
              "scope": 742,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 714,
                "name": "ParameterList",
                "src": "17167:2:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 718,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 715,
                        "name": "ElementaryTypeName",
                        "src": "17193:7:0"
                      }
                    ],
                    "id": 716,
                    "name": "VariableDeclaration",
                    "src": "17193:7:0"
                  }
                ],
                "id": 717,
                "name": "ParameterList",
                "src": "17192:9:0"
              }
            ],
            "id": 718,
            "name": "FunctionDefinition",
            "src": "17147:55:0"
          },
          {
            "attributes": {
              "body": null,
              "documentation": null,
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "balanceOf",
              "scope": 742,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "account",
                      "scope": 725,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 719,
                        "name": "ElementaryTypeName",
                        "src": "17227:7:0"
                      }
                    ],
                    "id": 720,
                    "name": "VariableDeclaration",
                    "src": "17227:15:0"
                  }
                ],
                "id": 721,
                "name": "ParameterList",
                "src": "17226:17:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 725,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 722,
                        "name": "ElementaryTypeName",
                        "src": "17267:7:0"
                      }
                    ],
                    "id": 723,
                    "name": "VariableDeclaration",
                    "src": "17267:7:0"
                  }
                ],
                "id": 724,
                "name": "ParameterList",
                "src": "17266:9:0"
              }
            ],
            "id": 725,
            "name": "FunctionDefinition",
            "src": "17208:68:0"
          },
          {
            "attributes": {
              "body": null,
              "documentation": null,
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "stake",
              "scope": 742,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "amount",
                      "scope": 730,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 726,
                        "name": "ElementaryTypeName",
                        "src": "17314:7:0"
                      }
                    ],
                    "id": 727,
                    "name": "VariableDeclaration",
                    "src": "17314:14:0"
                  }
                ],
                "id": 728,
                "name": "ParameterList",
                "src": "17313:16:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 729,
                "name": "ParameterList",
                "src": "17338:0:0"
              }
            ],
            "id": 730,
            "name": "FunctionDefinition",
            "src": "17299:40:0"
          },
          {
            "attributes": {
              "body": null,
              "documentation": null,
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "withdraw",
              "scope": 742,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "amount",
                      "scope": 735,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 731,
                        "name": "ElementaryTypeName",
                        "src": "17363:7:0"
                      }
                    ],
                    "id": 732,
                    "name": "VariableDeclaration",
                    "src": "17363:14:0"
                  }
                ],
                "id": 733,
                "name": "ParameterList",
                "src": "17362:16:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 734,
                "name": "ParameterList",
                "src": "17387:0:0"
              }
            ],
            "id": 735,
            "name": "FunctionDefinition",
            "src": "17345:43:0"
          },
          {
            "attributes": {
              "body": null,
              "documentation": null,
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "getReward",
              "scope": 742,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 736,
                "name": "ParameterList",
                "src": "17412:2:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 737,
                "name": "ParameterList",
                "src": "17423:0:0"
              }
            ],
            "id": 738,
            "name": "FunctionDefinition",
            "src": "17394:30:0"
          },
          {
            "attributes": {
              "body": null,
              "documentation": null,
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "exit",
              "scope": 742,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 739,
                "name": "ParameterList",
                "src": "17443:2:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 740,
                "name": "ParameterList",
                "src": "17454:0:0"
              }
            ],
            "id": 741,
            "name": "FunctionDefinition",
            "src": "17430:25:0"
          }
        ],
        "id": 742,
        "name": "ContractDefinition",
        "src": "16823:634:0"
      },
      {
        "attributes": {
          "baseContracts": [
            null
          ],
          "contractDependencies": [
            null
          ],
          "contractKind": "contract",
          "documentation": null,
          "fullyImplemented": false,
          "linearizedBaseContracts": [
            762
          ],
          "name": "RewardsDistributionRecipient",
          "scope": 1546
        },
        "children": [
          {
            "attributes": {
              "constant": false,
              "name": "rewardsDistribution",
              "scope": 762,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "address",
              "value": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "name": "address",
                  "stateMutability": "nonpayable",
                  "type": "address"
                },
                "id": 743,
                "name": "ElementaryTypeName",
                "src": "17503:7:0"
              }
            ],
            "id": 744,
            "name": "VariableDeclaration",
            "src": "17503:34:0"
          },
          {
            "attributes": {
              "body": null,
              "documentation": null,
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "notifyRewardAmount",
              "scope": 762,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "reward",
                      "scope": 749,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 745,
                        "name": "ElementaryTypeName",
                        "src": "17572:7:0"
                      }
                    ],
                    "id": 746,
                    "name": "VariableDeclaration",
                    "src": "17572:14:0"
                  }
                ],
                "id": 747,
                "name": "ParameterList",
                "src": "17571:16:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 748,
                "name": "ParameterList",
                "src": "17596:0:0"
              }
            ],
            "id": 749,
            "name": "FunctionDefinition",
            "src": "17544:53:0"
          },
          {
            "attributes": {
              "documentation": null,
              "name": "onlyRewardsDistribution",
              "visibility": "internal"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 750,
                "name": "ParameterList",
                "src": "17635:2:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_d50b095422f4cbfcb4c90fbd4d55aaf0967bf1d90e94bb6a1ae9fc4ee7e733de",
                                  "typeString": "literal_string \"Caller is not RewardsDistribution contract\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 751,
                            "name": "Identifier",
                            "src": "17648:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": "==",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "sender",
                                  "referencedDeclaration": null,
                                  "type": "address payable"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1560,
                                      "type": "msg",
                                      "value": "msg"
                                    },
                                    "id": 752,
                                    "name": "Identifier",
                                    "src": "17656:3:0"
                                  }
                                ],
                                "id": 753,
                                "name": "MemberAccess",
                                "src": "17656:10:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 744,
                                  "type": "address",
                                  "value": "rewardsDistribution"
                                },
                                "id": 754,
                                "name": "Identifier",
                                "src": "17670:19:0"
                              }
                            ],
                            "id": 755,
                            "name": "BinaryOperation",
                            "src": "17656:33:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "43616c6c6572206973206e6f742052657761726473446973747269627574696f6e20636f6e7472616374",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"Caller is not RewardsDistribution contract\"",
                              "value": "Caller is not RewardsDistribution contract"
                            },
                            "id": 756,
                            "name": "Literal",
                            "src": "17691:44:0"
                          }
                        ],
                        "id": 757,
                        "name": "FunctionCall",
                        "src": "17648:88:0"
                      }
                    ],
                    "id": 758,
                    "name": "ExpressionStatement",
                    "src": "17648:88:0"
                  },
                  {
                    "id": 759,
                    "name": "PlaceholderStatement",
                    "src": "17746:1:0"
                  }
                ],
                "id": 760,
                "name": "Block",
                "src": "17638:116:0"
              }
            ],
            "id": 761,
            "name": "ModifierDefinition",
            "src": "17603:151:0"
          }
        ],
        "id": 762,
        "name": "ContractDefinition",
        "src": "17459:297:0"
      },
      {
        "attributes": {
          "contractDependencies": [
            691,
            742,
            762
          ],
          "contractKind": "contract",
          "documentation": null,
          "fullyImplemented": true,
          "linearizedBaseContracts": [
            1336,
            691,
            762,
            742
          ],
          "name": "StakingRewards",
          "scope": 1546
        },
        "children": [
          {
            "attributes": {
              "arguments": null
            },
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "IStakingRewards",
                  "referencedDeclaration": 742,
                  "type": "contract IStakingRewards"
                },
                "id": 763,
                "name": "UserDefinedTypeName",
                "src": "17785:15:0"
              }
            ],
            "id": 764,
            "name": "InheritanceSpecifier",
            "src": "17785:15:0"
          },
          {
            "attributes": {
              "arguments": null
            },
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "RewardsDistributionRecipient",
                  "referencedDeclaration": 762,
                  "type": "contract RewardsDistributionRecipient"
                },
                "id": 765,
                "name": "UserDefinedTypeName",
                "src": "17802:28:0"
              }
            ],
            "id": 766,
            "name": "InheritanceSpecifier",
            "src": "17802:28:0"
          },
          {
            "attributes": {
              "arguments": null
            },
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "ReentrancyGuard",
                  "referencedDeclaration": 691,
                  "type": "contract ReentrancyGuard"
                },
                "id": 767,
                "name": "UserDefinedTypeName",
                "src": "17832:15:0"
              }
            ],
            "id": 768,
            "name": "InheritanceSpecifier",
            "src": "17832:15:0"
          },
          {
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "SafeMath",
                  "referencedDeclaration": 308,
                  "type": "library SafeMath"
                },
                "id": 769,
                "name": "UserDefinedTypeName",
                "src": "17860:8:0"
              },
              {
                "attributes": {
                  "name": "uint256",
                  "type": "uint256"
                },
                "id": 770,
                "name": "ElementaryTypeName",
                "src": "17873:7:0"
              }
            ],
            "id": 771,
            "name": "UsingForDirective",
            "src": "17854:27:0"
          },
          {
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "SafeERC20",
                  "referencedDeclaration": 661,
                  "type": "library SafeERC20"
                },
                "id": 772,
                "name": "UserDefinedTypeName",
                "src": "17892:9:0"
              },
              {
                "attributes": {
                  "contractScope": null,
                  "name": "IERC20",
                  "referencedDeclaration": 68,
                  "type": "contract IERC20"
                },
                "id": 773,
                "name": "UserDefinedTypeName",
                "src": "17906:6:0"
              }
            ],
            "id": 774,
            "name": "UsingForDirective",
            "src": "17886:27:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "rewardsToken",
              "scope": 1336,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "contract IERC20",
              "value": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "IERC20",
                  "referencedDeclaration": 68,
                  "type": "contract IERC20"
                },
                "id": 775,
                "name": "UserDefinedTypeName",
                "src": "17968:6:0"
              }
            ],
            "id": 776,
            "name": "VariableDeclaration",
            "src": "17968:26:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "stakingToken",
              "scope": 1336,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "contract IERC20",
              "value": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "IERC20",
                  "referencedDeclaration": 68,
                  "type": "contract IERC20"
                },
                "id": 777,
                "name": "UserDefinedTypeName",
                "src": "18000:6:0"
              }
            ],
            "id": 778,
            "name": "VariableDeclaration",
            "src": "18000:26:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "periodFinish",
              "scope": 1336,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "uint256",
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "name": "uint256",
                  "type": "uint256"
                },
                "id": 779,
                "name": "ElementaryTypeName",
                "src": "18032:7:0"
              },
              {
                "attributes": {
                  "argumentTypes": null,
                  "hexvalue": "30",
                  "isConstant": false,
                  "isLValue": false,
                  "isPure": true,
                  "lValueRequested": false,
                  "subdenomination": null,
                  "token": "number",
                  "type": "int_const 0",
                  "value": "0"
                },
                "id": 780,
                "name": "Literal",
                "src": "18062:1:0"
              }
            ],
            "id": 781,
            "name": "VariableDeclaration",
            "src": "18032:31:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "rewardRate",
              "scope": 1336,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "uint256",
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "name": "uint256",
                  "type": "uint256"
                },
                "id": 782,
                "name": "ElementaryTypeName",
                "src": "18069:7:0"
              },
              {
                "attributes": {
                  "argumentTypes": null,
                  "hexvalue": "30",
                  "isConstant": false,
                  "isLValue": false,
                  "isPure": true,
                  "lValueRequested": false,
                  "subdenomination": null,
                  "token": "number",
                  "type": "int_const 0",
                  "value": "0"
                },
                "id": 783,
                "name": "Literal",
                "src": "18097:1:0"
              }
            ],
            "id": 784,
            "name": "VariableDeclaration",
            "src": "18069:29:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "rewardsDuration",
              "scope": 1336,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "uint256",
              "value": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "name": "uint256",
                  "type": "uint256"
                },
                "id": 785,
                "name": "ElementaryTypeName",
                "src": "18104:7:0"
              }
            ],
            "id": 786,
            "name": "VariableDeclaration",
            "src": "18104:30:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "lastUpdateTime",
              "scope": 1336,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "uint256",
              "value": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "name": "uint256",
                  "type": "uint256"
                },
                "id": 787,
                "name": "ElementaryTypeName",
                "src": "18140:7:0"
              }
            ],
            "id": 788,
            "name": "VariableDeclaration",
            "src": "18140:29:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "rewardPerTokenStored",
              "scope": 1336,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "uint256",
              "value": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "name": "uint256",
                  "type": "uint256"
                },
                "id": 789,
                "name": "ElementaryTypeName",
                "src": "18175:7:0"
              }
            ],
            "id": 790,
            "name": "VariableDeclaration",
            "src": "18175:35:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "userRewardPerTokenPaid",
              "scope": 1336,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "mapping(address => uint256)",
              "value": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "type": "mapping(address => uint256)"
                },
                "children": [
                  {
                    "attributes": {
                      "name": "address",
                      "type": "address"
                    },
                    "id": 791,
                    "name": "ElementaryTypeName",
                    "src": "18225:7:0"
                  },
                  {
                    "attributes": {
                      "name": "uint256",
                      "type": "uint256"
                    },
                    "id": 792,
                    "name": "ElementaryTypeName",
                    "src": "18236:7:0"
                  }
                ],
                "id": 793,
                "name": "Mapping",
                "src": "18217:27:0"
              }
            ],
            "id": 794,
            "name": "VariableDeclaration",
            "src": "18217:57:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "rewards",
              "scope": 1336,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "mapping(address => uint256)",
              "value": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "type": "mapping(address => uint256)"
                },
                "children": [
                  {
                    "attributes": {
                      "name": "address",
                      "type": "address"
                    },
                    "id": 795,
                    "name": "ElementaryTypeName",
                    "src": "18288:7:0"
                  },
                  {
                    "attributes": {
                      "name": "uint256",
                      "type": "uint256"
                    },
                    "id": 796,
                    "name": "ElementaryTypeName",
                    "src": "18299:7:0"
                  }
                ],
                "id": 797,
                "name": "Mapping",
                "src": "18280:27:0"
              }
            ],
            "id": 798,
            "name": "VariableDeclaration",
            "src": "18280:42:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "_totalSupply",
              "scope": 1336,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "uint256",
              "value": null,
              "visibility": "private"
            },
            "children": [
              {
                "attributes": {
                  "name": "uint256",
                  "type": "uint256"
                },
                "id": 799,
                "name": "ElementaryTypeName",
                "src": "18329:7:0"
              }
            ],
            "id": 800,
            "name": "VariableDeclaration",
            "src": "18329:28:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "_balances",
              "scope": 1336,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "mapping(address => uint256)",
              "value": null,
              "visibility": "private"
            },
            "children": [
              {
                "attributes": {
                  "type": "mapping(address => uint256)"
                },
                "children": [
                  {
                    "attributes": {
                      "name": "address",
                      "type": "address"
                    },
                    "id": 801,
                    "name": "ElementaryTypeName",
                    "src": "18371:7:0"
                  },
                  {
                    "attributes": {
                      "name": "uint256",
                      "type": "uint256"
                    },
                    "id": 802,
                    "name": "ElementaryTypeName",
                    "src": "18382:7:0"
                  }
                ],
                "id": 803,
                "name": "Mapping",
                "src": "18363:27:0"
              }
            ],
            "id": 804,
            "name": "VariableDeclaration",
            "src": "18363:45:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": true,
              "kind": "constructor",
              "modifiers": [
                null
              ],
              "name": "",
              "scope": 1336,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "public"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "_rewardsDistribution",
                      "scope": 836,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 805,
                        "name": "ElementaryTypeName",
                        "src": "18481:7:0"
                      }
                    ],
                    "id": 806,
                    "name": "VariableDeclaration",
                    "src": "18481:28:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "_rewardsToken",
                      "scope": 836,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 807,
                        "name": "ElementaryTypeName",
                        "src": "18519:7:0"
                      }
                    ],
                    "id": 808,
                    "name": "VariableDeclaration",
                    "src": "18519:21:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "_stakingToken",
                      "scope": 836,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 809,
                        "name": "ElementaryTypeName",
                        "src": "18550:7:0"
                      }
                    ],
                    "id": 810,
                    "name": "VariableDeclaration",
                    "src": "18550:21:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "_rewardsDuration",
                      "scope": 836,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 811,
                        "name": "ElementaryTypeName",
                        "src": "18581:7:0"
                      }
                    ],
                    "id": 812,
                    "name": "VariableDeclaration",
                    "src": "18581:24:0"
                  }
                ],
                "id": 813,
                "name": "ParameterList",
                "src": "18471:140:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 814,
                "name": "ParameterList",
                "src": "18619:0:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "contract IERC20"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 776,
                              "type": "contract IERC20",
                              "value": "rewardsToken"
                            },
                            "id": 815,
                            "name": "Identifier",
                            "src": "18629:12:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "contract IERC20",
                              "type_conversion": true
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 68,
                                  "type": "type(contract IERC20)",
                                  "value": "IERC20"
                                },
                                "id": 816,
                                "name": "Identifier",
                                "src": "18644:6:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 808,
                                  "type": "address",
                                  "value": "_rewardsToken"
                                },
                                "id": 817,
                                "name": "Identifier",
                                "src": "18651:13:0"
                              }
                            ],
                            "id": 818,
                            "name": "FunctionCall",
                            "src": "18644:21:0"
                          }
                        ],
                        "id": 819,
                        "name": "Assignment",
                        "src": "18629:36:0"
                      }
                    ],
                    "id": 820,
                    "name": "ExpressionStatement",
                    "src": "18629:36:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "contract IERC20"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 778,
                              "type": "contract IERC20",
                              "value": "stakingToken"
                            },
                            "id": 821,
                            "name": "Identifier",
                            "src": "18675:12:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "contract IERC20",
                              "type_conversion": true
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 68,
                                  "type": "type(contract IERC20)",
                                  "value": "IERC20"
                                },
                                "id": 822,
                                "name": "Identifier",
                                "src": "18690:6:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 810,
                                  "type": "address",
                                  "value": "_stakingToken"
                                },
                                "id": 823,
                                "name": "Identifier",
                                "src": "18697:13:0"
                              }
                            ],
                            "id": 824,
                            "name": "FunctionCall",
                            "src": "18690:21:0"
                          }
                        ],
                        "id": 825,
                        "name": "Assignment",
                        "src": "18675:36:0"
                      }
                    ],
                    "id": 826,
                    "name": "ExpressionStatement",
                    "src": "18675:36:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "address"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 744,
                              "type": "address",
                              "value": "rewardsDistribution"
                            },
                            "id": 827,
                            "name": "Identifier",
                            "src": "18721:19:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 806,
                              "type": "address",
                              "value": "_rewardsDistribution"
                            },
                            "id": 828,
                            "name": "Identifier",
                            "src": "18743:20:0"
                          }
                        ],
                        "id": 829,
                        "name": "Assignment",
                        "src": "18721:42:0"
                      }
                    ],
                    "id": 830,
                    "name": "ExpressionStatement",
                    "src": "18721:42:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 786,
                              "type": "uint256",
                              "value": "rewardsDuration"
                            },
                            "id": 831,
                            "name": "Identifier",
                            "src": "18773:15:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 812,
                              "type": "uint256",
                              "value": "_rewardsDuration"
                            },
                            "id": 832,
                            "name": "Identifier",
                            "src": "18791:16:0"
                          }
                        ],
                        "id": 833,
                        "name": "Assignment",
                        "src": "18773:34:0"
                      }
                    ],
                    "id": 834,
                    "name": "ExpressionStatement",
                    "src": "18773:34:0"
                  }
                ],
                "id": 835,
                "name": "Block",
                "src": "18619:195:0"
              }
            ],
            "id": 836,
            "name": "FunctionDefinition",
            "src": "18460:354:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "totalSupply",
              "scope": 1336,
              "stateMutability": "view",
              "superFunction": 718,
              "visibility": "external"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 837,
                "name": "ParameterList",
                "src": "18879:2:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 844,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 838,
                        "name": "ElementaryTypeName",
                        "src": "18905:7:0"
                      }
                    ],
                    "id": 839,
                    "name": "VariableDeclaration",
                    "src": "18905:7:0"
                  }
                ],
                "id": 840,
                "name": "ParameterList",
                "src": "18904:9:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 840
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "overloadedDeclarations": [
                            null
                          ],
                          "referencedDeclaration": 800,
                          "type": "uint256",
                          "value": "_totalSupply"
                        },
                        "id": 841,
                        "name": "Identifier",
                        "src": "18931:12:0"
                      }
                    ],
                    "id": 842,
                    "name": "Return",
                    "src": "18924:19:0"
                  }
                ],
                "id": 843,
                "name": "Block",
                "src": "18914:36:0"
              }
            ],
            "id": 844,
            "name": "FunctionDefinition",
            "src": "18859:91:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "balanceOf",
              "scope": 1336,
              "stateMutability": "view",
              "superFunction": 725,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "account",
                      "scope": 856,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 845,
                        "name": "ElementaryTypeName",
                        "src": "18975:7:0"
                      }
                    ],
                    "id": 846,
                    "name": "VariableDeclaration",
                    "src": "18975:15:0"
                  }
                ],
                "id": 847,
                "name": "ParameterList",
                "src": "18974:17:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 856,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 848,
                        "name": "ElementaryTypeName",
                        "src": "19015:7:0"
                      }
                    ],
                    "id": 849,
                    "name": "VariableDeclaration",
                    "src": "19015:7:0"
                  }
                ],
                "id": 850,
                "name": "ParameterList",
                "src": "19014:9:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 850
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 804,
                              "type": "mapping(address => uint256)",
                              "value": "_balances"
                            },
                            "id": 851,
                            "name": "Identifier",
                            "src": "19041:9:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 846,
                              "type": "address",
                              "value": "account"
                            },
                            "id": 852,
                            "name": "Identifier",
                            "src": "19051:7:0"
                          }
                        ],
                        "id": 853,
                        "name": "IndexAccess",
                        "src": "19041:18:0"
                      }
                    ],
                    "id": 854,
                    "name": "Return",
                    "src": "19034:25:0"
                  }
                ],
                "id": 855,
                "name": "Block",
                "src": "19024:42:0"
              }
            ],
            "id": 856,
            "name": "FunctionDefinition",
            "src": "18956:110:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "lastTimeRewardApplicable",
              "scope": 1336,
              "stateMutability": "view",
              "superFunction": 696,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 857,
                "name": "ParameterList",
                "src": "19105:2:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 869,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 858,
                        "name": "ElementaryTypeName",
                        "src": "19129:7:0"
                      }
                    ],
                    "id": 859,
                    "name": "VariableDeclaration",
                    "src": "19129:7:0"
                  }
                ],
                "id": 860,
                "name": "ParameterList",
                "src": "19128:9:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 860
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "uint256",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "min",
                              "referencedDeclaration": 342,
                              "type": "function (uint256,uint256) pure returns (uint256)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 375,
                                  "type": "type(library Math)",
                                  "value": "Math"
                                },
                                "id": 861,
                                "name": "Identifier",
                                "src": "19155:4:0"
                              }
                            ],
                            "id": 862,
                            "name": "MemberAccess",
                            "src": "19155:8:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "timestamp",
                              "referencedDeclaration": null,
                              "type": "uint256"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1550,
                                  "type": "block",
                                  "value": "block"
                                },
                                "id": 863,
                                "name": "Identifier",
                                "src": "19164:5:0"
                              }
                            ],
                            "id": 864,
                            "name": "MemberAccess",
                            "src": "19164:15:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 781,
                              "type": "uint256",
                              "value": "periodFinish"
                            },
                            "id": 865,
                            "name": "Identifier",
                            "src": "19181:12:0"
                          }
                        ],
                        "id": 866,
                        "name": "FunctionCall",
                        "src": "19155:39:0"
                      }
                    ],
                    "id": 867,
                    "name": "Return",
                    "src": "19148:46:0"
                  }
                ],
                "id": 868,
                "name": "Block",
                "src": "19138:63:0"
              }
            ],
            "id": 869,
            "name": "FunctionDefinition",
            "src": "19072:129:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "rewardPerToken",
              "scope": 1336,
              "stateMutability": "view",
              "superFunction": 701,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 870,
                "name": "ParameterList",
                "src": "19230:2:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 900,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 871,
                        "name": "ElementaryTypeName",
                        "src": "19254:7:0"
                      }
                    ],
                    "id": 872,
                    "name": "VariableDeclaration",
                    "src": "19254:7:0"
                  }
                ],
                "id": 873,
                "name": "ParameterList",
                "src": "19253:9:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "falseBody": null
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "==",
                          "type": "bool"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 800,
                              "type": "uint256",
                              "value": "_totalSupply"
                            },
                            "id": 874,
                            "name": "Identifier",
                            "src": "19277:12:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "30",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "number",
                              "type": "int_const 0",
                              "value": "0"
                            },
                            "id": 875,
                            "name": "Literal",
                            "src": "19293:1:0"
                          }
                        ],
                        "id": 876,
                        "name": "BinaryOperation",
                        "src": "19277:17:0"
                      },
                      {
                        "children": [
                          {
                            "attributes": {
                              "functionReturnParameters": 873
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 790,
                                  "type": "uint256",
                                  "value": "rewardPerTokenStored"
                                },
                                "id": 877,
                                "name": "Identifier",
                                "src": "19317:20:0"
                              }
                            ],
                            "id": 878,
                            "name": "Return",
                            "src": "19310:27:0"
                          }
                        ],
                        "id": 879,
                        "name": "Block",
                        "src": "19296:52:0"
                      }
                    ],
                    "id": 880,
                    "name": "IfStatement",
                    "src": "19273:75:0"
                  },
                  {
                    "attributes": {
                      "functionReturnParameters": 873
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "uint256",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "add",
                              "referencedDeclaration": 202,
                              "type": "function (uint256,uint256) pure returns (uint256)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 790,
                                  "type": "uint256",
                                  "value": "rewardPerTokenStored"
                                },
                                "id": 881,
                                "name": "Identifier",
                                "src": "19376:20:0"
                              }
                            ],
                            "id": 882,
                            "name": "MemberAccess",
                            "src": "19376:24:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "uint256",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "div",
                                  "referencedDeclaration": 286,
                                  "type": "function (uint256,uint256) pure returns (uint256)"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "isStructConstructorCall": false,
                                      "lValueRequested": false,
                                      "names": [
                                        null
                                      ],
                                      "type": "uint256",
                                      "type_conversion": false
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_rational_1000000000000000000_by_1",
                                              "typeString": "int_const 1000000000000000000"
                                            }
                                          ],
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "member_name": "mul",
                                          "referencedDeclaration": 261,
                                          "type": "function (uint256,uint256) pure returns (uint256)"
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "isStructConstructorCall": false,
                                              "lValueRequested": false,
                                              "names": [
                                                null
                                              ],
                                              "type": "uint256",
                                              "type_conversion": false
                                            },
                                            "children": [
                                              {
                                                "attributes": {
                                                  "argumentTypes": [
                                                    {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    }
                                                  ],
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "member_name": "mul",
                                                  "referencedDeclaration": 261,
                                                  "type": "function (uint256,uint256) pure returns (uint256)"
                                                },
                                                "children": [
                                                  {
                                                    "attributes": {
                                                      "argumentTypes": null,
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": false,
                                                      "isStructConstructorCall": false,
                                                      "lValueRequested": false,
                                                      "names": [
                                                        null
                                                      ],
                                                      "type": "uint256",
                                                      "type_conversion": false
                                                    },
                                                    "children": [
                                                      {
                                                        "attributes": {
                                                          "argumentTypes": [
                                                            {
                                                              "typeIdentifier": "t_uint256",
                                                              "typeString": "uint256"
                                                            }
                                                          ],
                                                          "isConstant": false,
                                                          "isLValue": false,
                                                          "isPure": false,
                                                          "lValueRequested": false,
                                                          "member_name": "sub",
                                                          "referencedDeclaration": 227,
                                                          "type": "function (uint256,uint256) pure returns (uint256)"
                                                        },
                                                        "children": [
                                                          {
                                                            "attributes": {
                                                              "argumentTypes": null,
                                                              "arguments": [
                                                                null
                                                              ],
                                                              "isConstant": false,
                                                              "isLValue": false,
                                                              "isPure": false,
                                                              "isStructConstructorCall": false,
                                                              "lValueRequested": false,
                                                              "names": [
                                                                null
                                                              ],
                                                              "type": "uint256",
                                                              "type_conversion": false
                                                            },
                                                            "children": [
                                                              {
                                                                "attributes": {
                                                                  "argumentTypes": [
                                                                    null
                                                                  ],
                                                                  "overloadedDeclarations": [
                                                                    null
                                                                  ],
                                                                  "referencedDeclaration": 869,
                                                                  "type": "function () view returns (uint256)",
                                                                  "value": "lastTimeRewardApplicable"
                                                                },
                                                                "id": 883,
                                                                "name": "Identifier",
                                                                "src": "19418:24:0"
                                                              }
                                                            ],
                                                            "id": 884,
                                                            "name": "FunctionCall",
                                                            "src": "19418:26:0"
                                                          }
                                                        ],
                                                        "id": 885,
                                                        "name": "MemberAccess",
                                                        "src": "19418:30:0"
                                                      },
                                                      {
                                                        "attributes": {
                                                          "argumentTypes": null,
                                                          "overloadedDeclarations": [
                                                            null
                                                          ],
                                                          "referencedDeclaration": 788,
                                                          "type": "uint256",
                                                          "value": "lastUpdateTime"
                                                        },
                                                        "id": 886,
                                                        "name": "Identifier",
                                                        "src": "19449:14:0"
                                                      }
                                                    ],
                                                    "id": 887,
                                                    "name": "FunctionCall",
                                                    "src": "19418:46:0"
                                                  }
                                                ],
                                                "id": 888,
                                                "name": "MemberAccess",
                                                "src": "19418:50:0"
                                              },
                                              {
                                                "attributes": {
                                                  "argumentTypes": null,
                                                  "overloadedDeclarations": [
                                                    null
                                                  ],
                                                  "referencedDeclaration": 784,
                                                  "type": "uint256",
                                                  "value": "rewardRate"
                                                },
                                                "id": 889,
                                                "name": "Identifier",
                                                "src": "19469:10:0"
                                              }
                                            ],
                                            "id": 890,
                                            "name": "FunctionCall",
                                            "src": "19418:62:0"
                                          }
                                        ],
                                        "id": 891,
                                        "name": "MemberAccess",
                                        "src": "19418:66:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "hexvalue": "31653138",
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "subdenomination": null,
                                          "token": "number",
                                          "type": "int_const 1000000000000000000",
                                          "value": "1e18"
                                        },
                                        "id": 892,
                                        "name": "Literal",
                                        "src": "19485:4:0"
                                      }
                                    ],
                                    "id": 893,
                                    "name": "FunctionCall",
                                    "src": "19418:72:0"
                                  }
                                ],
                                "id": 894,
                                "name": "MemberAccess",
                                "src": "19418:76:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 800,
                                  "type": "uint256",
                                  "value": "_totalSupply"
                                },
                                "id": 895,
                                "name": "Identifier",
                                "src": "19495:12:0"
                              }
                            ],
                            "id": 896,
                            "name": "FunctionCall",
                            "src": "19418:90:0"
                          }
                        ],
                        "id": 897,
                        "name": "FunctionCall",
                        "src": "19376:146:0"
                      }
                    ],
                    "id": 898,
                    "name": "Return",
                    "src": "19357:165:0"
                  }
                ],
                "id": 899,
                "name": "Block",
                "src": "19263:266:0"
              }
            ],
            "id": 900,
            "name": "FunctionDefinition",
            "src": "19207:322:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "earned",
              "scope": 1336,
              "stateMutability": "view",
              "superFunction": 708,
              "visibility": "public"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "account",
                      "scope": 929,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 901,
                        "name": "ElementaryTypeName",
                        "src": "19551:7:0"
                      }
                    ],
                    "id": 902,
                    "name": "VariableDeclaration",
                    "src": "19551:15:0"
                  }
                ],
                "id": 903,
                "name": "ParameterList",
                "src": "19550:17:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 929,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 904,
                        "name": "ElementaryTypeName",
                        "src": "19589:7:0"
                      }
                    ],
                    "id": 905,
                    "name": "VariableDeclaration",
                    "src": "19589:7:0"
                  }
                ],
                "id": 906,
                "name": "ParameterList",
                "src": "19588:9:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 906
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "uint256",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "add",
                              "referencedDeclaration": 202,
                              "type": "function (uint256,uint256) pure returns (uint256)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "uint256",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_rational_1000000000000000000_by_1",
                                          "typeString": "int_const 1000000000000000000"
                                        }
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "div",
                                      "referencedDeclaration": 286,
                                      "type": "function (uint256,uint256) pure returns (uint256)"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "isStructConstructorCall": false,
                                          "lValueRequested": false,
                                          "names": [
                                            null
                                          ],
                                          "type": "uint256",
                                          "type_conversion": false
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              ],
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "member_name": "mul",
                                              "referencedDeclaration": 261,
                                              "type": "function (uint256,uint256) pure returns (uint256)"
                                            },
                                            "children": [
                                              {
                                                "attributes": {
                                                  "argumentTypes": null,
                                                  "isConstant": false,
                                                  "isLValue": true,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "type": "uint256"
                                                },
                                                "children": [
                                                  {
                                                    "attributes": {
                                                      "argumentTypes": null,
                                                      "overloadedDeclarations": [
                                                        null
                                                      ],
                                                      "referencedDeclaration": 804,
                                                      "type": "mapping(address => uint256)",
                                                      "value": "_balances"
                                                    },
                                                    "id": 907,
                                                    "name": "Identifier",
                                                    "src": "19615:9:0"
                                                  },
                                                  {
                                                    "attributes": {
                                                      "argumentTypes": null,
                                                      "overloadedDeclarations": [
                                                        null
                                                      ],
                                                      "referencedDeclaration": 902,
                                                      "type": "address",
                                                      "value": "account"
                                                    },
                                                    "id": 908,
                                                    "name": "Identifier",
                                                    "src": "19625:7:0"
                                                  }
                                                ],
                                                "id": 909,
                                                "name": "IndexAccess",
                                                "src": "19615:18:0"
                                              }
                                            ],
                                            "id": 910,
                                            "name": "MemberAccess",
                                            "src": "19615:22:0"
                                          },
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "isStructConstructorCall": false,
                                              "lValueRequested": false,
                                              "names": [
                                                null
                                              ],
                                              "type": "uint256",
                                              "type_conversion": false
                                            },
                                            "children": [
                                              {
                                                "attributes": {
                                                  "argumentTypes": [
                                                    {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    }
                                                  ],
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "member_name": "sub",
                                                  "referencedDeclaration": 227,
                                                  "type": "function (uint256,uint256) pure returns (uint256)"
                                                },
                                                "children": [
                                                  {
                                                    "attributes": {
                                                      "argumentTypes": null,
                                                      "arguments": [
                                                        null
                                                      ],
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": false,
                                                      "isStructConstructorCall": false,
                                                      "lValueRequested": false,
                                                      "names": [
                                                        null
                                                      ],
                                                      "type": "uint256",
                                                      "type_conversion": false
                                                    },
                                                    "children": [
                                                      {
                                                        "attributes": {
                                                          "argumentTypes": [
                                                            null
                                                          ],
                                                          "overloadedDeclarations": [
                                                            null
                                                          ],
                                                          "referencedDeclaration": 900,
                                                          "type": "function () view returns (uint256)",
                                                          "value": "rewardPerToken"
                                                        },
                                                        "id": 911,
                                                        "name": "Identifier",
                                                        "src": "19638:14:0"
                                                      }
                                                    ],
                                                    "id": 912,
                                                    "name": "FunctionCall",
                                                    "src": "19638:16:0"
                                                  }
                                                ],
                                                "id": 913,
                                                "name": "MemberAccess",
                                                "src": "19638:20:0"
                                              },
                                              {
                                                "attributes": {
                                                  "argumentTypes": null,
                                                  "isConstant": false,
                                                  "isLValue": true,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "type": "uint256"
                                                },
                                                "children": [
                                                  {
                                                    "attributes": {
                                                      "argumentTypes": null,
                                                      "overloadedDeclarations": [
                                                        null
                                                      ],
                                                      "referencedDeclaration": 794,
                                                      "type": "mapping(address => uint256)",
                                                      "value": "userRewardPerTokenPaid"
                                                    },
                                                    "id": 914,
                                                    "name": "Identifier",
                                                    "src": "19659:22:0"
                                                  },
                                                  {
                                                    "attributes": {
                                                      "argumentTypes": null,
                                                      "overloadedDeclarations": [
                                                        null
                                                      ],
                                                      "referencedDeclaration": 902,
                                                      "type": "address",
                                                      "value": "account"
                                                    },
                                                    "id": 915,
                                                    "name": "Identifier",
                                                    "src": "19682:7:0"
                                                  }
                                                ],
                                                "id": 916,
                                                "name": "IndexAccess",
                                                "src": "19659:31:0"
                                              }
                                            ],
                                            "id": 917,
                                            "name": "FunctionCall",
                                            "src": "19638:53:0"
                                          }
                                        ],
                                        "id": 918,
                                        "name": "FunctionCall",
                                        "src": "19615:77:0"
                                      }
                                    ],
                                    "id": 919,
                                    "name": "MemberAccess",
                                    "src": "19615:81:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "hexvalue": "31653138",
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "subdenomination": null,
                                      "token": "number",
                                      "type": "int_const 1000000000000000000",
                                      "value": "1e18"
                                    },
                                    "id": 920,
                                    "name": "Literal",
                                    "src": "19697:4:0"
                                  }
                                ],
                                "id": 921,
                                "name": "FunctionCall",
                                "src": "19615:87:0"
                              }
                            ],
                            "id": 922,
                            "name": "MemberAccess",
                            "src": "19615:91:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "type": "uint256"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 798,
                                  "type": "mapping(address => uint256)",
                                  "value": "rewards"
                                },
                                "id": 923,
                                "name": "Identifier",
                                "src": "19707:7:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 902,
                                  "type": "address",
                                  "value": "account"
                                },
                                "id": 924,
                                "name": "Identifier",
                                "src": "19715:7:0"
                              }
                            ],
                            "id": 925,
                            "name": "IndexAccess",
                            "src": "19707:16:0"
                          }
                        ],
                        "id": 926,
                        "name": "FunctionCall",
                        "src": "19615:109:0"
                      }
                    ],
                    "id": 927,
                    "name": "Return",
                    "src": "19608:116:0"
                  }
                ],
                "id": 928,
                "name": "Block",
                "src": "19598:133:0"
              }
            ],
            "id": 929,
            "name": "FunctionDefinition",
            "src": "19535:196:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "getRewardForDuration",
              "scope": 1336,
              "stateMutability": "view",
              "superFunction": 713,
              "visibility": "external"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 930,
                "name": "ParameterList",
                "src": "19766:2:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 940,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 931,
                        "name": "ElementaryTypeName",
                        "src": "19792:7:0"
                      }
                    ],
                    "id": 932,
                    "name": "VariableDeclaration",
                    "src": "19792:7:0"
                  }
                ],
                "id": 933,
                "name": "ParameterList",
                "src": "19791:9:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 933
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "uint256",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "mul",
                              "referencedDeclaration": 261,
                              "type": "function (uint256,uint256) pure returns (uint256)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 784,
                                  "type": "uint256",
                                  "value": "rewardRate"
                                },
                                "id": 934,
                                "name": "Identifier",
                                "src": "19818:10:0"
                              }
                            ],
                            "id": 935,
                            "name": "MemberAccess",
                            "src": "19818:14:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 786,
                              "type": "uint256",
                              "value": "rewardsDuration"
                            },
                            "id": 936,
                            "name": "Identifier",
                            "src": "19833:15:0"
                          }
                        ],
                        "id": 937,
                        "name": "FunctionCall",
                        "src": "19818:31:0"
                      }
                    ],
                    "id": 938,
                    "name": "Return",
                    "src": "19811:38:0"
                  }
                ],
                "id": 939,
                "name": "Block",
                "src": "19801:55:0"
              }
            ],
            "id": 940,
            "name": "FunctionDefinition",
            "src": "19737:119:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "name": "stakeWithPermit",
              "scope": 1336,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "amount",
                      "scope": 1022,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 941,
                        "name": "ElementaryTypeName",
                        "src": "19939:7:0"
                      }
                    ],
                    "id": 942,
                    "name": "VariableDeclaration",
                    "src": "19939:14:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "deadline",
                      "scope": 1022,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint",
                          "type": "uint256"
                        },
                        "id": 943,
                        "name": "ElementaryTypeName",
                        "src": "19955:4:0"
                      }
                    ],
                    "id": 944,
                    "name": "VariableDeclaration",
                    "src": "19955:13:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "v",
                      "scope": 1022,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint8",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint8",
                          "type": "uint8"
                        },
                        "id": 945,
                        "name": "ElementaryTypeName",
                        "src": "19970:5:0"
                      }
                    ],
                    "id": 946,
                    "name": "VariableDeclaration",
                    "src": "19970:7:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "r",
                      "scope": 1022,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 947,
                        "name": "ElementaryTypeName",
                        "src": "19979:7:0"
                      }
                    ],
                    "id": 948,
                    "name": "VariableDeclaration",
                    "src": "19979:9:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "s",
                      "scope": 1022,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 949,
                        "name": "ElementaryTypeName",
                        "src": "19990:7:0"
                      }
                    ],
                    "id": 950,
                    "name": "VariableDeclaration",
                    "src": "19990:9:0"
                  }
                ],
                "id": 951,
                "name": "ParameterList",
                "src": "19938:62:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 958,
                "name": "ParameterList",
                "src": "20048:0:0"
              },
              {
                "attributes": {
                  "arguments": null
                },
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 690,
                      "type": "modifier ()",
                      "value": "nonReentrant"
                    },
                    "id": 952,
                    "name": "Identifier",
                    "src": "20010:12:0"
                  }
                ],
                "id": 953,
                "name": "ModifierInvocation",
                "src": "20010:12:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 1313,
                      "type": "modifier (address)",
                      "value": "updateReward"
                    },
                    "id": 954,
                    "name": "Identifier",
                    "src": "20023:12:0"
                  },
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "member_name": "sender",
                      "referencedDeclaration": null,
                      "type": "address payable"
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "overloadedDeclarations": [
                            null
                          ],
                          "referencedDeclaration": 1560,
                          "type": "msg",
                          "value": "msg"
                        },
                        "id": 955,
                        "name": "Identifier",
                        "src": "20036:3:0"
                      }
                    ],
                    "id": 956,
                    "name": "MemberAccess",
                    "src": "20036:10:0"
                  }
                ],
                "id": 957,
                "name": "ModifierInvocation",
                "src": "20023:24:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_2972ce884b95fc24c703b7f04fae79e4ca7287e77fa26ed09d1faa4263e887ab",
                                  "typeString": "literal_string \"Cannot stake 0\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 959,
                            "name": "Identifier",
                            "src": "20058:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": ">",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 942,
                                  "type": "uint256",
                                  "value": "amount"
                                },
                                "id": 960,
                                "name": "Identifier",
                                "src": "20066:6:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "hexvalue": "30",
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "subdenomination": null,
                                  "token": "number",
                                  "type": "int_const 0",
                                  "value": "0"
                                },
                                "id": 961,
                                "name": "Literal",
                                "src": "20075:1:0"
                              }
                            ],
                            "id": 962,
                            "name": "BinaryOperation",
                            "src": "20066:10:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "43616e6e6f74207374616b652030",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"Cannot stake 0\"",
                              "value": "Cannot stake 0"
                            },
                            "id": 963,
                            "name": "Literal",
                            "src": "20078:16:0"
                          }
                        ],
                        "id": 964,
                        "name": "FunctionCall",
                        "src": "20058:37:0"
                      }
                    ],
                    "id": 965,
                    "name": "ExpressionStatement",
                    "src": "20058:37:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 800,
                              "type": "uint256",
                              "value": "_totalSupply"
                            },
                            "id": 966,
                            "name": "Identifier",
                            "src": "20105:12:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "uint256",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "add",
                                  "referencedDeclaration": 202,
                                  "type": "function (uint256,uint256) pure returns (uint256)"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 800,
                                      "type": "uint256",
                                      "value": "_totalSupply"
                                    },
                                    "id": 967,
                                    "name": "Identifier",
                                    "src": "20120:12:0"
                                  }
                                ],
                                "id": 968,
                                "name": "MemberAccess",
                                "src": "20120:16:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 942,
                                  "type": "uint256",
                                  "value": "amount"
                                },
                                "id": 969,
                                "name": "Identifier",
                                "src": "20137:6:0"
                              }
                            ],
                            "id": 970,
                            "name": "FunctionCall",
                            "src": "20120:24:0"
                          }
                        ],
                        "id": 971,
                        "name": "Assignment",
                        "src": "20105:39:0"
                      }
                    ],
                    "id": 972,
                    "name": "ExpressionStatement",
                    "src": "20105:39:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": true,
                              "type": "uint256"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 804,
                                  "type": "mapping(address => uint256)",
                                  "value": "_balances"
                                },
                                "id": 973,
                                "name": "Identifier",
                                "src": "20154:9:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "sender",
                                  "referencedDeclaration": null,
                                  "type": "address payable"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1560,
                                      "type": "msg",
                                      "value": "msg"
                                    },
                                    "id": 974,
                                    "name": "Identifier",
                                    "src": "20164:3:0"
                                  }
                                ],
                                "id": 975,
                                "name": "MemberAccess",
                                "src": "20164:10:0"
                              }
                            ],
                            "id": 976,
                            "name": "IndexAccess",
                            "src": "20154:21:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "uint256",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "add",
                                  "referencedDeclaration": 202,
                                  "type": "function (uint256,uint256) pure returns (uint256)"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "type": "uint256"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 804,
                                          "type": "mapping(address => uint256)",
                                          "value": "_balances"
                                        },
                                        "id": 977,
                                        "name": "Identifier",
                                        "src": "20178:9:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "member_name": "sender",
                                          "referencedDeclaration": null,
                                          "type": "address payable"
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "overloadedDeclarations": [
                                                null
                                              ],
                                              "referencedDeclaration": 1560,
                                              "type": "msg",
                                              "value": "msg"
                                            },
                                            "id": 978,
                                            "name": "Identifier",
                                            "src": "20188:3:0"
                                          }
                                        ],
                                        "id": 979,
                                        "name": "MemberAccess",
                                        "src": "20188:10:0"
                                      }
                                    ],
                                    "id": 980,
                                    "name": "IndexAccess",
                                    "src": "20178:21:0"
                                  }
                                ],
                                "id": 981,
                                "name": "MemberAccess",
                                "src": "20178:25:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 942,
                                  "type": "uint256",
                                  "value": "amount"
                                },
                                "id": 982,
                                "name": "Identifier",
                                "src": "20204:6:0"
                              }
                            ],
                            "id": 983,
                            "name": "FunctionCall",
                            "src": "20178:33:0"
                          }
                        ],
                        "id": 984,
                        "name": "Assignment",
                        "src": "20154:57:0"
                      }
                    ],
                    "id": 985,
                    "name": "ExpressionStatement",
                    "src": "20154:57:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                },
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_uint8",
                                  "typeString": "uint8"
                                },
                                {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                },
                                {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "permit",
                              "referencedDeclaration": 1353,
                              "type": "function (address,address,uint256,uint256,uint8,bytes32,bytes32) external"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "contract IUniswapV2ERC20",
                                  "type_conversion": true
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1354,
                                      "type": "type(contract IUniswapV2ERC20)",
                                      "value": "IUniswapV2ERC20"
                                    },
                                    "id": 986,
                                    "name": "Identifier",
                                    "src": "20240:15:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "isStructConstructorCall": false,
                                      "lValueRequested": false,
                                      "names": [
                                        null
                                      ],
                                      "type": "address",
                                      "type_conversion": true
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_contract$_IERC20_$68",
                                              "typeString": "contract IERC20"
                                            }
                                          ],
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "type": "type(address)",
                                          "value": "address"
                                        },
                                        "id": 987,
                                        "name": "ElementaryTypeNameExpression",
                                        "src": "20256:7:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 778,
                                          "type": "contract IERC20",
                                          "value": "stakingToken"
                                        },
                                        "id": 988,
                                        "name": "Identifier",
                                        "src": "20264:12:0"
                                      }
                                    ],
                                    "id": 989,
                                    "name": "FunctionCall",
                                    "src": "20256:21:0"
                                  }
                                ],
                                "id": 990,
                                "name": "FunctionCall",
                                "src": "20240:38:0"
                              }
                            ],
                            "id": 991,
                            "name": "MemberAccess",
                            "src": "20240:45:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "sender",
                              "referencedDeclaration": null,
                              "type": "address payable"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1560,
                                  "type": "msg",
                                  "value": "msg"
                                },
                                "id": 992,
                                "name": "Identifier",
                                "src": "20286:3:0"
                              }
                            ],
                            "id": 993,
                            "name": "MemberAccess",
                            "src": "20286:10:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "address",
                              "type_conversion": true
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_StakingRewards_$1336",
                                      "typeString": "contract StakingRewards"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "type": "type(address)",
                                  "value": "address"
                                },
                                "id": 994,
                                "name": "ElementaryTypeNameExpression",
                                "src": "20298:7:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1594,
                                  "type": "contract StakingRewards",
                                  "value": "this"
                                },
                                "id": 995,
                                "name": "Identifier",
                                "src": "20306:4:0"
                              }
                            ],
                            "id": 996,
                            "name": "FunctionCall",
                            "src": "20298:13:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 942,
                              "type": "uint256",
                              "value": "amount"
                            },
                            "id": 997,
                            "name": "Identifier",
                            "src": "20313:6:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 944,
                              "type": "uint256",
                              "value": "deadline"
                            },
                            "id": 998,
                            "name": "Identifier",
                            "src": "20321:8:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 946,
                              "type": "uint8",
                              "value": "v"
                            },
                            "id": 999,
                            "name": "Identifier",
                            "src": "20331:1:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 948,
                              "type": "bytes32",
                              "value": "r"
                            },
                            "id": 1000,
                            "name": "Identifier",
                            "src": "20334:1:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 950,
                              "type": "bytes32",
                              "value": "s"
                            },
                            "id": 1001,
                            "name": "Identifier",
                            "src": "20337:1:0"
                          }
                        ],
                        "id": 1002,
                        "name": "FunctionCall",
                        "src": "20240:99:0"
                      }
                    ],
                    "id": 1003,
                    "name": "ExpressionStatement",
                    "src": "20240:99:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                },
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "safeTransferFrom",
                              "referencedDeclaration": 500,
                              "type": "function (contract IERC20,address,address,uint256)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 778,
                                  "type": "contract IERC20",
                                  "value": "stakingToken"
                                },
                                "id": 1004,
                                "name": "Identifier",
                                "src": "20350:12:0"
                              }
                            ],
                            "id": 1006,
                            "name": "MemberAccess",
                            "src": "20350:29:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "sender",
                              "referencedDeclaration": null,
                              "type": "address payable"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1560,
                                  "type": "msg",
                                  "value": "msg"
                                },
                                "id": 1007,
                                "name": "Identifier",
                                "src": "20380:3:0"
                              }
                            ],
                            "id": 1008,
                            "name": "MemberAccess",
                            "src": "20380:10:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "address",
                              "type_conversion": true
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_StakingRewards_$1336",
                                      "typeString": "contract StakingRewards"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "type": "type(address)",
                                  "value": "address"
                                },
                                "id": 1009,
                                "name": "ElementaryTypeNameExpression",
                                "src": "20392:7:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1594,
                                  "type": "contract StakingRewards",
                                  "value": "this"
                                },
                                "id": 1010,
                                "name": "Identifier",
                                "src": "20400:4:0"
                              }
                            ],
                            "id": 1011,
                            "name": "FunctionCall",
                            "src": "20392:13:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 942,
                              "type": "uint256",
                              "value": "amount"
                            },
                            "id": 1012,
                            "name": "Identifier",
                            "src": "20407:6:0"
                          }
                        ],
                        "id": 1013,
                        "name": "FunctionCall",
                        "src": "20350:64:0"
                      }
                    ],
                    "id": 1014,
                    "name": "ExpressionStatement",
                    "src": "20350:64:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1323,
                              "type": "function (address,uint256)",
                              "value": "Staked"
                            },
                            "id": 1015,
                            "name": "Identifier",
                            "src": "20429:6:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "sender",
                              "referencedDeclaration": null,
                              "type": "address payable"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1560,
                                  "type": "msg",
                                  "value": "msg"
                                },
                                "id": 1016,
                                "name": "Identifier",
                                "src": "20436:3:0"
                              }
                            ],
                            "id": 1017,
                            "name": "MemberAccess",
                            "src": "20436:10:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 942,
                              "type": "uint256",
                              "value": "amount"
                            },
                            "id": 1018,
                            "name": "Identifier",
                            "src": "20448:6:0"
                          }
                        ],
                        "id": 1019,
                        "name": "FunctionCall",
                        "src": "20429:26:0"
                      }
                    ],
                    "id": 1020,
                    "name": "EmitStatement",
                    "src": "20424:31:0"
                  }
                ],
                "id": 1021,
                "name": "Block",
                "src": "20048:414:0"
              }
            ],
            "id": 1022,
            "name": "FunctionDefinition",
            "src": "19914:548:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "name": "stake",
              "scope": 1336,
              "stateMutability": "nonpayable",
              "superFunction": 730,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "amount",
                      "scope": 1078,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 1023,
                        "name": "ElementaryTypeName",
                        "src": "20483:7:0"
                      }
                    ],
                    "id": 1024,
                    "name": "VariableDeclaration",
                    "src": "20483:14:0"
                  }
                ],
                "id": 1025,
                "name": "ParameterList",
                "src": "20482:16:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 1032,
                "name": "ParameterList",
                "src": "20546:0:0"
              },
              {
                "attributes": {
                  "arguments": null
                },
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 690,
                      "type": "modifier ()",
                      "value": "nonReentrant"
                    },
                    "id": 1026,
                    "name": "Identifier",
                    "src": "20508:12:0"
                  }
                ],
                "id": 1027,
                "name": "ModifierInvocation",
                "src": "20508:12:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 1313,
                      "type": "modifier (address)",
                      "value": "updateReward"
                    },
                    "id": 1028,
                    "name": "Identifier",
                    "src": "20521:12:0"
                  },
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "member_name": "sender",
                      "referencedDeclaration": null,
                      "type": "address payable"
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "overloadedDeclarations": [
                            null
                          ],
                          "referencedDeclaration": 1560,
                          "type": "msg",
                          "value": "msg"
                        },
                        "id": 1029,
                        "name": "Identifier",
                        "src": "20534:3:0"
                      }
                    ],
                    "id": 1030,
                    "name": "MemberAccess",
                    "src": "20534:10:0"
                  }
                ],
                "id": 1031,
                "name": "ModifierInvocation",
                "src": "20521:24:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_2972ce884b95fc24c703b7f04fae79e4ca7287e77fa26ed09d1faa4263e887ab",
                                  "typeString": "literal_string \"Cannot stake 0\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 1033,
                            "name": "Identifier",
                            "src": "20556:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": ">",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1024,
                                  "type": "uint256",
                                  "value": "amount"
                                },
                                "id": 1034,
                                "name": "Identifier",
                                "src": "20564:6:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "hexvalue": "30",
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "subdenomination": null,
                                  "token": "number",
                                  "type": "int_const 0",
                                  "value": "0"
                                },
                                "id": 1035,
                                "name": "Literal",
                                "src": "20573:1:0"
                              }
                            ],
                            "id": 1036,
                            "name": "BinaryOperation",
                            "src": "20564:10:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "43616e6e6f74207374616b652030",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"Cannot stake 0\"",
                              "value": "Cannot stake 0"
                            },
                            "id": 1037,
                            "name": "Literal",
                            "src": "20576:16:0"
                          }
                        ],
                        "id": 1038,
                        "name": "FunctionCall",
                        "src": "20556:37:0"
                      }
                    ],
                    "id": 1039,
                    "name": "ExpressionStatement",
                    "src": "20556:37:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 800,
                              "type": "uint256",
                              "value": "_totalSupply"
                            },
                            "id": 1040,
                            "name": "Identifier",
                            "src": "20603:12:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "uint256",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "add",
                                  "referencedDeclaration": 202,
                                  "type": "function (uint256,uint256) pure returns (uint256)"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 800,
                                      "type": "uint256",
                                      "value": "_totalSupply"
                                    },
                                    "id": 1041,
                                    "name": "Identifier",
                                    "src": "20618:12:0"
                                  }
                                ],
                                "id": 1042,
                                "name": "MemberAccess",
                                "src": "20618:16:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1024,
                                  "type": "uint256",
                                  "value": "amount"
                                },
                                "id": 1043,
                                "name": "Identifier",
                                "src": "20635:6:0"
                              }
                            ],
                            "id": 1044,
                            "name": "FunctionCall",
                            "src": "20618:24:0"
                          }
                        ],
                        "id": 1045,
                        "name": "Assignment",
                        "src": "20603:39:0"
                      }
                    ],
                    "id": 1046,
                    "name": "ExpressionStatement",
                    "src": "20603:39:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": true,
                              "type": "uint256"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 804,
                                  "type": "mapping(address => uint256)",
                                  "value": "_balances"
                                },
                                "id": 1047,
                                "name": "Identifier",
                                "src": "20652:9:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "sender",
                                  "referencedDeclaration": null,
                                  "type": "address payable"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1560,
                                      "type": "msg",
                                      "value": "msg"
                                    },
                                    "id": 1048,
                                    "name": "Identifier",
                                    "src": "20662:3:0"
                                  }
                                ],
                                "id": 1049,
                                "name": "MemberAccess",
                                "src": "20662:10:0"
                              }
                            ],
                            "id": 1050,
                            "name": "IndexAccess",
                            "src": "20652:21:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "uint256",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "add",
                                  "referencedDeclaration": 202,
                                  "type": "function (uint256,uint256) pure returns (uint256)"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "type": "uint256"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 804,
                                          "type": "mapping(address => uint256)",
                                          "value": "_balances"
                                        },
                                        "id": 1051,
                                        "name": "Identifier",
                                        "src": "20676:9:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "member_name": "sender",
                                          "referencedDeclaration": null,
                                          "type": "address payable"
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "overloadedDeclarations": [
                                                null
                                              ],
                                              "referencedDeclaration": 1560,
                                              "type": "msg",
                                              "value": "msg"
                                            },
                                            "id": 1052,
                                            "name": "Identifier",
                                            "src": "20686:3:0"
                                          }
                                        ],
                                        "id": 1053,
                                        "name": "MemberAccess",
                                        "src": "20686:10:0"
                                      }
                                    ],
                                    "id": 1054,
                                    "name": "IndexAccess",
                                    "src": "20676:21:0"
                                  }
                                ],
                                "id": 1055,
                                "name": "MemberAccess",
                                "src": "20676:25:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1024,
                                  "type": "uint256",
                                  "value": "amount"
                                },
                                "id": 1056,
                                "name": "Identifier",
                                "src": "20702:6:0"
                              }
                            ],
                            "id": 1057,
                            "name": "FunctionCall",
                            "src": "20676:33:0"
                          }
                        ],
                        "id": 1058,
                        "name": "Assignment",
                        "src": "20652:57:0"
                      }
                    ],
                    "id": 1059,
                    "name": "ExpressionStatement",
                    "src": "20652:57:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                },
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "safeTransferFrom",
                              "referencedDeclaration": 500,
                              "type": "function (contract IERC20,address,address,uint256)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 778,
                                  "type": "contract IERC20",
                                  "value": "stakingToken"
                                },
                                "id": 1060,
                                "name": "Identifier",
                                "src": "20719:12:0"
                              }
                            ],
                            "id": 1062,
                            "name": "MemberAccess",
                            "src": "20719:29:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "sender",
                              "referencedDeclaration": null,
                              "type": "address payable"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1560,
                                  "type": "msg",
                                  "value": "msg"
                                },
                                "id": 1063,
                                "name": "Identifier",
                                "src": "20749:3:0"
                              }
                            ],
                            "id": 1064,
                            "name": "MemberAccess",
                            "src": "20749:10:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "address",
                              "type_conversion": true
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_StakingRewards_$1336",
                                      "typeString": "contract StakingRewards"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "type": "type(address)",
                                  "value": "address"
                                },
                                "id": 1065,
                                "name": "ElementaryTypeNameExpression",
                                "src": "20761:7:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1594,
                                  "type": "contract StakingRewards",
                                  "value": "this"
                                },
                                "id": 1066,
                                "name": "Identifier",
                                "src": "20769:4:0"
                              }
                            ],
                            "id": 1067,
                            "name": "FunctionCall",
                            "src": "20761:13:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1024,
                              "type": "uint256",
                              "value": "amount"
                            },
                            "id": 1068,
                            "name": "Identifier",
                            "src": "20776:6:0"
                          }
                        ],
                        "id": 1069,
                        "name": "FunctionCall",
                        "src": "20719:64:0"
                      }
                    ],
                    "id": 1070,
                    "name": "ExpressionStatement",
                    "src": "20719:64:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1323,
                              "type": "function (address,uint256)",
                              "value": "Staked"
                            },
                            "id": 1071,
                            "name": "Identifier",
                            "src": "20798:6:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "sender",
                              "referencedDeclaration": null,
                              "type": "address payable"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1560,
                                  "type": "msg",
                                  "value": "msg"
                                },
                                "id": 1072,
                                "name": "Identifier",
                                "src": "20805:3:0"
                              }
                            ],
                            "id": 1073,
                            "name": "MemberAccess",
                            "src": "20805:10:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1024,
                              "type": "uint256",
                              "value": "amount"
                            },
                            "id": 1074,
                            "name": "Identifier",
                            "src": "20817:6:0"
                          }
                        ],
                        "id": 1075,
                        "name": "FunctionCall",
                        "src": "20798:26:0"
                      }
                    ],
                    "id": 1076,
                    "name": "EmitStatement",
                    "src": "20793:31:0"
                  }
                ],
                "id": 1077,
                "name": "Block",
                "src": "20546:285:0"
              }
            ],
            "id": 1078,
            "name": "FunctionDefinition",
            "src": "20468:363:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "name": "withdraw",
              "scope": 1336,
              "stateMutability": "nonpayable",
              "superFunction": 735,
              "visibility": "public"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "amount",
                      "scope": 1131,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 1079,
                        "name": "ElementaryTypeName",
                        "src": "20855:7:0"
                      }
                    ],
                    "id": 1080,
                    "name": "VariableDeclaration",
                    "src": "20855:14:0"
                  }
                ],
                "id": 1081,
                "name": "ParameterList",
                "src": "20854:16:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 1088,
                "name": "ParameterList",
                "src": "20916:0:0"
              },
              {
                "attributes": {
                  "arguments": null
                },
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 690,
                      "type": "modifier ()",
                      "value": "nonReentrant"
                    },
                    "id": 1082,
                    "name": "Identifier",
                    "src": "20878:12:0"
                  }
                ],
                "id": 1083,
                "name": "ModifierInvocation",
                "src": "20878:12:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 1313,
                      "type": "modifier (address)",
                      "value": "updateReward"
                    },
                    "id": 1084,
                    "name": "Identifier",
                    "src": "20891:12:0"
                  },
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "member_name": "sender",
                      "referencedDeclaration": null,
                      "type": "address payable"
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "overloadedDeclarations": [
                            null
                          ],
                          "referencedDeclaration": 1560,
                          "type": "msg",
                          "value": "msg"
                        },
                        "id": 1085,
                        "name": "Identifier",
                        "src": "20904:3:0"
                      }
                    ],
                    "id": 1086,
                    "name": "MemberAccess",
                    "src": "20904:10:0"
                  }
                ],
                "id": 1087,
                "name": "ModifierInvocation",
                "src": "20891:24:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_8d85b8e7f4404d04d93e8d532ad219ceeba0becfbc18622bad46b31e08b1f0b0",
                                  "typeString": "literal_string \"Cannot withdraw 0\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 1089,
                            "name": "Identifier",
                            "src": "20926:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": ">",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1080,
                                  "type": "uint256",
                                  "value": "amount"
                                },
                                "id": 1090,
                                "name": "Identifier",
                                "src": "20934:6:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "hexvalue": "30",
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "subdenomination": null,
                                  "token": "number",
                                  "type": "int_const 0",
                                  "value": "0"
                                },
                                "id": 1091,
                                "name": "Literal",
                                "src": "20943:1:0"
                              }
                            ],
                            "id": 1092,
                            "name": "BinaryOperation",
                            "src": "20934:10:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "43616e6e6f742077697468647261772030",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"Cannot withdraw 0\"",
                              "value": "Cannot withdraw 0"
                            },
                            "id": 1093,
                            "name": "Literal",
                            "src": "20946:19:0"
                          }
                        ],
                        "id": 1094,
                        "name": "FunctionCall",
                        "src": "20926:40:0"
                      }
                    ],
                    "id": 1095,
                    "name": "ExpressionStatement",
                    "src": "20926:40:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 800,
                              "type": "uint256",
                              "value": "_totalSupply"
                            },
                            "id": 1096,
                            "name": "Identifier",
                            "src": "20976:12:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "uint256",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "sub",
                                  "referencedDeclaration": 227,
                                  "type": "function (uint256,uint256) pure returns (uint256)"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 800,
                                      "type": "uint256",
                                      "value": "_totalSupply"
                                    },
                                    "id": 1097,
                                    "name": "Identifier",
                                    "src": "20991:12:0"
                                  }
                                ],
                                "id": 1098,
                                "name": "MemberAccess",
                                "src": "20991:16:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1080,
                                  "type": "uint256",
                                  "value": "amount"
                                },
                                "id": 1099,
                                "name": "Identifier",
                                "src": "21008:6:0"
                              }
                            ],
                            "id": 1100,
                            "name": "FunctionCall",
                            "src": "20991:24:0"
                          }
                        ],
                        "id": 1101,
                        "name": "Assignment",
                        "src": "20976:39:0"
                      }
                    ],
                    "id": 1102,
                    "name": "ExpressionStatement",
                    "src": "20976:39:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": true,
                              "type": "uint256"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 804,
                                  "type": "mapping(address => uint256)",
                                  "value": "_balances"
                                },
                                "id": 1103,
                                "name": "Identifier",
                                "src": "21025:9:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "sender",
                                  "referencedDeclaration": null,
                                  "type": "address payable"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1560,
                                      "type": "msg",
                                      "value": "msg"
                                    },
                                    "id": 1104,
                                    "name": "Identifier",
                                    "src": "21035:3:0"
                                  }
                                ],
                                "id": 1105,
                                "name": "MemberAccess",
                                "src": "21035:10:0"
                              }
                            ],
                            "id": 1106,
                            "name": "IndexAccess",
                            "src": "21025:21:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "uint256",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "sub",
                                  "referencedDeclaration": 227,
                                  "type": "function (uint256,uint256) pure returns (uint256)"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "type": "uint256"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 804,
                                          "type": "mapping(address => uint256)",
                                          "value": "_balances"
                                        },
                                        "id": 1107,
                                        "name": "Identifier",
                                        "src": "21049:9:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "member_name": "sender",
                                          "referencedDeclaration": null,
                                          "type": "address payable"
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "overloadedDeclarations": [
                                                null
                                              ],
                                              "referencedDeclaration": 1560,
                                              "type": "msg",
                                              "value": "msg"
                                            },
                                            "id": 1108,
                                            "name": "Identifier",
                                            "src": "21059:3:0"
                                          }
                                        ],
                                        "id": 1109,
                                        "name": "MemberAccess",
                                        "src": "21059:10:0"
                                      }
                                    ],
                                    "id": 1110,
                                    "name": "IndexAccess",
                                    "src": "21049:21:0"
                                  }
                                ],
                                "id": 1111,
                                "name": "MemberAccess",
                                "src": "21049:25:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1080,
                                  "type": "uint256",
                                  "value": "amount"
                                },
                                "id": 1112,
                                "name": "Identifier",
                                "src": "21075:6:0"
                              }
                            ],
                            "id": 1113,
                            "name": "FunctionCall",
                            "src": "21049:33:0"
                          }
                        ],
                        "id": 1114,
                        "name": "Assignment",
                        "src": "21025:57:0"
                      }
                    ],
                    "id": 1115,
                    "name": "ExpressionStatement",
                    "src": "21025:57:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "safeTransfer",
                              "referencedDeclaration": 475,
                              "type": "function (contract IERC20,address,uint256)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 778,
                                  "type": "contract IERC20",
                                  "value": "stakingToken"
                                },
                                "id": 1116,
                                "name": "Identifier",
                                "src": "21092:12:0"
                              }
                            ],
                            "id": 1118,
                            "name": "MemberAccess",
                            "src": "21092:25:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "sender",
                              "referencedDeclaration": null,
                              "type": "address payable"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1560,
                                  "type": "msg",
                                  "value": "msg"
                                },
                                "id": 1119,
                                "name": "Identifier",
                                "src": "21118:3:0"
                              }
                            ],
                            "id": 1120,
                            "name": "MemberAccess",
                            "src": "21118:10:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1080,
                              "type": "uint256",
                              "value": "amount"
                            },
                            "id": 1121,
                            "name": "Identifier",
                            "src": "21130:6:0"
                          }
                        ],
                        "id": 1122,
                        "name": "FunctionCall",
                        "src": "21092:45:0"
                      }
                    ],
                    "id": 1123,
                    "name": "ExpressionStatement",
                    "src": "21092:45:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1329,
                              "type": "function (address,uint256)",
                              "value": "Withdrawn"
                            },
                            "id": 1124,
                            "name": "Identifier",
                            "src": "21152:9:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "sender",
                              "referencedDeclaration": null,
                              "type": "address payable"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1560,
                                  "type": "msg",
                                  "value": "msg"
                                },
                                "id": 1125,
                                "name": "Identifier",
                                "src": "21162:3:0"
                              }
                            ],
                            "id": 1126,
                            "name": "MemberAccess",
                            "src": "21162:10:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1080,
                              "type": "uint256",
                              "value": "amount"
                            },
                            "id": 1127,
                            "name": "Identifier",
                            "src": "21174:6:0"
                          }
                        ],
                        "id": 1128,
                        "name": "FunctionCall",
                        "src": "21152:29:0"
                      }
                    ],
                    "id": 1129,
                    "name": "EmitStatement",
                    "src": "21147:34:0"
                  }
                ],
                "id": 1130,
                "name": "Block",
                "src": "20916:272:0"
              }
            ],
            "id": 1131,
            "name": "FunctionDefinition",
            "src": "20837:351:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "name": "getReward",
              "scope": 1336,
              "stateMutability": "nonpayable",
              "superFunction": 738,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 1132,
                "name": "ParameterList",
                "src": "21212:2:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 1139,
                "name": "ParameterList",
                "src": "21260:0:0"
              },
              {
                "attributes": {
                  "arguments": null
                },
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 690,
                      "type": "modifier ()",
                      "value": "nonReentrant"
                    },
                    "id": 1133,
                    "name": "Identifier",
                    "src": "21222:12:0"
                  }
                ],
                "id": 1134,
                "name": "ModifierInvocation",
                "src": "21222:12:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 1313,
                      "type": "modifier (address)",
                      "value": "updateReward"
                    },
                    "id": 1135,
                    "name": "Identifier",
                    "src": "21235:12:0"
                  },
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "member_name": "sender",
                      "referencedDeclaration": null,
                      "type": "address payable"
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "overloadedDeclarations": [
                            null
                          ],
                          "referencedDeclaration": 1560,
                          "type": "msg",
                          "value": "msg"
                        },
                        "id": 1136,
                        "name": "Identifier",
                        "src": "21248:3:0"
                      }
                    ],
                    "id": 1137,
                    "name": "MemberAccess",
                    "src": "21248:10:0"
                  }
                ],
                "id": 1138,
                "name": "ModifierInvocation",
                "src": "21235:24:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "assignments": [
                        1141
                      ]
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "name": "reward",
                          "scope": 1173,
                          "stateVariable": false,
                          "storageLocation": "default",
                          "type": "uint256",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "name": "uint256",
                              "type": "uint256"
                            },
                            "id": 1140,
                            "name": "ElementaryTypeName",
                            "src": "21270:7:0"
                          }
                        ],
                        "id": 1141,
                        "name": "VariableDeclaration",
                        "src": "21270:14:0"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 798,
                              "type": "mapping(address => uint256)",
                              "value": "rewards"
                            },
                            "id": 1142,
                            "name": "Identifier",
                            "src": "21287:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "sender",
                              "referencedDeclaration": null,
                              "type": "address payable"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1560,
                                  "type": "msg",
                                  "value": "msg"
                                },
                                "id": 1143,
                                "name": "Identifier",
                                "src": "21295:3:0"
                              }
                            ],
                            "id": 1144,
                            "name": "MemberAccess",
                            "src": "21295:10:0"
                          }
                        ],
                        "id": 1145,
                        "name": "IndexAccess",
                        "src": "21287:19:0"
                      }
                    ],
                    "id": 1146,
                    "name": "VariableDeclarationStatement",
                    "src": "21270:36:0"
                  },
                  {
                    "attributes": {
                      "falseBody": null
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": ">",
                          "type": "bool"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1141,
                              "type": "uint256",
                              "value": "reward"
                            },
                            "id": 1147,
                            "name": "Identifier",
                            "src": "21320:6:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "30",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "number",
                              "type": "int_const 0",
                              "value": "0"
                            },
                            "id": 1148,
                            "name": "Literal",
                            "src": "21329:1:0"
                          }
                        ],
                        "id": 1149,
                        "name": "BinaryOperation",
                        "src": "21320:10:0"
                      },
                      {
                        "children": [
                          {
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "operator": "=",
                                  "type": "uint256"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": true,
                                      "type": "uint256"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 798,
                                          "type": "mapping(address => uint256)",
                                          "value": "rewards"
                                        },
                                        "id": 1150,
                                        "name": "Identifier",
                                        "src": "21346:7:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "member_name": "sender",
                                          "referencedDeclaration": null,
                                          "type": "address payable"
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "overloadedDeclarations": [
                                                null
                                              ],
                                              "referencedDeclaration": 1560,
                                              "type": "msg",
                                              "value": "msg"
                                            },
                                            "id": 1151,
                                            "name": "Identifier",
                                            "src": "21354:3:0"
                                          }
                                        ],
                                        "id": 1152,
                                        "name": "MemberAccess",
                                        "src": "21354:10:0"
                                      }
                                    ],
                                    "id": 1153,
                                    "name": "IndexAccess",
                                    "src": "21346:19:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "hexvalue": "30",
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "subdenomination": null,
                                      "token": "number",
                                      "type": "int_const 0",
                                      "value": "0"
                                    },
                                    "id": 1154,
                                    "name": "Literal",
                                    "src": "21368:1:0"
                                  }
                                ],
                                "id": 1155,
                                "name": "Assignment",
                                "src": "21346:23:0"
                              }
                            ],
                            "id": 1156,
                            "name": "ExpressionStatement",
                            "src": "21346:23:0"
                          },
                          {
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "tuple()",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address_payable",
                                          "typeString": "address payable"
                                        },
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "safeTransfer",
                                      "referencedDeclaration": 475,
                                      "type": "function (contract IERC20,address,uint256)"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 776,
                                          "type": "contract IERC20",
                                          "value": "rewardsToken"
                                        },
                                        "id": 1157,
                                        "name": "Identifier",
                                        "src": "21383:12:0"
                                      }
                                    ],
                                    "id": 1159,
                                    "name": "MemberAccess",
                                    "src": "21383:25:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "sender",
                                      "referencedDeclaration": null,
                                      "type": "address payable"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1560,
                                          "type": "msg",
                                          "value": "msg"
                                        },
                                        "id": 1160,
                                        "name": "Identifier",
                                        "src": "21409:3:0"
                                      }
                                    ],
                                    "id": 1161,
                                    "name": "MemberAccess",
                                    "src": "21409:10:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1141,
                                      "type": "uint256",
                                      "value": "reward"
                                    },
                                    "id": 1162,
                                    "name": "Identifier",
                                    "src": "21421:6:0"
                                  }
                                ],
                                "id": 1163,
                                "name": "FunctionCall",
                                "src": "21383:45:0"
                              }
                            ],
                            "id": 1164,
                            "name": "ExpressionStatement",
                            "src": "21383:45:0"
                          },
                          {
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "tuple()",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address_payable",
                                          "typeString": "address payable"
                                        },
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1335,
                                      "type": "function (address,uint256)",
                                      "value": "RewardPaid"
                                    },
                                    "id": 1165,
                                    "name": "Identifier",
                                    "src": "21447:10:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "sender",
                                      "referencedDeclaration": null,
                                      "type": "address payable"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1560,
                                          "type": "msg",
                                          "value": "msg"
                                        },
                                        "id": 1166,
                                        "name": "Identifier",
                                        "src": "21458:3:0"
                                      }
                                    ],
                                    "id": 1167,
                                    "name": "MemberAccess",
                                    "src": "21458:10:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1141,
                                      "type": "uint256",
                                      "value": "reward"
                                    },
                                    "id": 1168,
                                    "name": "Identifier",
                                    "src": "21470:6:0"
                                  }
                                ],
                                "id": 1169,
                                "name": "FunctionCall",
                                "src": "21447:30:0"
                              }
                            ],
                            "id": 1170,
                            "name": "EmitStatement",
                            "src": "21442:35:0"
                          }
                        ],
                        "id": 1171,
                        "name": "Block",
                        "src": "21332:156:0"
                      }
                    ],
                    "id": 1172,
                    "name": "IfStatement",
                    "src": "21316:172:0"
                  }
                ],
                "id": 1173,
                "name": "Block",
                "src": "21260:234:0"
              }
            ],
            "id": 1174,
            "name": "FunctionDefinition",
            "src": "21194:300:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "exit",
              "scope": 1336,
              "stateMutability": "nonpayable",
              "superFunction": 741,
              "visibility": "external"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 1175,
                "name": "ParameterList",
                "src": "21513:2:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 1176,
                "name": "ParameterList",
                "src": "21525:0:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1131,
                              "type": "function (uint256)",
                              "value": "withdraw"
                            },
                            "id": 1177,
                            "name": "Identifier",
                            "src": "21535:8:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "type": "uint256"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 804,
                                  "type": "mapping(address => uint256)",
                                  "value": "_balances"
                                },
                                "id": 1178,
                                "name": "Identifier",
                                "src": "21544:9:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "sender",
                                  "referencedDeclaration": null,
                                  "type": "address payable"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1560,
                                      "type": "msg",
                                      "value": "msg"
                                    },
                                    "id": 1179,
                                    "name": "Identifier",
                                    "src": "21554:3:0"
                                  }
                                ],
                                "id": 1180,
                                "name": "MemberAccess",
                                "src": "21554:10:0"
                              }
                            ],
                            "id": 1181,
                            "name": "IndexAccess",
                            "src": "21544:21:0"
                          }
                        ],
                        "id": 1182,
                        "name": "FunctionCall",
                        "src": "21535:31:0"
                      }
                    ],
                    "id": 1183,
                    "name": "ExpressionStatement",
                    "src": "21535:31:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "arguments": [
                            null
                          ],
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                null
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1174,
                              "type": "function ()",
                              "value": "getReward"
                            },
                            "id": 1184,
                            "name": "Identifier",
                            "src": "21576:9:0"
                          }
                        ],
                        "id": 1185,
                        "name": "FunctionCall",
                        "src": "21576:11:0"
                      }
                    ],
                    "id": 1186,
                    "name": "ExpressionStatement",
                    "src": "21576:11:0"
                  }
                ],
                "id": 1187,
                "name": "Block",
                "src": "21525:69:0"
              }
            ],
            "id": 1188,
            "name": "FunctionDefinition",
            "src": "21500:94:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "name": "notifyRewardAmount",
              "scope": 1336,
              "stateMutability": "nonpayable",
              "superFunction": 749,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "reward",
                      "scope": 1276,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 1189,
                        "name": "ElementaryTypeName",
                        "src": "21682:7:0"
                      }
                    ],
                    "id": 1190,
                    "name": "VariableDeclaration",
                    "src": "21682:14:0"
                  }
                ],
                "id": 1191,
                "name": "ParameterList",
                "src": "21681:16:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 1199,
                "name": "ParameterList",
                "src": "21756:0:0"
              },
              {
                "attributes": {
                  "arguments": null
                },
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 761,
                      "type": "modifier ()",
                      "value": "onlyRewardsDistribution"
                    },
                    "id": 1192,
                    "name": "Identifier",
                    "src": "21707:23:0"
                  }
                ],
                "id": 1193,
                "name": "ModifierInvocation",
                "src": "21707:23:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 1313,
                      "type": "modifier (address)",
                      "value": "updateReward"
                    },
                    "id": 1194,
                    "name": "Identifier",
                    "src": "21731:12:0"
                  },
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "isStructConstructorCall": false,
                      "lValueRequested": false,
                      "names": [
                        null
                      ],
                      "type": "address payable",
                      "type_conversion": true
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            }
                          ],
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "type": "type(address)",
                          "value": "address"
                        },
                        "id": 1195,
                        "name": "ElementaryTypeNameExpression",
                        "src": "21744:7:0"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "hexvalue": "30",
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "subdenomination": null,
                          "token": "number",
                          "type": "int_const 0",
                          "value": "0"
                        },
                        "id": 1196,
                        "name": "Literal",
                        "src": "21752:1:0"
                      }
                    ],
                    "id": 1197,
                    "name": "FunctionCall",
                    "src": "21744:10:0"
                  }
                ],
                "id": 1198,
                "name": "ModifierInvocation",
                "src": "21731:24:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": ">=",
                          "type": "bool"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "timestamp",
                              "referencedDeclaration": null,
                              "type": "uint256"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1550,
                                  "type": "block",
                                  "value": "block"
                                },
                                "id": 1200,
                                "name": "Identifier",
                                "src": "21770:5:0"
                              }
                            ],
                            "id": 1201,
                            "name": "MemberAccess",
                            "src": "21770:15:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 781,
                              "type": "uint256",
                              "value": "periodFinish"
                            },
                            "id": 1202,
                            "name": "Identifier",
                            "src": "21789:12:0"
                          }
                        ],
                        "id": 1203,
                        "name": "BinaryOperation",
                        "src": "21770:31:0"
                      },
                      {
                        "children": [
                          {
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "operator": "=",
                                  "type": "uint256"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 784,
                                      "type": "uint256",
                                      "value": "rewardRate"
                                    },
                                    "id": 1204,
                                    "name": "Identifier",
                                    "src": "21817:10:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "isStructConstructorCall": false,
                                      "lValueRequested": false,
                                      "names": [
                                        null
                                      ],
                                      "type": "uint256",
                                      "type_conversion": false
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "member_name": "div",
                                          "referencedDeclaration": 286,
                                          "type": "function (uint256,uint256) pure returns (uint256)"
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "overloadedDeclarations": [
                                                null
                                              ],
                                              "referencedDeclaration": 1190,
                                              "type": "uint256",
                                              "value": "reward"
                                            },
                                            "id": 1205,
                                            "name": "Identifier",
                                            "src": "21830:6:0"
                                          }
                                        ],
                                        "id": 1206,
                                        "name": "MemberAccess",
                                        "src": "21830:10:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 786,
                                          "type": "uint256",
                                          "value": "rewardsDuration"
                                        },
                                        "id": 1207,
                                        "name": "Identifier",
                                        "src": "21841:15:0"
                                      }
                                    ],
                                    "id": 1208,
                                    "name": "FunctionCall",
                                    "src": "21830:27:0"
                                  }
                                ],
                                "id": 1209,
                                "name": "Assignment",
                                "src": "21817:40:0"
                              }
                            ],
                            "id": 1210,
                            "name": "ExpressionStatement",
                            "src": "21817:40:0"
                          }
                        ],
                        "id": 1211,
                        "name": "Block",
                        "src": "21803:65:0"
                      },
                      {
                        "children": [
                          {
                            "attributes": {
                              "assignments": [
                                1213
                              ]
                            },
                            "children": [
                              {
                                "attributes": {
                                  "constant": false,
                                  "name": "remaining",
                                  "scope": 1237,
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "type": "uint256",
                                  "value": null,
                                  "visibility": "internal"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "name": "uint256",
                                      "type": "uint256"
                                    },
                                    "id": 1212,
                                    "name": "ElementaryTypeName",
                                    "src": "21888:7:0"
                                  }
                                ],
                                "id": 1213,
                                "name": "VariableDeclaration",
                                "src": "21888:17:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "uint256",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "sub",
                                      "referencedDeclaration": 227,
                                      "type": "function (uint256,uint256) pure returns (uint256)"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 781,
                                          "type": "uint256",
                                          "value": "periodFinish"
                                        },
                                        "id": 1214,
                                        "name": "Identifier",
                                        "src": "21908:12:0"
                                      }
                                    ],
                                    "id": 1215,
                                    "name": "MemberAccess",
                                    "src": "21908:16:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "timestamp",
                                      "referencedDeclaration": null,
                                      "type": "uint256"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1550,
                                          "type": "block",
                                          "value": "block"
                                        },
                                        "id": 1216,
                                        "name": "Identifier",
                                        "src": "21925:5:0"
                                      }
                                    ],
                                    "id": 1217,
                                    "name": "MemberAccess",
                                    "src": "21925:15:0"
                                  }
                                ],
                                "id": 1218,
                                "name": "FunctionCall",
                                "src": "21908:33:0"
                              }
                            ],
                            "id": 1219,
                            "name": "VariableDeclarationStatement",
                            "src": "21888:53:0"
                          },
                          {
                            "attributes": {
                              "assignments": [
                                1221
                              ]
                            },
                            "children": [
                              {
                                "attributes": {
                                  "constant": false,
                                  "name": "leftover",
                                  "scope": 1237,
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "type": "uint256",
                                  "value": null,
                                  "visibility": "internal"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "name": "uint256",
                                      "type": "uint256"
                                    },
                                    "id": 1220,
                                    "name": "ElementaryTypeName",
                                    "src": "21955:7:0"
                                  }
                                ],
                                "id": 1221,
                                "name": "VariableDeclaration",
                                "src": "21955:16:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "uint256",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "mul",
                                      "referencedDeclaration": 261,
                                      "type": "function (uint256,uint256) pure returns (uint256)"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1213,
                                          "type": "uint256",
                                          "value": "remaining"
                                        },
                                        "id": 1222,
                                        "name": "Identifier",
                                        "src": "21974:9:0"
                                      }
                                    ],
                                    "id": 1223,
                                    "name": "MemberAccess",
                                    "src": "21974:13:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 784,
                                      "type": "uint256",
                                      "value": "rewardRate"
                                    },
                                    "id": 1224,
                                    "name": "Identifier",
                                    "src": "21988:10:0"
                                  }
                                ],
                                "id": 1225,
                                "name": "FunctionCall",
                                "src": "21974:25:0"
                              }
                            ],
                            "id": 1226,
                            "name": "VariableDeclarationStatement",
                            "src": "21955:44:0"
                          },
                          {
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "operator": "=",
                                  "type": "uint256"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 784,
                                      "type": "uint256",
                                      "value": "rewardRate"
                                    },
                                    "id": 1227,
                                    "name": "Identifier",
                                    "src": "22013:10:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "isStructConstructorCall": false,
                                      "lValueRequested": false,
                                      "names": [
                                        null
                                      ],
                                      "type": "uint256",
                                      "type_conversion": false
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "member_name": "div",
                                          "referencedDeclaration": 286,
                                          "type": "function (uint256,uint256) pure returns (uint256)"
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "isStructConstructorCall": false,
                                              "lValueRequested": false,
                                              "names": [
                                                null
                                              ],
                                              "type": "uint256",
                                              "type_conversion": false
                                            },
                                            "children": [
                                              {
                                                "attributes": {
                                                  "argumentTypes": [
                                                    {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    }
                                                  ],
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "member_name": "add",
                                                  "referencedDeclaration": 202,
                                                  "type": "function (uint256,uint256) pure returns (uint256)"
                                                },
                                                "children": [
                                                  {
                                                    "attributes": {
                                                      "argumentTypes": null,
                                                      "overloadedDeclarations": [
                                                        null
                                                      ],
                                                      "referencedDeclaration": 1190,
                                                      "type": "uint256",
                                                      "value": "reward"
                                                    },
                                                    "id": 1228,
                                                    "name": "Identifier",
                                                    "src": "22026:6:0"
                                                  }
                                                ],
                                                "id": 1229,
                                                "name": "MemberAccess",
                                                "src": "22026:10:0"
                                              },
                                              {
                                                "attributes": {
                                                  "argumentTypes": null,
                                                  "overloadedDeclarations": [
                                                    null
                                                  ],
                                                  "referencedDeclaration": 1221,
                                                  "type": "uint256",
                                                  "value": "leftover"
                                                },
                                                "id": 1230,
                                                "name": "Identifier",
                                                "src": "22037:8:0"
                                              }
                                            ],
                                            "id": 1231,
                                            "name": "FunctionCall",
                                            "src": "22026:20:0"
                                          }
                                        ],
                                        "id": 1232,
                                        "name": "MemberAccess",
                                        "src": "22026:24:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 786,
                                          "type": "uint256",
                                          "value": "rewardsDuration"
                                        },
                                        "id": 1233,
                                        "name": "Identifier",
                                        "src": "22051:15:0"
                                      }
                                    ],
                                    "id": 1234,
                                    "name": "FunctionCall",
                                    "src": "22026:41:0"
                                  }
                                ],
                                "id": 1235,
                                "name": "Assignment",
                                "src": "22013:54:0"
                              }
                            ],
                            "id": 1236,
                            "name": "ExpressionStatement",
                            "src": "22013:54:0"
                          }
                        ],
                        "id": 1237,
                        "name": "Block",
                        "src": "21874:204:0"
                      }
                    ],
                    "id": 1238,
                    "name": "IfStatement",
                    "src": "21766:312:0"
                  },
                  {
                    "attributes": {
                      "assignments": [
                        1240
                      ]
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "name": "balance",
                          "scope": 1275,
                          "stateVariable": false,
                          "storageLocation": "default",
                          "type": "uint256",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "name": "uint",
                              "type": "uint256"
                            },
                            "id": 1239,
                            "name": "ElementaryTypeName",
                            "src": "22432:4:0"
                          }
                        ],
                        "id": 1240,
                        "name": "VariableDeclaration",
                        "src": "22432:12:0"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "uint256",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "balanceOf",
                              "referencedDeclaration": 13,
                              "type": "function (address) view external returns (uint256)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 776,
                                  "type": "contract IERC20",
                                  "value": "rewardsToken"
                                },
                                "id": 1241,
                                "name": "Identifier",
                                "src": "22447:12:0"
                              }
                            ],
                            "id": 1242,
                            "name": "MemberAccess",
                            "src": "22447:22:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "address",
                              "type_conversion": true
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_StakingRewards_$1336",
                                      "typeString": "contract StakingRewards"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "type": "type(address)",
                                  "value": "address"
                                },
                                "id": 1243,
                                "name": "ElementaryTypeNameExpression",
                                "src": "22470:7:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1594,
                                  "type": "contract StakingRewards",
                                  "value": "this"
                                },
                                "id": 1244,
                                "name": "Identifier",
                                "src": "22478:4:0"
                              }
                            ],
                            "id": 1245,
                            "name": "FunctionCall",
                            "src": "22470:13:0"
                          }
                        ],
                        "id": 1246,
                        "name": "FunctionCall",
                        "src": "22447:37:0"
                      }
                    ],
                    "id": 1247,
                    "name": "VariableDeclarationStatement",
                    "src": "22432:52:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_af294828ccb7807394ab9c640e14eb2534ed0e75bb2e1346f1bb81dd84cda810",
                                  "typeString": "literal_string \"Provided reward too high\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 1248,
                            "name": "Identifier",
                            "src": "22494:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": "<=",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 784,
                                  "type": "uint256",
                                  "value": "rewardRate"
                                },
                                "id": 1249,
                                "name": "Identifier",
                                "src": "22502:10:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "uint256",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "div",
                                      "referencedDeclaration": 286,
                                      "type": "function (uint256,uint256) pure returns (uint256)"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1240,
                                          "type": "uint256",
                                          "value": "balance"
                                        },
                                        "id": 1250,
                                        "name": "Identifier",
                                        "src": "22516:7:0"
                                      }
                                    ],
                                    "id": 1251,
                                    "name": "MemberAccess",
                                    "src": "22516:11:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 786,
                                      "type": "uint256",
                                      "value": "rewardsDuration"
                                    },
                                    "id": 1252,
                                    "name": "Identifier",
                                    "src": "22528:15:0"
                                  }
                                ],
                                "id": 1253,
                                "name": "FunctionCall",
                                "src": "22516:28:0"
                              }
                            ],
                            "id": 1254,
                            "name": "BinaryOperation",
                            "src": "22502:42:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "50726f76696465642072657761726420746f6f2068696768",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"Provided reward too high\"",
                              "value": "Provided reward too high"
                            },
                            "id": 1255,
                            "name": "Literal",
                            "src": "22546:26:0"
                          }
                        ],
                        "id": 1256,
                        "name": "FunctionCall",
                        "src": "22494:79:0"
                      }
                    ],
                    "id": 1257,
                    "name": "ExpressionStatement",
                    "src": "22494:79:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 788,
                              "type": "uint256",
                              "value": "lastUpdateTime"
                            },
                            "id": 1258,
                            "name": "Identifier",
                            "src": "22584:14:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "timestamp",
                              "referencedDeclaration": null,
                              "type": "uint256"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1550,
                                  "type": "block",
                                  "value": "block"
                                },
                                "id": 1259,
                                "name": "Identifier",
                                "src": "22601:5:0"
                              }
                            ],
                            "id": 1260,
                            "name": "MemberAccess",
                            "src": "22601:15:0"
                          }
                        ],
                        "id": 1261,
                        "name": "Assignment",
                        "src": "22584:32:0"
                      }
                    ],
                    "id": 1262,
                    "name": "ExpressionStatement",
                    "src": "22584:32:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 781,
                              "type": "uint256",
                              "value": "periodFinish"
                            },
                            "id": 1263,
                            "name": "Identifier",
                            "src": "22626:12:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "uint256",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "add",
                                  "referencedDeclaration": 202,
                                  "type": "function (uint256,uint256) pure returns (uint256)"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "timestamp",
                                      "referencedDeclaration": null,
                                      "type": "uint256"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1550,
                                          "type": "block",
                                          "value": "block"
                                        },
                                        "id": 1264,
                                        "name": "Identifier",
                                        "src": "22641:5:0"
                                      }
                                    ],
                                    "id": 1265,
                                    "name": "MemberAccess",
                                    "src": "22641:15:0"
                                  }
                                ],
                                "id": 1266,
                                "name": "MemberAccess",
                                "src": "22641:19:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 786,
                                  "type": "uint256",
                                  "value": "rewardsDuration"
                                },
                                "id": 1267,
                                "name": "Identifier",
                                "src": "22661:15:0"
                              }
                            ],
                            "id": 1268,
                            "name": "FunctionCall",
                            "src": "22641:36:0"
                          }
                        ],
                        "id": 1269,
                        "name": "Assignment",
                        "src": "22626:51:0"
                      }
                    ],
                    "id": 1270,
                    "name": "ExpressionStatement",
                    "src": "22626:51:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1317,
                              "type": "function (uint256)",
                              "value": "RewardAdded"
                            },
                            "id": 1271,
                            "name": "Identifier",
                            "src": "22692:11:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1190,
                              "type": "uint256",
                              "value": "reward"
                            },
                            "id": 1272,
                            "name": "Identifier",
                            "src": "22704:6:0"
                          }
                        ],
                        "id": 1273,
                        "name": "FunctionCall",
                        "src": "22692:19:0"
                      }
                    ],
                    "id": 1274,
                    "name": "EmitStatement",
                    "src": "22687:24:0"
                  }
                ],
                "id": 1275,
                "name": "Block",
                "src": "21756:962:0"
              }
            ],
            "id": 1276,
            "name": "FunctionDefinition",
            "src": "21654:1064:0"
          },
          {
            "attributes": {
              "documentation": null,
              "name": "updateReward",
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "account",
                      "scope": 1313,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 1277,
                        "name": "ElementaryTypeName",
                        "src": "22789:7:0"
                      }
                    ],
                    "id": 1278,
                    "name": "VariableDeclaration",
                    "src": "22789:15:0"
                  }
                ],
                "id": 1279,
                "name": "ParameterList",
                "src": "22788:17:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 790,
                              "type": "uint256",
                              "value": "rewardPerTokenStored"
                            },
                            "id": 1280,
                            "name": "Identifier",
                            "src": "22816:20:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "arguments": [
                                null
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "uint256",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    null
                                  ],
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 900,
                                  "type": "function () view returns (uint256)",
                                  "value": "rewardPerToken"
                                },
                                "id": 1281,
                                "name": "Identifier",
                                "src": "22839:14:0"
                              }
                            ],
                            "id": 1282,
                            "name": "FunctionCall",
                            "src": "22839:16:0"
                          }
                        ],
                        "id": 1283,
                        "name": "Assignment",
                        "src": "22816:39:0"
                      }
                    ],
                    "id": 1284,
                    "name": "ExpressionStatement",
                    "src": "22816:39:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 788,
                              "type": "uint256",
                              "value": "lastUpdateTime"
                            },
                            "id": 1285,
                            "name": "Identifier",
                            "src": "22865:14:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "arguments": [
                                null
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "uint256",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    null
                                  ],
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 869,
                                  "type": "function () view returns (uint256)",
                                  "value": "lastTimeRewardApplicable"
                                },
                                "id": 1286,
                                "name": "Identifier",
                                "src": "22882:24:0"
                              }
                            ],
                            "id": 1287,
                            "name": "FunctionCall",
                            "src": "22882:26:0"
                          }
                        ],
                        "id": 1288,
                        "name": "Assignment",
                        "src": "22865:43:0"
                      }
                    ],
                    "id": 1289,
                    "name": "ExpressionStatement",
                    "src": "22865:43:0"
                  },
                  {
                    "attributes": {
                      "falseBody": null
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "!=",
                          "type": "bool"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1278,
                              "type": "address",
                              "value": "account"
                            },
                            "id": 1290,
                            "name": "Identifier",
                            "src": "22922:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "address payable",
                              "type_conversion": true
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "type": "type(address)",
                                  "value": "address"
                                },
                                "id": 1291,
                                "name": "ElementaryTypeNameExpression",
                                "src": "22933:7:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "hexvalue": "30",
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "subdenomination": null,
                                  "token": "number",
                                  "type": "int_const 0",
                                  "value": "0"
                                },
                                "id": 1292,
                                "name": "Literal",
                                "src": "22941:1:0"
                              }
                            ],
                            "id": 1293,
                            "name": "FunctionCall",
                            "src": "22933:10:0"
                          }
                        ],
                        "id": 1294,
                        "name": "BinaryOperation",
                        "src": "22922:21:0"
                      },
                      {
                        "children": [
                          {
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "operator": "=",
                                  "type": "uint256"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": true,
                                      "type": "uint256"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 798,
                                          "type": "mapping(address => uint256)",
                                          "value": "rewards"
                                        },
                                        "id": 1295,
                                        "name": "Identifier",
                                        "src": "22959:7:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1278,
                                          "type": "address",
                                          "value": "account"
                                        },
                                        "id": 1296,
                                        "name": "Identifier",
                                        "src": "22967:7:0"
                                      }
                                    ],
                                    "id": 1297,
                                    "name": "IndexAccess",
                                    "src": "22959:16:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "isStructConstructorCall": false,
                                      "lValueRequested": false,
                                      "names": [
                                        null
                                      ],
                                      "type": "uint256",
                                      "type_conversion": false
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          ],
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 929,
                                          "type": "function (address) view returns (uint256)",
                                          "value": "earned"
                                        },
                                        "id": 1298,
                                        "name": "Identifier",
                                        "src": "22978:6:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1278,
                                          "type": "address",
                                          "value": "account"
                                        },
                                        "id": 1299,
                                        "name": "Identifier",
                                        "src": "22985:7:0"
                                      }
                                    ],
                                    "id": 1300,
                                    "name": "FunctionCall",
                                    "src": "22978:15:0"
                                  }
                                ],
                                "id": 1301,
                                "name": "Assignment",
                                "src": "22959:34:0"
                              }
                            ],
                            "id": 1302,
                            "name": "ExpressionStatement",
                            "src": "22959:34:0"
                          },
                          {
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "operator": "=",
                                  "type": "uint256"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": true,
                                      "type": "uint256"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 794,
                                          "type": "mapping(address => uint256)",
                                          "value": "userRewardPerTokenPaid"
                                        },
                                        "id": 1303,
                                        "name": "Identifier",
                                        "src": "23007:22:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1278,
                                          "type": "address",
                                          "value": "account"
                                        },
                                        "id": 1304,
                                        "name": "Identifier",
                                        "src": "23030:7:0"
                                      }
                                    ],
                                    "id": 1305,
                                    "name": "IndexAccess",
                                    "src": "23007:31:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 790,
                                      "type": "uint256",
                                      "value": "rewardPerTokenStored"
                                    },
                                    "id": 1306,
                                    "name": "Identifier",
                                    "src": "23041:20:0"
                                  }
                                ],
                                "id": 1307,
                                "name": "Assignment",
                                "src": "23007:54:0"
                              }
                            ],
                            "id": 1308,
                            "name": "ExpressionStatement",
                            "src": "23007:54:0"
                          }
                        ],
                        "id": 1309,
                        "name": "Block",
                        "src": "22945:127:0"
                      }
                    ],
                    "id": 1310,
                    "name": "IfStatement",
                    "src": "22918:154:0"
                  },
                  {
                    "id": 1311,
                    "name": "PlaceholderStatement",
                    "src": "23081:1:0"
                  }
                ],
                "id": 1312,
                "name": "Block",
                "src": "22806:283:0"
              }
            ],
            "id": 1313,
            "name": "ModifierDefinition",
            "src": "22767:322:0"
          },
          {
            "attributes": {
              "anonymous": false,
              "documentation": null,
              "name": "RewardAdded"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": false,
                      "name": "reward",
                      "scope": 1317,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 1314,
                        "name": "ElementaryTypeName",
                        "src": "23153:7:0"
                      }
                    ],
                    "id": 1315,
                    "name": "VariableDeclaration",
                    "src": "23153:14:0"
                  }
                ],
                "id": 1316,
                "name": "ParameterList",
                "src": "23152:16:0"
              }
            ],
            "id": 1317,
            "name": "EventDefinition",
            "src": "23135:34:0"
          },
          {
            "attributes": {
              "anonymous": false,
              "documentation": null,
              "name": "Staked"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": true,
                      "name": "user",
                      "scope": 1323,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 1318,
                        "name": "ElementaryTypeName",
                        "src": "23187:7:0"
                      }
                    ],
                    "id": 1319,
                    "name": "VariableDeclaration",
                    "src": "23187:20:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": false,
                      "name": "amount",
                      "scope": 1323,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 1320,
                        "name": "ElementaryTypeName",
                        "src": "23209:7:0"
                      }
                    ],
                    "id": 1321,
                    "name": "VariableDeclaration",
                    "src": "23209:14:0"
                  }
                ],
                "id": 1322,
                "name": "ParameterList",
                "src": "23186:38:0"
              }
            ],
            "id": 1323,
            "name": "EventDefinition",
            "src": "23174:51:0"
          },
          {
            "attributes": {
              "anonymous": false,
              "documentation": null,
              "name": "Withdrawn"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": true,
                      "name": "user",
                      "scope": 1329,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 1324,
                        "name": "ElementaryTypeName",
                        "src": "23246:7:0"
                      }
                    ],
                    "id": 1325,
                    "name": "VariableDeclaration",
                    "src": "23246:20:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": false,
                      "name": "amount",
                      "scope": 1329,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 1326,
                        "name": "ElementaryTypeName",
                        "src": "23268:7:0"
                      }
                    ],
                    "id": 1327,
                    "name": "VariableDeclaration",
                    "src": "23268:14:0"
                  }
                ],
                "id": 1328,
                "name": "ParameterList",
                "src": "23245:38:0"
              }
            ],
            "id": 1329,
            "name": "EventDefinition",
            "src": "23230:54:0"
          },
          {
            "attributes": {
              "anonymous": false,
              "documentation": null,
              "name": "RewardPaid"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": true,
                      "name": "user",
                      "scope": 1335,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 1330,
                        "name": "ElementaryTypeName",
                        "src": "23306:7:0"
                      }
                    ],
                    "id": 1331,
                    "name": "VariableDeclaration",
                    "src": "23306:20:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": false,
                      "name": "reward",
                      "scope": 1335,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 1332,
                        "name": "ElementaryTypeName",
                        "src": "23328:7:0"
                      }
                    ],
                    "id": 1333,
                    "name": "VariableDeclaration",
                    "src": "23328:14:0"
                  }
                ],
                "id": 1334,
                "name": "ParameterList",
                "src": "23305:38:0"
              }
            ],
            "id": 1335,
            "name": "EventDefinition",
            "src": "23289:55:0"
          }
        ],
        "id": 1336,
        "name": "ContractDefinition",
        "src": "17758:5588:0"
      },
      {
        "attributes": {
          "baseContracts": [
            null
          ],
          "contractDependencies": [
            null
          ],
          "contractKind": "interface",
          "documentation": null,
          "fullyImplemented": false,
          "linearizedBaseContracts": [
            1354
          ],
          "name": "IUniswapV2ERC20",
          "scope": 1546
        },
        "children": [
          {
            "attributes": {
              "body": null,
              "documentation": null,
              "implemented": false,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "permit",
              "scope": 1354,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "owner",
                      "scope": 1353,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 1337,
                        "name": "ElementaryTypeName",
                        "src": "23396:7:0"
                      }
                    ],
                    "id": 1338,
                    "name": "VariableDeclaration",
                    "src": "23396:13:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "spender",
                      "scope": 1353,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 1339,
                        "name": "ElementaryTypeName",
                        "src": "23411:7:0"
                      }
                    ],
                    "id": 1340,
                    "name": "VariableDeclaration",
                    "src": "23411:15:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "value",
                      "scope": 1353,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint",
                          "type": "uint256"
                        },
                        "id": 1341,
                        "name": "ElementaryTypeName",
                        "src": "23428:4:0"
                      }
                    ],
                    "id": 1342,
                    "name": "VariableDeclaration",
                    "src": "23428:10:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "deadline",
                      "scope": 1353,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint",
                          "type": "uint256"
                        },
                        "id": 1343,
                        "name": "ElementaryTypeName",
                        "src": "23440:4:0"
                      }
                    ],
                    "id": 1344,
                    "name": "VariableDeclaration",
                    "src": "23440:13:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "v",
                      "scope": 1353,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint8",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint8",
                          "type": "uint8"
                        },
                        "id": 1345,
                        "name": "ElementaryTypeName",
                        "src": "23455:5:0"
                      }
                    ],
                    "id": 1346,
                    "name": "VariableDeclaration",
                    "src": "23455:7:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "r",
                      "scope": 1353,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 1347,
                        "name": "ElementaryTypeName",
                        "src": "23464:7:0"
                      }
                    ],
                    "id": 1348,
                    "name": "VariableDeclaration",
                    "src": "23464:9:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "s",
                      "scope": 1353,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 1349,
                        "name": "ElementaryTypeName",
                        "src": "23475:7:0"
                      }
                    ],
                    "id": 1350,
                    "name": "VariableDeclaration",
                    "src": "23475:9:0"
                  }
                ],
                "id": 1351,
                "name": "ParameterList",
                "src": "23395:90:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 1352,
                "name": "ParameterList",
                "src": "23494:0:0"
              }
            ],
            "id": 1353,
            "name": "FunctionDefinition",
            "src": "23380:115:0"
          }
        ],
        "id": 1354,
        "name": "ContractDefinition",
        "src": "23348:149:0"
      },
      {
        "attributes": {
          "contractDependencies": [
            177,
            1336
          ],
          "contractKind": "contract",
          "documentation": null,
          "fullyImplemented": true,
          "linearizedBaseContracts": [
            1545,
            177
          ],
          "name": "StakingRewardsFactory",
          "scope": 1546
        },
        "children": [
          {
            "attributes": {
              "arguments": null
            },
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "Ownable",
                  "referencedDeclaration": 177,
                  "type": "contract Ownable"
                },
                "id": 1355,
                "name": "UserDefinedTypeName",
                "src": "23533:7:0"
              }
            ],
            "id": 1356,
            "name": "InheritanceSpecifier",
            "src": "23533:7:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "rewardsToken",
              "scope": 1545,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "address",
              "value": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "name": "address",
                  "stateMutability": "nonpayable",
                  "type": "address"
                },
                "id": 1357,
                "name": "ElementaryTypeName",
                "src": "23565:7:0"
              }
            ],
            "id": 1358,
            "name": "VariableDeclaration",
            "src": "23565:27:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "stakingRewardsGenesis",
              "scope": 1545,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "uint256",
              "value": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "name": "uint",
                  "type": "uint256"
                },
                "id": 1359,
                "name": "ElementaryTypeName",
                "src": "23598:4:0"
              }
            ],
            "id": 1360,
            "name": "VariableDeclaration",
            "src": "23598:33:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "stakingTokens",
              "scope": 1545,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "address[]",
              "value": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "length": null,
                  "type": "address[]"
                },
                "children": [
                  {
                    "attributes": {
                      "name": "address",
                      "stateMutability": "nonpayable",
                      "type": "address"
                    },
                    "id": 1361,
                    "name": "ElementaryTypeName",
                    "src": "23713:7:0"
                  }
                ],
                "id": 1362,
                "name": "ArrayTypeName",
                "src": "23713:9:0"
              }
            ],
            "id": 1363,
            "name": "VariableDeclaration",
            "src": "23713:30:0"
          },
          {
            "attributes": {
              "canonicalName": "StakingRewardsFactory.StakingRewardsInfo",
              "name": "StakingRewardsInfo",
              "scope": 1545,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "constant": false,
                  "name": "stakingRewards",
                  "scope": 1368,
                  "stateVariable": false,
                  "storageLocation": "default",
                  "type": "address",
                  "value": null,
                  "visibility": "internal"
                },
                "children": [
                  {
                    "attributes": {
                      "name": "address",
                      "stateMutability": "nonpayable",
                      "type": "address"
                    },
                    "id": 1364,
                    "name": "ElementaryTypeName",
                    "src": "23843:7:0"
                  }
                ],
                "id": 1365,
                "name": "VariableDeclaration",
                "src": "23843:22:0"
              },
              {
                "attributes": {
                  "constant": false,
                  "name": "rewardAmount",
                  "scope": 1368,
                  "stateVariable": false,
                  "storageLocation": "default",
                  "type": "uint256",
                  "value": null,
                  "visibility": "internal"
                },
                "children": [
                  {
                    "attributes": {
                      "name": "uint",
                      "type": "uint256"
                    },
                    "id": 1366,
                    "name": "ElementaryTypeName",
                    "src": "23875:4:0"
                  }
                ],
                "id": 1367,
                "name": "VariableDeclaration",
                "src": "23875:17:0"
              }
            ],
            "id": 1368,
            "name": "StructDefinition",
            "src": "23807:92:0"
          },
          {
            "attributes": {
              "constant": false,
              "name": "stakingRewardsInfoByStakingToken",
              "scope": 1545,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "mapping(address => struct StakingRewardsFactory.StakingRewardsInfo)",
              "value": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "type": "mapping(address => struct StakingRewardsFactory.StakingRewardsInfo)"
                },
                "children": [
                  {
                    "attributes": {
                      "name": "address",
                      "type": "address"
                    },
                    "id": 1369,
                    "name": "ElementaryTypeName",
                    "src": "23950:7:0"
                  },
                  {
                    "attributes": {
                      "contractScope": null,
                      "name": "StakingRewardsInfo",
                      "referencedDeclaration": 1368,
                      "type": "struct StakingRewardsFactory.StakingRewardsInfo"
                    },
                    "id": 1370,
                    "name": "UserDefinedTypeName",
                    "src": "23961:18:0"
                  }
                ],
                "id": 1371,
                "name": "Mapping",
                "src": "23942:38:0"
              }
            ],
            "id": 1372,
            "name": "VariableDeclaration",
            "src": "23942:78:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": true,
              "kind": "constructor",
              "name": "",
              "scope": 1545,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "public"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "_rewardsToken",
                      "scope": 1390,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 1373,
                        "name": "ElementaryTypeName",
                        "src": "24048:7:0"
                      }
                    ],
                    "id": 1374,
                    "name": "VariableDeclaration",
                    "src": "24048:21:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "_stakingRewardsGenesis",
                      "scope": 1390,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint",
                          "type": "uint256"
                        },
                        "id": 1375,
                        "name": "ElementaryTypeName",
                        "src": "24079:4:0"
                      }
                    ],
                    "id": 1376,
                    "name": "VariableDeclaration",
                    "src": "24079:27:0"
                  }
                ],
                "id": 1377,
                "name": "ParameterList",
                "src": "24038:74:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 1380,
                "name": "ParameterList",
                "src": "24130:0:0"
              },
              {
                "attributes": {
                  "arguments": [
                    null
                  ]
                },
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 177,
                      "type": "type(contract Ownable)",
                      "value": "Ownable"
                    },
                    "id": 1378,
                    "name": "Identifier",
                    "src": "24113:7:0"
                  }
                ],
                "id": 1379,
                "name": "ModifierInvocation",
                "src": "24113:9:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "address"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1358,
                              "type": "address",
                              "value": "rewardsToken"
                            },
                            "id": 1381,
                            "name": "Identifier",
                            "src": "24141:12:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1374,
                              "type": "address",
                              "value": "_rewardsToken"
                            },
                            "id": 1382,
                            "name": "Identifier",
                            "src": "24156:13:0"
                          }
                        ],
                        "id": 1383,
                        "name": "Assignment",
                        "src": "24141:28:0"
                      }
                    ],
                    "id": 1384,
                    "name": "ExpressionStatement",
                    "src": "24141:28:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1360,
                              "type": "uint256",
                              "value": "stakingRewardsGenesis"
                            },
                            "id": 1385,
                            "name": "Identifier",
                            "src": "24179:21:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1376,
                              "type": "uint256",
                              "value": "_stakingRewardsGenesis"
                            },
                            "id": 1386,
                            "name": "Identifier",
                            "src": "24203:22:0"
                          }
                        ],
                        "id": 1387,
                        "name": "Assignment",
                        "src": "24179:46:0"
                      }
                    ],
                    "id": 1388,
                    "name": "ExpressionStatement",
                    "src": "24179:46:0"
                  }
                ],
                "id": 1389,
                "name": "Block",
                "src": "24130:102:0"
              }
            ],
            "id": 1390,
            "name": "FunctionDefinition",
            "src": "24027:205:0"
          },
          {
            "attributes": {
              "documentation": "// permissioned functions",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "name": "deploy",
              "scope": 1545,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "public"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "stakingToken",
                      "scope": 1446,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 1391,
                        "name": "ElementaryTypeName",
                        "src": "24475:7:0"
                      }
                    ],
                    "id": 1392,
                    "name": "VariableDeclaration",
                    "src": "24475:20:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "rewardAmount",
                      "scope": 1446,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint",
                          "type": "uint256"
                        },
                        "id": 1393,
                        "name": "ElementaryTypeName",
                        "src": "24497:4:0"
                      }
                    ],
                    "id": 1394,
                    "name": "VariableDeclaration",
                    "src": "24497:17:0"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "rewardsDuration",
                      "scope": 1446,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 1395,
                        "name": "ElementaryTypeName",
                        "src": "24516:7:0"
                      }
                    ],
                    "id": 1396,
                    "name": "VariableDeclaration",
                    "src": "24516:23:0"
                  }
                ],
                "id": 1397,
                "name": "ParameterList",
                "src": "24474:66:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 1400,
                "name": "ParameterList",
                "src": "24558:0:0"
              },
              {
                "attributes": {
                  "arguments": null
                },
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 110,
                      "type": "modifier ()",
                      "value": "onlyOwner"
                    },
                    "id": 1398,
                    "name": "Identifier",
                    "src": "24548:9:0"
                  }
                ],
                "id": 1399,
                "name": "ModifierInvocation",
                "src": "24548:9:0"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "assignments": [
                        1402
                      ]
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "name": "info",
                          "scope": 1445,
                          "stateVariable": false,
                          "storageLocation": "storage",
                          "type": "struct StakingRewardsFactory.StakingRewardsInfo",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "contractScope": null,
                              "name": "StakingRewardsInfo",
                              "referencedDeclaration": 1368,
                              "type": "struct StakingRewardsFactory.StakingRewardsInfo"
                            },
                            "id": 1401,
                            "name": "UserDefinedTypeName",
                            "src": "24568:18:0"
                          }
                        ],
                        "id": 1402,
                        "name": "VariableDeclaration",
                        "src": "24568:31:0"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "type": "struct StakingRewardsFactory.StakingRewardsInfo storage ref"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1372,
                              "type": "mapping(address => struct StakingRewardsFactory.StakingRewardsInfo storage ref)",
                              "value": "stakingRewardsInfoByStakingToken"
                            },
                            "id": 1403,
                            "name": "Identifier",
                            "src": "24602:32:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1392,
                              "type": "address",
                              "value": "stakingToken"
                            },
                            "id": 1404,
                            "name": "Identifier",
                            "src": "24635:12:0"
                          }
                        ],
                        "id": 1405,
                        "name": "IndexAccess",
                        "src": "24602:46:0"
                      }
                    ],
                    "id": 1406,
                    "name": "VariableDeclarationStatement",
                    "src": "24568:80:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_77d8567a7b7bf9a9a30ea727f6e525cae6667d736cdaff555c86db8d81648a1a",
                                  "typeString": "literal_string \"StakingRewardsFactory::deploy: already deployed\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 1407,
                            "name": "Identifier",
                            "src": "24658:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": "==",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "stakingRewards",
                                  "referencedDeclaration": 1365,
                                  "type": "address"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1402,
                                      "type": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer",
                                      "value": "info"
                                    },
                                    "id": 1408,
                                    "name": "Identifier",
                                    "src": "24666:4:0"
                                  }
                                ],
                                "id": 1409,
                                "name": "MemberAccess",
                                "src": "24666:19:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "address payable",
                                  "type_conversion": true
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        }
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "type": "type(address)",
                                      "value": "address"
                                    },
                                    "id": 1410,
                                    "name": "ElementaryTypeNameExpression",
                                    "src": "24689:7:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "hexvalue": "30",
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "subdenomination": null,
                                      "token": "number",
                                      "type": "int_const 0",
                                      "value": "0"
                                    },
                                    "id": 1411,
                                    "name": "Literal",
                                    "src": "24697:1:0"
                                  }
                                ],
                                "id": 1412,
                                "name": "FunctionCall",
                                "src": "24689:10:0"
                              }
                            ],
                            "id": 1413,
                            "name": "BinaryOperation",
                            "src": "24666:33:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "5374616b696e6752657761726473466163746f72793a3a6465706c6f793a20616c7265616479206465706c6f796564",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"StakingRewardsFactory::deploy: already deployed\"",
                              "value": "StakingRewardsFactory::deploy: already deployed"
                            },
                            "id": 1414,
                            "name": "Literal",
                            "src": "24701:49:0"
                          }
                        ],
                        "id": 1415,
                        "name": "FunctionCall",
                        "src": "24658:93:0"
                      }
                    ],
                    "id": 1416,
                    "name": "ExpressionStatement",
                    "src": "24658:93:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "address"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": true,
                              "member_name": "stakingRewards",
                              "referencedDeclaration": 1365,
                              "type": "address"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1402,
                                  "type": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer",
                                  "value": "info"
                                },
                                "id": 1417,
                                "name": "Identifier",
                                "src": "24762:4:0"
                              }
                            ],
                            "id": 1419,
                            "name": "MemberAccess",
                            "src": "24762:19:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "address",
                              "type_conversion": true
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_StakingRewards_$1336",
                                      "typeString": "contract StakingRewards"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "type": "type(address)",
                                  "value": "address"
                                },
                                "id": 1420,
                                "name": "ElementaryTypeNameExpression",
                                "src": "24784:7:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "contract StakingRewards",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        },
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        },
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        },
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "type": "function (address,address,address,uint256) returns (contract StakingRewards)"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "contractScope": null,
                                          "name": "StakingRewards",
                                          "referencedDeclaration": 1336,
                                          "type": "contract StakingRewards"
                                        },
                                        "id": 1421,
                                        "name": "UserDefinedTypeName",
                                        "src": "24796:14:0"
                                      }
                                    ],
                                    "id": 1422,
                                    "name": "NewExpression",
                                    "src": "24792:18:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "isStructConstructorCall": false,
                                      "lValueRequested": false,
                                      "names": [
                                        null
                                      ],
                                      "type": "address",
                                      "type_conversion": true
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_contract$_StakingRewardsFactory_$1545",
                                              "typeString": "contract StakingRewardsFactory"
                                            }
                                          ],
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "type": "type(address)",
                                          "value": "address"
                                        },
                                        "id": 1423,
                                        "name": "ElementaryTypeNameExpression",
                                        "src": "24837:7:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1598,
                                          "type": "contract StakingRewardsFactory",
                                          "value": "this"
                                        },
                                        "id": 1424,
                                        "name": "Identifier",
                                        "src": "24845:4:0"
                                      }
                                    ],
                                    "id": 1425,
                                    "name": "FunctionCall",
                                    "src": "24837:13:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1358,
                                      "type": "address",
                                      "value": "rewardsToken"
                                    },
                                    "id": 1426,
                                    "name": "Identifier",
                                    "src": "24852:12:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1392,
                                      "type": "address",
                                      "value": "stakingToken"
                                    },
                                    "id": 1427,
                                    "name": "Identifier",
                                    "src": "24866:12:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1396,
                                      "type": "uint256",
                                      "value": "rewardsDuration"
                                    },
                                    "id": 1428,
                                    "name": "Identifier",
                                    "src": "24880:15:0"
                                  }
                                ],
                                "id": 1429,
                                "name": "FunctionCall",
                                "src": "24792:104:0"
                              }
                            ],
                            "id": 1430,
                            "name": "FunctionCall",
                            "src": "24784:113:0"
                          }
                        ],
                        "id": 1431,
                        "name": "Assignment",
                        "src": "24762:135:0"
                      }
                    ],
                    "id": 1432,
                    "name": "ExpressionStatement",
                    "src": "24762:135:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": true,
                              "member_name": "rewardAmount",
                              "referencedDeclaration": 1367,
                              "type": "uint256"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1402,
                                  "type": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer",
                                  "value": "info"
                                },
                                "id": 1433,
                                "name": "Identifier",
                                "src": "24907:4:0"
                              }
                            ],
                            "id": 1435,
                            "name": "MemberAccess",
                            "src": "24907:17:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1394,
                              "type": "uint256",
                              "value": "rewardAmount"
                            },
                            "id": 1436,
                            "name": "Identifier",
                            "src": "24927:12:0"
                          }
                        ],
                        "id": 1437,
                        "name": "Assignment",
                        "src": "24907:32:0"
                      }
                    ],
                    "id": 1438,
                    "name": "ExpressionStatement",
                    "src": "24907:32:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "uint256",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "push",
                              "referencedDeclaration": null,
                              "type": "function (address) returns (uint256)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1363,
                                  "type": "address[] storage ref",
                                  "value": "stakingTokens"
                                },
                                "id": 1439,
                                "name": "Identifier",
                                "src": "24949:13:0"
                              }
                            ],
                            "id": 1441,
                            "name": "MemberAccess",
                            "src": "24949:18:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1392,
                              "type": "address",
                              "value": "stakingToken"
                            },
                            "id": 1442,
                            "name": "Identifier",
                            "src": "24968:12:0"
                          }
                        ],
                        "id": 1443,
                        "name": "FunctionCall",
                        "src": "24949:32:0"
                      }
                    ],
                    "id": 1444,
                    "name": "ExpressionStatement",
                    "src": "24949:32:0"
                  }
                ],
                "id": 1445,
                "name": "Block",
                "src": "24558:430:0"
              }
            ],
            "id": 1446,
            "name": "FunctionDefinition",
            "src": "24459:529:0"
          },
          {
            "attributes": {
              "documentation": "// permissionless functions",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "notifyRewardAmounts",
              "scope": 1545,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 1447,
                "name": "ParameterList",
                "src": "25113:2:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 1448,
                "name": "ParameterList",
                "src": "25123:0:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_ae1f87e20c157d2878a2e48b377d209dfddfc6d5ec9b80ceecc5addd0ef6ffdb",
                                  "typeString": "literal_string \"StakingRewardsFactory::notifyRewardAmounts: called before any deploys\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 1449,
                            "name": "Identifier",
                            "src": "25133:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": ">",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "length",
                                  "referencedDeclaration": null,
                                  "type": "uint256"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1363,
                                      "type": "address[] storage ref",
                                      "value": "stakingTokens"
                                    },
                                    "id": 1450,
                                    "name": "Identifier",
                                    "src": "25141:13:0"
                                  }
                                ],
                                "id": 1451,
                                "name": "MemberAccess",
                                "src": "25141:20:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "hexvalue": "30",
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "subdenomination": null,
                                  "token": "number",
                                  "type": "int_const 0",
                                  "value": "0"
                                },
                                "id": 1452,
                                "name": "Literal",
                                "src": "25164:1:0"
                              }
                            ],
                            "id": 1453,
                            "name": "BinaryOperation",
                            "src": "25141:24:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "5374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e74733a2063616c6c6564206265666f726520616e79206465706c6f7973",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"StakingRewardsFactory::notifyRewardAmounts: called before any deploys\"",
                              "value": "StakingRewardsFactory::notifyRewardAmounts: called before any deploys"
                            },
                            "id": 1454,
                            "name": "Literal",
                            "src": "25167:71:0"
                          }
                        ],
                        "id": 1455,
                        "name": "FunctionCall",
                        "src": "25133:106:0"
                      }
                    ],
                    "id": 1456,
                    "name": "ExpressionStatement",
                    "src": "25133:106:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "assignments": [
                            1458
                          ]
                        },
                        "children": [
                          {
                            "attributes": {
                              "constant": false,
                              "name": "i",
                              "scope": 1475,
                              "stateVariable": false,
                              "storageLocation": "default",
                              "type": "uint256",
                              "value": null,
                              "visibility": "internal"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "name": "uint",
                                  "type": "uint256"
                                },
                                "id": 1457,
                                "name": "ElementaryTypeName",
                                "src": "25254:4:0"
                              }
                            ],
                            "id": 1458,
                            "name": "VariableDeclaration",
                            "src": "25254:6:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "30",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "number",
                              "type": "int_const 0",
                              "value": "0"
                            },
                            "id": 1459,
                            "name": "Literal",
                            "src": "25263:1:0"
                          }
                        ],
                        "id": 1460,
                        "name": "VariableDeclarationStatement",
                        "src": "25254:10:0"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "<",
                          "type": "bool"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1458,
                              "type": "uint256",
                              "value": "i"
                            },
                            "id": 1461,
                            "name": "Identifier",
                            "src": "25266:1:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "length",
                              "referencedDeclaration": null,
                              "type": "uint256"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1363,
                                  "type": "address[] storage ref",
                                  "value": "stakingTokens"
                                },
                                "id": 1462,
                                "name": "Identifier",
                                "src": "25270:13:0"
                              }
                            ],
                            "id": 1463,
                            "name": "MemberAccess",
                            "src": "25270:20:0"
                          }
                        ],
                        "id": 1464,
                        "name": "BinaryOperation",
                        "src": "25266:24:0"
                      },
                      {
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": "++",
                              "prefix": false,
                              "type": "uint256"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1458,
                                  "type": "uint256",
                                  "value": "i"
                                },
                                "id": 1465,
                                "name": "Identifier",
                                "src": "25292:1:0"
                              }
                            ],
                            "id": 1466,
                            "name": "UnaryOperation",
                            "src": "25292:3:0"
                          }
                        ],
                        "id": 1467,
                        "name": "ExpressionStatement",
                        "src": "25292:3:0"
                      },
                      {
                        "children": [
                          {
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "tuple()",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1544,
                                      "type": "function (address)",
                                      "value": "notifyRewardAmount"
                                    },
                                    "id": 1468,
                                    "name": "Identifier",
                                    "src": "25311:18:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "type": "address"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1363,
                                          "type": "address[] storage ref",
                                          "value": "stakingTokens"
                                        },
                                        "id": 1469,
                                        "name": "Identifier",
                                        "src": "25330:13:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1458,
                                          "type": "uint256",
                                          "value": "i"
                                        },
                                        "id": 1470,
                                        "name": "Identifier",
                                        "src": "25344:1:0"
                                      }
                                    ],
                                    "id": 1471,
                                    "name": "IndexAccess",
                                    "src": "25330:16:0"
                                  }
                                ],
                                "id": 1472,
                                "name": "FunctionCall",
                                "src": "25311:36:0"
                              }
                            ],
                            "id": 1473,
                            "name": "ExpressionStatement",
                            "src": "25311:36:0"
                          }
                        ],
                        "id": 1474,
                        "name": "Block",
                        "src": "25297:61:0"
                      }
                    ],
                    "id": 1475,
                    "name": "ForStatement",
                    "src": "25249:109:0"
                  }
                ],
                "id": 1476,
                "name": "Block",
                "src": "25123:241:0"
              }
            ],
            "id": 1477,
            "name": "FunctionDefinition",
            "src": "25085:279:0"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "notifyRewardAmount",
              "scope": 1545,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "public"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "stakingToken",
                      "scope": 1544,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 1478,
                        "name": "ElementaryTypeName",
                        "src": "25562:7:0"
                      }
                    ],
                    "id": 1479,
                    "name": "VariableDeclaration",
                    "src": "25562:20:0"
                  }
                ],
                "id": 1480,
                "name": "ParameterList",
                "src": "25561:22:0"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 1481,
                "name": "ParameterList",
                "src": "25591:0:0"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_e71986032604f829ccaec9386c51e838a85cdbf506769bd103c829f640682adf",
                                  "typeString": "literal_string \"StakingRewardsFactory::notifyRewardAmount: not ready\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 1482,
                            "name": "Identifier",
                            "src": "25601:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": ">=",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "timestamp",
                                  "referencedDeclaration": null,
                                  "type": "uint256"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1550,
                                      "type": "block",
                                      "value": "block"
                                    },
                                    "id": 1483,
                                    "name": "Identifier",
                                    "src": "25609:5:0"
                                  }
                                ],
                                "id": 1484,
                                "name": "MemberAccess",
                                "src": "25609:15:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1360,
                                  "type": "uint256",
                                  "value": "stakingRewardsGenesis"
                                },
                                "id": 1485,
                                "name": "Identifier",
                                "src": "25628:21:0"
                              }
                            ],
                            "id": 1486,
                            "name": "BinaryOperation",
                            "src": "25609:40:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "5374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e743a206e6f74207265616479",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"StakingRewardsFactory::notifyRewardAmount: not ready\"",
                              "value": "StakingRewardsFactory::notifyRewardAmount: not ready"
                            },
                            "id": 1487,
                            "name": "Literal",
                            "src": "25651:54:0"
                          }
                        ],
                        "id": 1488,
                        "name": "FunctionCall",
                        "src": "25601:105:0"
                      }
                    ],
                    "id": 1489,
                    "name": "ExpressionStatement",
                    "src": "25601:105:0"
                  },
                  {
                    "attributes": {
                      "assignments": [
                        1491
                      ]
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "name": "info",
                          "scope": 1543,
                          "stateVariable": false,
                          "storageLocation": "storage",
                          "type": "struct StakingRewardsFactory.StakingRewardsInfo",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "contractScope": null,
                              "name": "StakingRewardsInfo",
                              "referencedDeclaration": 1368,
                              "type": "struct StakingRewardsFactory.StakingRewardsInfo"
                            },
                            "id": 1490,
                            "name": "UserDefinedTypeName",
                            "src": "25717:18:0"
                          }
                        ],
                        "id": 1491,
                        "name": "VariableDeclaration",
                        "src": "25717:31:0"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "type": "struct StakingRewardsFactory.StakingRewardsInfo storage ref"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1372,
                              "type": "mapping(address => struct StakingRewardsFactory.StakingRewardsInfo storage ref)",
                              "value": "stakingRewardsInfoByStakingToken"
                            },
                            "id": 1492,
                            "name": "Identifier",
                            "src": "25751:32:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1479,
                              "type": "address",
                              "value": "stakingToken"
                            },
                            "id": 1493,
                            "name": "Identifier",
                            "src": "25784:12:0"
                          }
                        ],
                        "id": 1494,
                        "name": "IndexAccess",
                        "src": "25751:46:0"
                      }
                    ],
                    "id": 1495,
                    "name": "VariableDeclarationStatement",
                    "src": "25717:80:0"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_e8f5c4ca6631f4bfe6ffabf099741b79e5c6b86618ddcbeee6ba3c5940184427",
                                  "typeString": "literal_string \"StakingRewardsFactory::notifyRewardAmount: not deployed\""
                                }
                              ],
                              "overloadedDeclarations": [
                                1563,
                                1564
                              ],
                              "referencedDeclaration": 1564,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 1496,
                            "name": "Identifier",
                            "src": "25807:7:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": "!=",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "stakingRewards",
                                  "referencedDeclaration": 1365,
                                  "type": "address"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1491,
                                      "type": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer",
                                      "value": "info"
                                    },
                                    "id": 1497,
                                    "name": "Identifier",
                                    "src": "25815:4:0"
                                  }
                                ],
                                "id": 1498,
                                "name": "MemberAccess",
                                "src": "25815:19:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "address payable",
                                  "type_conversion": true
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        }
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "type": "type(address)",
                                      "value": "address"
                                    },
                                    "id": 1499,
                                    "name": "ElementaryTypeNameExpression",
                                    "src": "25838:7:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "hexvalue": "30",
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "subdenomination": null,
                                      "token": "number",
                                      "type": "int_const 0",
                                      "value": "0"
                                    },
                                    "id": 1500,
                                    "name": "Literal",
                                    "src": "25846:1:0"
                                  }
                                ],
                                "id": 1501,
                                "name": "FunctionCall",
                                "src": "25838:10:0"
                              }
                            ],
                            "id": 1502,
                            "name": "BinaryOperation",
                            "src": "25815:33:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "5374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e743a206e6f74206465706c6f796564",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"StakingRewardsFactory::notifyRewardAmount: not deployed\"",
                              "value": "StakingRewardsFactory::notifyRewardAmount: not deployed"
                            },
                            "id": 1503,
                            "name": "Literal",
                            "src": "25850:57:0"
                          }
                        ],
                        "id": 1504,
                        "name": "FunctionCall",
                        "src": "25807:101:0"
                      }
                    ],
                    "id": 1505,
                    "name": "ExpressionStatement",
                    "src": "25807:101:0"
                  },
                  {
                    "attributes": {
                      "falseBody": null
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": ">",
                          "type": "bool"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "rewardAmount",
                              "referencedDeclaration": 1367,
                              "type": "uint256"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 1491,
                                  "type": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer",
                                  "value": "info"
                                },
                                "id": 1506,
                                "name": "Identifier",
                                "src": "25923:4:0"
                              }
                            ],
                            "id": 1507,
                            "name": "MemberAccess",
                            "src": "25923:17:0"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "30",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "number",
                              "type": "int_const 0",
                              "value": "0"
                            },
                            "id": 1508,
                            "name": "Literal",
                            "src": "25943:1:0"
                          }
                        ],
                        "id": 1509,
                        "name": "BinaryOperation",
                        "src": "25923:21:0"
                      },
                      {
                        "children": [
                          {
                            "attributes": {
                              "assignments": [
                                1511
                              ]
                            },
                            "children": [
                              {
                                "attributes": {
                                  "constant": false,
                                  "name": "rewardAmount",
                                  "scope": 1541,
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "type": "uint256",
                                  "value": null,
                                  "visibility": "internal"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "name": "uint",
                                      "type": "uint256"
                                    },
                                    "id": 1510,
                                    "name": "ElementaryTypeName",
                                    "src": "25960:4:0"
                                  }
                                ],
                                "id": 1511,
                                "name": "VariableDeclaration",
                                "src": "25960:17:0"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "rewardAmount",
                                  "referencedDeclaration": 1367,
                                  "type": "uint256"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1491,
                                      "type": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer",
                                      "value": "info"
                                    },
                                    "id": 1512,
                                    "name": "Identifier",
                                    "src": "25980:4:0"
                                  }
                                ],
                                "id": 1513,
                                "name": "MemberAccess",
                                "src": "25980:17:0"
                              }
                            ],
                            "id": 1514,
                            "name": "VariableDeclarationStatement",
                            "src": "25960:37:0"
                          },
                          {
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "operator": "=",
                                  "type": "uint256"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": true,
                                      "member_name": "rewardAmount",
                                      "referencedDeclaration": 1367,
                                      "type": "uint256"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1491,
                                          "type": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer",
                                          "value": "info"
                                        },
                                        "id": 1515,
                                        "name": "Identifier",
                                        "src": "26011:4:0"
                                      }
                                    ],
                                    "id": 1517,
                                    "name": "MemberAccess",
                                    "src": "26011:17:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "hexvalue": "30",
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "subdenomination": null,
                                      "token": "number",
                                      "type": "int_const 0",
                                      "value": "0"
                                    },
                                    "id": 1518,
                                    "name": "Literal",
                                    "src": "26031:1:0"
                                  }
                                ],
                                "id": 1519,
                                "name": "Assignment",
                                "src": "26011:21:0"
                              }
                            ],
                            "id": 1520,
                            "name": "ExpressionStatement",
                            "src": "26011:21:0"
                          },
                          {
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "tuple()",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        },
                                        {
                                          "typeIdentifier": "t_stringliteral_afbe2226aded12cd2f0d3c83ff167eedc78632dc0894f92eea331d3f2b56d089",
                                          "typeString": "literal_string \"StakingRewardsFactory::notifyRewardAmount: transfer failed\""
                                        }
                                      ],
                                      "overloadedDeclarations": [
                                        1563,
                                        1564
                                      ],
                                      "referencedDeclaration": 1564,
                                      "type": "function (bool,string memory) pure",
                                      "value": "require"
                                    },
                                    "id": 1521,
                                    "name": "Identifier",
                                    "src": "26047:7:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "isStructConstructorCall": false,
                                      "lValueRequested": false,
                                      "names": [
                                        null
                                      ],
                                      "type": "bool",
                                      "type_conversion": false
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            },
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "member_name": "transfer",
                                          "referencedDeclaration": 22,
                                          "type": "function (address,uint256) external returns (bool)"
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "isStructConstructorCall": false,
                                              "lValueRequested": false,
                                              "names": [
                                                null
                                              ],
                                              "type": "contract IERC20",
                                              "type_conversion": true
                                            },
                                            "children": [
                                              {
                                                "attributes": {
                                                  "argumentTypes": [
                                                    {
                                                      "typeIdentifier": "t_address",
                                                      "typeString": "address"
                                                    }
                                                  ],
                                                  "overloadedDeclarations": [
                                                    null
                                                  ],
                                                  "referencedDeclaration": 68,
                                                  "type": "type(contract IERC20)",
                                                  "value": "IERC20"
                                                },
                                                "id": 1522,
                                                "name": "Identifier",
                                                "src": "26072:6:0"
                                              },
                                              {
                                                "attributes": {
                                                  "argumentTypes": null,
                                                  "overloadedDeclarations": [
                                                    null
                                                  ],
                                                  "referencedDeclaration": 1358,
                                                  "type": "address",
                                                  "value": "rewardsToken"
                                                },
                                                "id": 1523,
                                                "name": "Identifier",
                                                "src": "26079:12:0"
                                              }
                                            ],
                                            "id": 1524,
                                            "name": "FunctionCall",
                                            "src": "26072:20:0"
                                          }
                                        ],
                                        "id": 1525,
                                        "name": "MemberAccess",
                                        "src": "26072:29:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "member_name": "stakingRewards",
                                          "referencedDeclaration": 1365,
                                          "type": "address"
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "overloadedDeclarations": [
                                                null
                                              ],
                                              "referencedDeclaration": 1491,
                                              "type": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer",
                                              "value": "info"
                                            },
                                            "id": 1526,
                                            "name": "Identifier",
                                            "src": "26102:4:0"
                                          }
                                        ],
                                        "id": 1527,
                                        "name": "MemberAccess",
                                        "src": "26102:19:0"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 1511,
                                          "type": "uint256",
                                          "value": "rewardAmount"
                                        },
                                        "id": 1528,
                                        "name": "Identifier",
                                        "src": "26123:12:0"
                                      }
                                    ],
                                    "id": 1529,
                                    "name": "FunctionCall",
                                    "src": "26072:64:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "hexvalue": "5374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e743a207472616e73666572206661696c6564",
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "subdenomination": null,
                                      "token": "string",
                                      "type": "literal_string \"StakingRewardsFactory::notifyRewardAmount: transfer failed\"",
                                      "value": "StakingRewardsFactory::notifyRewardAmount: transfer failed"
                                    },
                                    "id": 1530,
                                    "name": "Literal",
                                    "src": "26154:60:0"
                                  }
                                ],
                                "id": 1531,
                                "name": "FunctionCall",
                                "src": "26047:181:0"
                              }
                            ],
                            "id": 1532,
                            "name": "ExpressionStatement",
                            "src": "26047:181:0"
                          },
                          {
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "tuple()",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "notifyRewardAmount",
                                      "referencedDeclaration": 1276,
                                      "type": "function (uint256) external"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "isStructConstructorCall": false,
                                          "lValueRequested": false,
                                          "names": [
                                            null
                                          ],
                                          "type": "contract StakingRewards",
                                          "type_conversion": true
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                }
                                              ],
                                              "overloadedDeclarations": [
                                                null
                                              ],
                                              "referencedDeclaration": 1336,
                                              "type": "type(contract StakingRewards)",
                                              "value": "StakingRewards"
                                            },
                                            "id": 1533,
                                            "name": "Identifier",
                                            "src": "26242:14:0"
                                          },
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "member_name": "stakingRewards",
                                              "referencedDeclaration": 1365,
                                              "type": "address"
                                            },
                                            "children": [
                                              {
                                                "attributes": {
                                                  "argumentTypes": null,
                                                  "overloadedDeclarations": [
                                                    null
                                                  ],
                                                  "referencedDeclaration": 1491,
                                                  "type": "struct StakingRewardsFactory.StakingRewardsInfo storage pointer",
                                                  "value": "info"
                                                },
                                                "id": 1534,
                                                "name": "Identifier",
                                                "src": "26257:4:0"
                                              }
                                            ],
                                            "id": 1535,
                                            "name": "MemberAccess",
                                            "src": "26257:19:0"
                                          }
                                        ],
                                        "id": 1536,
                                        "name": "FunctionCall",
                                        "src": "26242:35:0"
                                      }
                                    ],
                                    "id": 1537,
                                    "name": "MemberAccess",
                                    "src": "26242:54:0"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 1511,
                                      "type": "uint256",
                                      "value": "rewardAmount"
                                    },
                                    "id": 1538,
                                    "name": "Identifier",
                                    "src": "26297:12:0"
                                  }
                                ],
                                "id": 1539,
                                "name": "FunctionCall",
                                "src": "26242:68:0"
                              }
                            ],
                            "id": 1540,
                            "name": "ExpressionStatement",
                            "src": "26242:68:0"
                          }
                        ],
                        "id": 1541,
                        "name": "Block",
                        "src": "25946:375:0"
                      }
                    ],
                    "id": 1542,
                    "name": "IfStatement",
                    "src": "25919:402:0"
                  }
                ],
                "id": 1543,
                "name": "Block",
                "src": "25591:736:0"
              }
            ],
            "id": 1544,
            "name": "FunctionDefinition",
            "src": "25534:793:0"
          }
        ],
        "id": 1545,
        "name": "ContractDefinition",
        "src": "23499:2830:0"
      }
    ],
    "id": 1546,
    "name": "SourceUnit",
    "src": "31:26298:0"
  },
  "compiler": {
    "name": "solc",
    "version": "0.5.16+commit.9c3226ce.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.4.1",
  "updatedAt": "2022-02-02T23:34:40.305Z",
  "devdoc": {
    "methods": {}
  },
  "userdoc": {
    "methods": {}
  }
}