{
  "contractName": "IERC20_DAOPool",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "deadline",
          "type": "uint256"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "permit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"project:/contracts/DAOPool.sol\":\"IERC20_DAOPool\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"project:/contracts/DAOPool.sol\":{\"keccak256\":\"0xafdcaddc390812514a17dac6ae4f9d54c758ec51c7319cf1392fdb06ef46474b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c7aeb81b63df07cb8a763d6a8ce4576ef2821ca94f7699c132ad70b50210ba8e\",\"dweb:/ipfs/QmawqgqPm3PpRbfYVkNZGe4Vmsxki5bKhzLLqg466iVxgo\"]},\"project:/contracts/ReentrancyGuard.sol\":{\"keccak256\":\"0x6a42732aa0a681892f66e5f7b3b3075444378bf937c8e93661df5e7443c5c3dc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://778a2ee1360d2ace549ac0f283ccf3f7279bdff8876fdc037c4bcad012652717\",\"dweb:/ipfs/QmTrnghLT57Y3jD9yNR3fycronEc9nVuYEjzxnYtJpjX1F\"]},\"project:/contracts/SafeTransferLib.sol\":{\"keccak256\":\"0xb0500234799f59758b44c78ed63166f2b64a5d8c0c19024fd85208508656164f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f66a271b4ebee7032c91876874f54773a35955249b912621c7321502a365d417\",\"dweb:/ipfs/QmVkYb24oB8BKCebkrQG6eNubX55eUDsyFF7vNTepFjLPi\"]}},\"version\":1}",
  "bytecode": "0x",
  "deployedBytecode": "0x",
  "immutableReferences": {},
  "generatedSources": [],
  "deployedGeneratedSources": [],
  "sourceMap": "",
  "deployedSourceMap": "",
  "source": "// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.18;\r\n\r\n// These files are strictly provided as-is\r\n// without any express or implied guarantees, representations, or warranties\r\n// as to any of these files or any deployments hereof.\r\n\r\n// Any users of these files are doing so at their own risk.\r\n\r\n// Solbase ReentrancyGuard\r\nimport {ReentrancyGuard} from \"./ReentrancyGuard.sol\";\r\n// Solbase SafeTransferLib\r\nimport {SafeTransferLib} from \"./SafeTransferLib.sol\";\r\n\r\ninterface IERC20_DAOPool {\r\n    function balanceOf(address owner) external view returns (uint256);\r\n\r\n    // for 'depositWithPermit()'\r\n    function permit(\r\n        address owner,\r\n        address spender,\r\n        uint256 value,\r\n        uint256 deadline,\r\n        uint8 v,\r\n        bytes32 r,\r\n        bytes32 s\r\n    ) external;\r\n}\r\n\r\ninterface IEnshroudProtocol_DAOPool {\r\n    /// @notice 'mvoSigs' is an array of MVO signatures provided by the MVO server (first is lead MVO);\r\n    /// 'mvoIDs' are the IDs of the MVOs, the first of which is the lead MVO which receives the deposit message\r\n    struct MVOinfo {\r\n        bytes[] mvoSigs;\r\n        string[] mvoIDs;\r\n    }\r\n\r\n    function depositEth(address depositor) external payable;\r\n\r\n    function depositTokens(\r\n        address depositor,\r\n        address tokenContract,\r\n        uint256 amount\r\n    ) external;\r\n\r\n    // getter for public 'adminStatus[]' mapping\r\n    function adminStatus(address addr) external view returns (bool);\r\n}\r\n\r\n/// @title contract that keeps state variables including checkpoints and user structs\r\nabstract contract StateUtils is ReentrancyGuard {\r\n    using SafeTransferLib for address;\r\n\r\n    struct AddressCheckpoint {\r\n        uint32 fromBlock;\r\n        address _address;\r\n    }\r\n\r\n    struct Checkpoint {\r\n        uint32 fromBlock;\r\n        uint224 value;\r\n    }\r\n\r\n    /// @dev packing uints did not save gas with explicit conversions, so we keep all values at uint256\r\n    struct User {\r\n        Checkpoint[] shares;\r\n        Checkpoint[] delegatedTo;\r\n        AddressCheckpoint[] delegates;\r\n        uint256 deposited; // deposited to pool, unlocked, but not staked\r\n        uint256 unstakeAmount; // amount scheduled for unstaking\r\n        uint256 unstakeShares; // shares scheduled for unstaking\r\n        uint256 unstakeScheduledFor;\r\n        uint256 lastDelegationUpdateTimestamp;\r\n    }\r\n\r\n\t/// types to distinguish Requests\r\n\tenum ApprovalTypes { Protocol, FeeBot }\r\n\r\n\t/// @notice to track admin update requests; addresses truncated to bytes8 for size/gas considerations\r\n\tstruct Requests {\r\n\t\tbytes8 requester1;\r\n\t\tbytes8 requester2;\r\n\t\tApprovalTypes requestType;\r\n\t}\r\n\r\n    uint256 internal constant ARRAY_LIMIT = 20; // max limit for dynamic arrays (token contracts supplied)\r\n    uint256 internal constant DECIMALS = 1e18;\r\n    uint256 internal constant MAX_UINT256 = 2 ** 256 - 1;\r\n\r\n    /// @notice constant variable of one week for timestamp calculations\r\n    uint256 public constant EPOCH_LENGTH = 1 weeks;\r\n\r\n    /// @notice for block number calculations, approximated via 7150 blocks/day on ETH mainnet * 7 days.\r\n    /// @dev should be altered accordingly for other deployments.\r\n    uint256 public constant BLOCKS_PER_EPOCH = 50050;\r\n\r\n    /// @notice block starting point for epoch calculations\r\n    uint256 internal immutable genesisBlock;\r\n\r\n    /// @notice Enshroud protocol contract. If a v2 protocol is deployed, updateProtocol() should be called by 3 admins, or else a DAOPool v2 may be deployed.\r\n\t/// @notice Without doing so, the functions claimETHYieldAsENFTs() and claimTokenYieldsAsENFTs() in address(this) would deposit value only to the v1 protocol contract.\r\n\taddress public enshroudProtocol;\r\n    IEnshroudProtocol_DAOPool public iProtocol;\r\n\r\n    /// @notice $ENSHROUD token\r\n    address public immutable enshroudToken;\r\n\r\n    /// @notice TimelockManager contract, initialised by admin via TimelockUtils\r\n    address public timelockManager;\r\n\r\n\t/// @notice address used by bot to import fees earned on other chains\r\n\taddress internal feesBot;\r\n\r\n\t/// @notice total number of $ENSHROUD tokens deposited but not staked (some could be locked in a Timelock, but those cannot be staked)\r\n\tuint256 public depositedUnstaked;\r\n\r\n    /// @notice total number of $ENSHROUD tokens staked in this contract\r\n    uint256 public totalStake;\r\n\r\n    /// @notice maps an address to their 'User' struct\r\n    mapping(address => User) public users;\r\n\r\n    /// @notice maps an address to the block.number of their most recent 'stake()'\r\n    mapping(address => uint256) public mostRecentStake;\r\n\r\n    /// @notice nesting mapping of user address to an asset's address to the number of blocks since such user has claimed their yield for such asset, to compare against epoch length in claim functions\r\n    mapping(address => mapping(address => uint256)) public claimed;\r\n\r\n    /// @notice keeps the total number of shares of the pool\r\n    Checkpoint[] public poolShares;\r\n\r\n\t/// @notice used for tracking state of update*() invocations\r\n\tmapping(address => Requests) internal updateRequested;\r\n\r\n    /*///////////////////////////////////////////////////////////////\r\n                            ERRORS\r\n    //////////////////////////////////////////////////////////////*/\r\n\r\n    error AlreadyClaimedThisEpoch();\r\n    error AlreadyDelegated();\r\n    error AmountExceedsDeposited();\r\n    error AmountExceedsStaked();\r\n    error AmountExceedsUnlocked();\r\n    error DAOPool_ArrayTooLong();\r\n    error DAOPool_ExistingTimelock();\r\n    error DAOPool_ReleaseNotStarted();\r\n    error DAOPool_ReleaseEnded();\r\n    error DAOPool_StartMustPrecedeEnd();\r\n    error DelegateUpdatedTooRecently();\r\n    error ExistingUnstake();\r\n    error GreaterThanMaxValue();\r\n    error InvalidChainId();\r\n    error InvalidDelegate();\r\n\terror LengthMismatch();\r\n    error LessThanOneEpochSinceStake();\r\n    error MulDivFailed();\r\n    error NoShares();\r\n    error NotDepositOwner();\r\n    error NotAdmin();\r\n    error NotDelegated();\r\n    error NotTimelockManager();\r\n\terror OnlyFeesBot();\r\n    error UnstakeNotAvailable();\r\n    error ZeroAddress();\r\n\r\n    /*///////////////////////////////////////////////////////////////\r\n                            MODIFIERS\r\n    //////////////////////////////////////////////////////////////*/\r\n\r\n    /// @notice ensures msg.sender has waited full epoch before calling modified function, to prevent flashloan attacks (for example take loan, depositAndStake, claim, unstake, return loan)\r\n    modifier epochPassedSinceStake() {\r\n        if (block.number - mostRecentStake[msg.sender] < BLOCKS_PER_EPOCH)\r\n            revert LessThanOneEpochSinceStake();\r\n        _;\r\n    }\r\n\r\n    modifier onlyTimelockManager() {\r\n        if (msg.sender != timelockManager) revert NotTimelockManager();\r\n        _;\r\n    }\r\n\r\n\t// @notice guarantees caller is admin in latest-deployed EnshroudProtocol\r\n\tmodifier onlyAdmin() {\r\n        if (!iProtocol.adminStatus(msg.sender)) revert NotAdmin();\r\n\t\t_;\r\n\t}\r\n\r\n    /*///////////////////////////////////////////////////////////////\r\n                            FUNCTIONS\r\n    //////////////////////////////////////////////////////////////*/\r\n\r\n    /// @param _enshroudProtocol Enshroud protocol contract address\r\n    /// @param _enshroudTokenAddress $ENSHROUD token contract address\r\n    constructor(\r\n        address _enshroudProtocol,\r\n        address _enshroudTokenAddress\r\n    ) payable {\r\n        enshroudToken = _enshroudTokenAddress;\r\n\t\tenshroudProtocol = _enshroudProtocol;\r\n        iProtocol = IEnshroudProtocol_DAOPool(_enshroudProtocol);\r\n        genesisBlock = block.number;\r\n        // Initialise the share amount and stake at 1\r\n        totalStake = 1;\r\n        _updateCheckpointArray(poolShares, 1);\r\n    }\r\n\r\n    /// @notice allow this contract to receive ETH, needed for fees earned from protocol contract and feesBot\r\n    receive() external payable {}\r\n\r\n    /// @notice admin may set or update the address of the timelock manager contract.\r\n    /// @param _timelockManagerAddress timelock manager contract address\r\n    function setTimelockManager(\r\n\t\taddress _timelockManagerAddress\r\n\t) external onlyAdmin {\r\n        timelockManager = _timelockManagerAddress;\r\n    }\r\n\r\n\t/// @notice may set or update 'feesBot' with a new address\r\n\t/// @param _newFeesBot address of bot's EOA which imports fees earned on other chains\r\n\tfunction updateFeesBot(address _newFeesBot) external onlyAdmin {\r\n\t\tbytes8 _caller = bytes8(uint64(uint160(msg.sender)));\r\n\t\tif (_isRequestApproved(_newFeesBot, _caller, ApprovalTypes.FeeBot)) {\r\n\t\t\t// only update if three admins have requested, to thwart a single malicious admin\r\n\t\t\tfeesBot = _newFeesBot;\r\n\r\n\t\t\t// reset after variable update\r\n\t\t\tdelete updateRequested[_newFeesBot];\r\n\t\t}\r\n\t}\r\n\r\n\t/// @notice admin may update 'iProtocol' with a new protocol address (v2, v3, etc.)\r\n\t/// @param _newProtocol new EnshroudProtocol contract address\r\n\tfunction updateProtocol(address _newProtocol) external onlyAdmin {\r\n\t\tbytes8 _caller = bytes8(uint64(uint160(msg.sender)));\r\n\t\tif (_isRequestApproved(_newProtocol, _caller, ApprovalTypes.Protocol)) {\r\n\t\t\t// only update if three admins have requested, to thwart a single malicious admin attempting to hijack withdrawn earnings\r\n\t\t\tenshroudProtocol = _newProtocol;\r\n\t\t\tiProtocol = IEnshroudProtocol_DAOPool(_newProtocol);\r\n\r\n\t\t\t// reset after variable update\r\n\t\t\tdelete updateRequested[_newProtocol];\r\n\t\t}\r\n\t}\r\n\r\n    /// @notice called internally to update a checkpoint array by pushing a new checkpoint\r\n    /// @dev assumes `block.number` will always fit in a uint32 (as this contract is only to be deployed on ETH mainnet) and `value` will always fit in a uint224. `value` will either be a raw token amount\r\n    /// or a raw pool share amount so this assumption will be correct in practice with a token with 18 decimals and no overwhelming single-address centralisation.\r\n    /// @param _checkpointArray checkpoint array\r\n    /// @param _value value to be used to create the new checkpoint\r\n    function _updateCheckpointArray(\r\n        Checkpoint[] storage _checkpointArray,\r\n        uint256 _value\r\n    ) internal {\r\n        if (_value > type(uint224).max) revert GreaterThanMaxValue();\r\n        _checkpointArray.push(\r\n            Checkpoint({\r\n                fromBlock: uint32(block.number),\r\n                value: uint224(_value)\r\n            })\r\n        );\r\n    }\r\n\r\n    /// @notice called internally to update an address-checkpoint array by pushing a new checkpoint\r\n    /// @dev assumes block.number will always fit in a uint32, as this contract is only to be deployed on ETH mainnet\r\n    /// @param addressCheckpointArray address-checkpoint array\r\n    /// @param _addr address to be used to create the new checkpoint\r\n    function _updateAddressCheckpointArray(\r\n        AddressCheckpoint[] storage addressCheckpointArray,\r\n        address _addr\r\n    ) internal {\r\n        addressCheckpointArray.push(\r\n            AddressCheckpoint({\r\n                fromBlock: uint32(block.number),\r\n                _address: _addr\r\n            })\r\n        );\r\n    }\r\n\r\n\t/// @notice for variable updates that require update requests from three unique admins\r\n\t/// @param _reqAddr the address passed as the new protocol address\r\n\t/// @param _caller shortened form of the address of the calling admin\r\n\t/// @param _reqType: disambiguation for type of update call\r\n\tfunction _isRequestApproved(\r\n\t\taddress _reqAddr,\r\n\t\tbytes8 _caller,\r\n\t\tApprovalTypes _reqType\r\n\t) internal returns (bool) {\r\n\t\tbytes8 _default;\r\n\r\n\t\tif (updateRequested[_reqAddr].requester1 == _default) {\r\n\t\t\tupdateRequested[_reqAddr].requester1 = _caller;\r\n\t\t\tupdateRequested[_reqAddr].requestType = _reqType;\r\n\t\t} else if (\r\n\t\t\tupdateRequested[_reqAddr].requester1 != _default &&\r\n\t\t\tupdateRequested[_reqAddr].requester2 == _default &&\r\n\t\t\t_caller != updateRequested[_reqAddr].requester1 &&\r\n\t\t\t_reqType == updateRequested[_reqAddr].requestType\r\n\t\t) updateRequested[_reqAddr].requester2 = _caller;\r\n\t\telse if (\r\n\t\t\tupdateRequested[_reqAddr].requester1 != _default &&\r\n\t\t\tupdateRequested[_reqAddr].requester2 != _default &&\r\n\t\t\t_caller != updateRequested[_reqAddr].requester1 &&\r\n\t\t\t_caller != updateRequested[_reqAddr].requester2 &&\r\n\t\t\t_reqType == updateRequested[_reqAddr].requestType\r\n\t\t) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n    /// @dev SolDAO gas-efficient multiplication and division function, see https://github.com/Sol-DAO/solbase/blob/main/src/utils/FixedPointMath.sol\r\n    /// @param x: numerator, to be multiplied by 'y'\r\n    /// @param y: numerator, to be multiplied by 'x'\r\n    /// @param denominator: divisor for the product of 'x' and 'y'\r\n    function _mulDivDown(\r\n        uint256 x,\r\n        uint256 y,\r\n        uint256 denominator\r\n    ) internal pure returns (uint256 z) {\r\n        /// @solidity memory-safe-assembly\r\n        assembly {\r\n            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))\r\n            if iszero(\r\n                mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))\r\n            ) {\r\n                // Store the function selector of `MulDivFailed()`.\r\n                mstore(0x00, 0xad251c27)\r\n                // Revert with (offset, size).\r\n                revert(0x1c, 0x04)\r\n            }\r\n\r\n            // Divide x * y by the denominator.\r\n            z := div(mul(x, y), denominator)\r\n        }\r\n    }\r\n}\r\n\r\n/// @title Contract that implements getters\r\nabstract contract GetterUtils is StateUtils {\r\n    /// @notice Called to get the voting power of a user at a specific block\r\n    /// @param _userAddress User address\r\n    /// @param _block Block number for which the query is being made for\r\n    /// @return Voting power of the user at the block\r\n    function userVotingPowerAt(\r\n        address _userAddress,\r\n        uint256 _block\r\n    ) external view returns (uint256) {\r\n        // Users that have a delegate have no voting power\r\n        if (userDelegateAt(_userAddress, _block) != address(0)) {\r\n            return 0;\r\n        }\r\n        return\r\n            userSharesAt(_userAddress, _block) +\r\n            \tdelegatedToUserAt(_userAddress, _block);\r\n    }\r\n\r\n    /// @notice Called to get the total pool shares at a specific block\r\n    /// @dev Total pool shares also corresponds to total voting power\r\n    /// @param _block Block number for which the query is being made for\r\n    /// @return Total pool shares at the block\r\n    function totalSharesAt(uint256 _block) public view returns (uint256) {\r\n        return _getValueAt(poolShares, _block);\r\n    }\r\n\r\n    /// @notice Called to get the pool shares of a user at a specific block\r\n    /// @param userAddress User address\r\n    /// @param _block Block number for which the query is being made for\r\n    /// @return Pool shares of the user at the block\r\n    function userSharesAt(\r\n        address userAddress,\r\n        uint256 _block\r\n    ) public view returns (uint256) {\r\n        return _getValueAt(users[userAddress].shares, _block);\r\n    }\r\n\r\n    /// @notice Called to get the current staked tokens of the user\r\n    /// @dev any DAO voting app should call here to ensure a voter's stake and calculate weighting of vote\r\n    /// @param _userAddress User address\r\n    /// @return Current staked tokens of the user\r\n    function userStake(address _userAddress) public view returns (uint256) {\r\n        return\r\n            _mulDivDown(\r\n                userSharesAt(_userAddress, block.number),\r\n                totalStake,\r\n                totalSharesAt(block.number)\r\n            );\r\n    }\r\n\r\n    /// @notice Called to get the voting power delegated to a user at a specific block\r\n    /// @param _userAddress User address\r\n    /// @param _block Block number for which the query is being made for\r\n    /// @return Voting power delegated to the user at the block\r\n    function delegatedToUserAt(\r\n        address _userAddress,\r\n        uint256 _block\r\n    ) public view returns (uint256) {\r\n        return _getValueAt(users[_userAddress].delegatedTo, _block);\r\n    }\r\n\r\n    /// @notice Called to get the delegate of the user at a specific block\r\n    /// @param _userAddress User address\r\n    /// @param _block Block number\r\n    /// @return Delegate of the user at the specific block\r\n    function userDelegateAt(\r\n        address _userAddress,\r\n        uint256 _block\r\n    ) public view returns (address) {\r\n        return _getAddressAt(users[_userAddress].delegates, _block);\r\n    }\r\n\r\n    /// @notice Called to get the current delegate of the user\r\n    /// @param _userAddress User address\r\n    /// @return Current delegate of the user\r\n    function userDelegate(address _userAddress) public view returns (address) {\r\n        return userDelegateAt(_userAddress, block.number);\r\n    }\r\n\r\n    /// @notice Called to get the value of a checkpoint array at a specific block using binary search.\r\n    /// @dev Adapted from https://github.com/aragon/minime/blob/1d5251fc88eee5024ff318d95bc9f4c5de130430/contracts/MiniMeToken.sol#L431\r\n    /// @param checkpoints Checkpoints array\r\n    /// @param _block block number for which the query is being made\r\n    /// @return Value of the checkpoint array at the block\r\n    function _getValueAt(\r\n        Checkpoint[] storage checkpoints,\r\n        uint256 _block\r\n    ) internal view returns (uint256) {\r\n        if (checkpoints.length == 0) return 0;\r\n\r\n        // Shortcut for the actual value\r\n        if (_block >= checkpoints[checkpoints.length - 1].fromBlock)\r\n            return checkpoints[checkpoints.length - 1].value;\r\n        if (_block < checkpoints[0].fromBlock) return 0;\r\n\r\n        // Limit the search to the last 1024 elements if the value being\r\n        // searched falls within that window\r\n        uint256 _min = 0;\r\n        if (\r\n            checkpoints.length > 1024 &&\r\n            checkpoints[checkpoints.length - 1024].fromBlock < _block\r\n        ) {\r\n            _min = checkpoints.length - 1024;\r\n        }\r\n\r\n        // Binary search of the value in the array\r\n        uint256 _max = checkpoints.length - 1;\r\n        while (_max > _min) {\r\n            uint256 _mid = (_max + _min + 1) / 2;\r\n            if (checkpoints[_mid].fromBlock <= _block) {\r\n                _min = _mid;\r\n            } else {\r\n                _max = _mid - 1;\r\n            }\r\n        }\r\n        return checkpoints[_min].value;\r\n    }\r\n\r\n    /// @notice Called to get the value of an address-checkpoint array at a specific block using binary search\r\n    /// @dev Adapted from https://github.com/aragon/minime/blob/1d5251fc88eee5024ff318d95bc9f4c5de130430/contracts/MiniMeToken.sol#L431\r\n    /// @param checkpoints Address-checkpoint array\r\n    /// @param _block Block number for which the query is being made\r\n    /// @return Value of the address-checkpoint array at the block\r\n    function _getAddressAt(\r\n        AddressCheckpoint[] storage checkpoints,\r\n        uint256 _block\r\n    ) private view returns (address) {\r\n        if (checkpoints.length == 0) return address(0);\r\n\r\n        // Shortcut for the actual value\r\n        if (_block >= checkpoints[checkpoints.length - 1].fromBlock)\r\n            return checkpoints[checkpoints.length - 1]._address;\r\n        if (_block < checkpoints[0].fromBlock) return address(0);\r\n\r\n        // Limit the search to the last 1024 elements if the value being\r\n        // searched falls within that window\r\n        uint256 _min = 0;\r\n        if (\r\n            checkpoints.length > 1024 &&\r\n            checkpoints[checkpoints.length - 1024].fromBlock < _block\r\n        ) {\r\n            _min = checkpoints.length - 1024;\r\n        }\r\n\r\n        // Binary search of the value in the array\r\n        uint256 _max = checkpoints.length - 1;\r\n        while (_max > _min) {\r\n            uint256 _mid = (_max + _min + 1) / 2;\r\n            if (checkpoints[_mid].fromBlock <= _block) {\r\n                _min = _mid;\r\n            } else {\r\n                _max = _mid - 1;\r\n            }\r\n        }\r\n        return checkpoints[_min]._address;\r\n    }\r\n}\r\n\r\n/// @notice implements voting interface and voting power delegation\r\n/// @dev any DAO voting app/contract can call userVotingPowerAt() in GetterUtils with a voter's address for their voting power (including delegation)\r\nabstract contract VotingUtils is GetterUtils {\r\n    event Delegated(\r\n        address indexed user,\r\n        address indexed delegate,\r\n        uint256 shares,\r\n        uint256 totalDelegatedTo\r\n    );\r\n\r\n    event Undelegated(\r\n        address indexed user,\r\n        address indexed delegate,\r\n        uint256 shares,\r\n        uint256 totalDelegatedTo\r\n    );\r\n\r\n    event UpdatedDelegation(\r\n        address indexed user,\r\n        address indexed delegate,\r\n        bool delta,\r\n        uint256 shares,\r\n        uint256 totalDelegatedTo\r\n    );\r\n\r\n    /// @notice Called by the user to delegate voting power\r\n    /// @param _delegate User address the voting power will be delegated to\r\n    function delegateVotingPower(address _delegate) external {\r\n        if (_delegate == address(0) || _delegate == msg.sender)\r\n            revert InvalidDelegate();\r\n        // verifying that the delegate is not currently delegating. However, the delegate may further delegate after they have been delegated to.\r\n        if (userDelegate(_delegate) != address(0)) revert AlreadyDelegated();\r\n        User storage user = users[msg.sender];\r\n        // prohibit frequent delegation updates as that can be used to spam proposals; will not overflow on human timelines\r\n        unchecked {\r\n            if (\r\n                user.lastDelegationUpdateTimestamp + EPOCH_LENGTH >=\r\n                block.timestamp\r\n            ) revert DelegateUpdatedTooRecently();\r\n            user.lastDelegationUpdateTimestamp = block.timestamp;\r\n        }\r\n\r\n        uint256 userShares = userSharesAt(msg.sender, block.number);\r\n        if (userShares == 0) revert NoShares();\r\n\r\n        address _previousDelegate = userDelegate(msg.sender);\r\n        if (_previousDelegate == _delegate) revert AlreadyDelegated();\r\n        if (_previousDelegate != address(0)) {\r\n            // revoke previous delegation\r\n            _updateCheckpointArray(\r\n                users[_previousDelegate].delegatedTo,\r\n                delegatedToUserAt(_previousDelegate, block.number) - userShares\r\n            );\r\n        }\r\n\r\n        // assign the new delegation\r\n        uint256 delegatedToUpdate = delegatedToUserAt(_delegate, block.number) +\r\n            userShares;\r\n        _updateCheckpointArray(users[_delegate].delegatedTo, delegatedToUpdate);\r\n\r\n        // record the new delegate for the user\r\n        _updateAddressCheckpointArray(user.delegates, _delegate);\r\n        emit Delegated(msg.sender, _delegate, userShares, delegatedToUpdate);\r\n    }\r\n\r\n    /// @notice called by the user to fully undelegate voting power\r\n    function undelegateVotingPower() external {\r\n        User storage user = users[msg.sender];\r\n        address _previousDelegate = userDelegate(msg.sender);\r\n        if (_previousDelegate == address(0)) revert NotDelegated();\r\n        // will not overflow on human timelines\r\n        unchecked {\r\n            if (\r\n                user.lastDelegationUpdateTimestamp + EPOCH_LENGTH >=\r\n                block.timestamp\r\n            ) revert DelegateUpdatedTooRecently();\r\n            user.lastDelegationUpdateTimestamp = block.timestamp;\r\n        }\r\n\r\n        uint256 _userShares = userSharesAt(msg.sender, block.number);\r\n        uint256 _delegatedToUpdate = delegatedToUserAt(\r\n            _previousDelegate,\r\n            block.number\r\n        ) - _userShares;\r\n        _updateCheckpointArray(\r\n            users[_previousDelegate].delegatedTo,\r\n            _delegatedToUpdate\r\n        );\r\n        _updateAddressCheckpointArray(user.delegates, address(0));\r\n        emit Undelegated(\r\n            msg.sender,\r\n            _previousDelegate,\r\n            _userShares,\r\n            _delegatedToUpdate\r\n        );\r\n    }\r\n\r\n    /// @notice called internally when the user shares are updated to update the delegated voting power\r\n    /// @dev user shares only get updated while staking or scheduling unstaking\r\n    /// @param _shares Amount of shares that will be added/removed\r\n    /// @param _change Whether the shares will be added/removed (true = add, false = remove)\r\n    function _updateDelegatedVotingPower(\r\n        uint256 _shares,\r\n        bool _change\r\n    ) internal {\r\n        address _delegate = userDelegate(msg.sender);\r\n        if (_delegate == address(0)) {\r\n            return;\r\n        }\r\n        uint256 _currentDelegatedTo = delegatedToUserAt(\r\n            _delegate,\r\n            block.number\r\n        );\r\n        uint256 _delegatedToUpdate = _change\r\n            ? _currentDelegatedTo + _shares\r\n            : _currentDelegatedTo - _shares;\r\n        _updateCheckpointArray(\r\n            users[_delegate].delegatedTo,\r\n            _delegatedToUpdate\r\n        );\r\n        emit UpdatedDelegation(\r\n            msg.sender,\r\n            _delegate,\r\n            _change,\r\n            _shares,\r\n            _delegatedToUpdate\r\n        );\r\n    }\r\n}\r\n\r\n/// @notice implements transferring (deposit/withdraw) functionality\r\nabstract contract TransferUtils is VotingUtils {\r\n    using SafeTransferLib for address;\r\n\r\n    event Deposited(address indexed user, uint256 amount, uint256 userUnstaked);\r\n\r\n    event Withdrawn(address indexed user, uint256 amount, uint256 userUnstaked);\r\n\r\n\tevent ImportFeeRevenue(uint256 chainId, address tokenContract, uint256 amount);\r\n\r\n    /// @param _amount: amount of tokens deposited, 18 decimals\r\n    /// @param _deadline: deadline for permit approval usage\r\n    /// @param v: ECDSA sig param\r\n    /// @param r: ECDSA sig param\r\n    /// @param s: ECDSA sig param\r\n    function depositWithPermit(\r\n        uint256 _amount,\r\n        uint256 _deadline,\r\n        uint8 v,\r\n        bytes32 r,\r\n        bytes32 s\r\n    ) external nonReentrant {\r\n        IERC20_DAOPool(enshroudToken).permit(\r\n            msg.sender,\r\n            address(this),\r\n            _amount,\r\n            _deadline,\r\n            v,\r\n            r,\r\n            s\r\n        );\r\n\r\n        // cannot overflow, users[msg.sender].deposited would have to be larger than type(uint256).max after the successful transferFrom\r\n        unchecked {\r\n            users[msg.sender].deposited += _amount;\r\n\t\t\tdepositedUnstaked += _amount;\r\n        }\r\n        // will revert if unsuccessful so no need for an earlier balanceOf check\r\n        enshroudToken.safeTransferFrom(msg.sender, address(this), _amount);\r\n\r\n        emit Deposited(msg.sender, _amount, users[msg.sender].deposited);\r\n    }\r\n\r\n\t/// @notice called by the feesBot to import fees earned by the DAOPool mirror contracts on other blockchains, to where they can be claimed by staking users\r\n\t/// @dev it is required that the feesBot execute prior approvals for xfers\r\n\t/// @dev ETH can be deposited by itself by passing 0-length arrays with a positive msg.value\r\n\t/// @param _chainId: the ID of the chain from which the fees are imported\r\n\t/// @param _tokenContracts: list of erc20 tokens being deposited\r\n\t/// @param _amounts: corresponding amounts for each token contract\r\n\tfunction importFees(\r\n\t\tuint256 _chainId,\r\n        address[] calldata _tokenContracts,\r\n\t\tuint256[] calldata _amounts\r\n\t) external payable nonReentrant {\r\n\t\t// only callable by the fees bot\r\n\t\tif (msg.sender != feesBot) revert OnlyFeesBot();\r\n\t\tif (_tokenContracts.length != _amounts.length) revert LengthMismatch();\r\n\t\tif (_tokenContracts.length > ARRAY_LIMIT) revert DAOPool_ArrayTooLong();\r\n\t\t// verify it's indeed an import\r\n\t\tif (_chainId == block.chainid) revert InvalidChainId();\r\n\r\n\t\t// for each token, transfer the indicated amount from feesBot to here\r\n        address _zero = address(0);\r\n\t\taddress daoPool = address(this);\r\n        for (uint256 i = 0; i < _tokenContracts.length; ) {\r\n            address _addr = _tokenContracts[i];\r\n\t\t\tif (_addr == _zero) revert ZeroAddress();\r\n\t\t\tuint256 _amt = _amounts[i];\r\n\t\t\tif (_amt > 0) {\r\n\t\t\t\t// allow for possibility token has fee or is deflationary\r\n\t\t\t\tuint256 _ourBalanceBefore = IERC20_DAOPool(_addr).balanceOf(daoPool);\r\n\t\t\t\t/// @dev safeTransferFrom will revert on failure (for example if lacking proper permit or approve() from feesBot)\r\n\t\t\t\t_addr.safeTransferFrom(feesBot, daoPool, _amt);\r\n\t\t\t\tuint256 _ourBalanceAfter = IERC20_DAOPool(_addr).balanceOf(daoPool);\r\n\t\t\t\trequire(_ourBalanceAfter >= _ourBalanceBefore);\r\n\t\t\t\tuint256 _netAmt = _ourBalanceAfter - _ourBalanceBefore;\r\n\t\t\t\temit ImportFeeRevenue(_chainId, _addr, _netAmt);\r\n\t\t\t}\r\n\t\t\tunchecked {\r\n\t\t\t\t++i;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// if any native tokens provided with message, log it\r\n\t\tif (msg.value > 0) {\r\n\t\t\temit ImportFeeRevenue(_chainId, _zero, msg.value);\r\n\t\t}\r\n\t}\r\n\r\n    /// @notice Called by the user to deposit tokens to this contract. Will be a separate call to stake.\r\n    /// @dev The user should approve the pool to spend at least `_amount` tokens before calling this.\r\n    /// Public visibility as this is called by depositAndStake()\r\n    /// @param _amount Amount to be deposited\r\n    function depositRegular(uint256 _amount) public nonReentrant {\r\n        enshroudToken.safeTransferFrom(msg.sender, address(this), _amount); // will revert if unsuccessful so no need for an earlier balanceOf check\r\n\t\t// cannot overflow, users[msg.sender].deposited would have to be larger than type(uint256).max after the successful transferFrom\r\n        unchecked {\r\n            users[msg.sender].deposited += _amount;\r\n\t\t\tdepositedUnstaked += _amount;\r\n        }\r\n        emit Deposited(msg.sender, _amount, users[msg.sender].deposited);\r\n    }\r\n\r\n    /// @notice called by the user to withdraw tokens to their wallet\r\n    /// @dev The user should ensure that they have at least `_amount` unlocked tokens to withdraw.\r\n\t/// @dev user can call updateTimelockStatus(msg.sender) before this to move any now-unlocked tokens into their deposited balance\r\n    /// named `withdrawRegular()` to be consistent with the name 'depositRegular()`. See `depositRegular()` for more context.\r\n    /// @param _amount: amount to be withdrawn\r\n    function withdrawRegular(uint256 _amount) public {\r\n        _withdraw(_amount, msg.sender);\r\n    }\r\n\r\n\r\n    /// @notice called internally after the amount of locked tokens of the user is determined\r\n\t/// @dev user should call updateTimelockStatus(_recipient) before this to move any now-unlocked tokens into their deposited balance\r\n    /// @param _amount: amount to be withdrawn\r\n    /// @param _recipient: address receiving withdrawal\r\n    function _withdraw(uint256 _amount, address _recipient) private {\r\n        User storage user = users[_recipient];\r\n        // ensure amount to be withdrawn does not exceed the user's unlocked deposited amount\r\n\t\tif (user.deposited < _amount) revert AmountExceedsDeposited();\r\n        users[_recipient].deposited -= _amount;\r\n\t\tdepositedUnstaked -= _amount;\r\n\r\n        enshroudToken.safeTransfer(_recipient, _amount);\r\n\r\n        emit Withdrawn(_recipient, _amount, users[_recipient].deposited);\r\n    }\r\n}\r\n\r\n/// @notice implements staking functionality\r\nabstract contract StakeUtils is TransferUtils {\r\n    event Staked(\r\n        address indexed user,\r\n        uint256 amount,\r\n        uint256 mintedShares,\r\n        uint256 userUnstaked,\r\n        uint256 userShares,\r\n        uint256 totalShares,\r\n        uint256 totalStake\r\n    );\r\n\r\n    event ScheduledUnstake(\r\n        address indexed user,\r\n        uint256 amount,\r\n        uint256 shares,\r\n        uint256 scheduledFor,\r\n        uint256 userShares\r\n    );\r\n\r\n    event Unstaked(\r\n        address indexed user,\r\n        uint256 amount,\r\n        uint256 userUnstaked,\r\n        uint256 totalShares,\r\n        uint256 totalStake\r\n    );\r\n\r\n    /// @notice convenience method to deposit and stake in a single transaction\r\n    /// @param _amount: amount to be deposited and staked\r\n    function depositAndStake(uint256 _amount) external {\r\n        depositRegular(_amount);\r\n        stake(_amount, msg.sender);\r\n    }\r\n\r\n    /// @notice called by the user to schedule unstaking of their tokens\r\n    /// @dev While scheduling an unstake, `shares` get deducted from the user, meaning that they will not receive voting power or yield claim for them any longer.\r\n    /// At unstaking-time, the user unstakes either the amount of tokens scheduled to unstake, or the amount of tokens `shares` corresponds to at such time, whichever is smaller.\r\n    /// @param _amount Amount of tokens scheduled to unstake\r\n    function scheduleUnstake(uint256 _amount) external {\r\n        uint256 _userSharesNow = userSharesAt(msg.sender, block.number);\r\n        uint256 _totalSharesNow = totalSharesAt(block.number);\r\n        // ensures '_amount' does not exceed user's actual shares\r\n        if (_mulDivDown(_userSharesNow, totalStake, _totalSharesNow) < _amount)\r\n            revert AmountExceedsStaked();\r\n\r\n        User storage user = users[msg.sender];\r\n        if (user.unstakeScheduledFor != 0) revert ExistingUnstake();\r\n\r\n        uint256 _sharesToUnstake = _mulDivDown(\r\n            _amount,\r\n            _totalSharesNow,\r\n            totalStake\r\n        );\r\n        uint256 _userSharesUpdate = _userSharesNow - _sharesToUnstake;\r\n\r\n        // if the user wants to schedule an unstake for a few Wei\r\n        if (_sharesToUnstake == 0) revert NoShares();\r\n        // will not overflow on human timelines\r\n        unchecked {\r\n            users[msg.sender].unstakeScheduledFor =\r\n                block.timestamp + EPOCH_LENGTH;\r\n        }\r\n        users[msg.sender].unstakeAmount = _amount;\r\n        users[msg.sender].unstakeShares = _sharesToUnstake;\r\n\r\n        _updateCheckpointArray(user.shares, _userSharesUpdate);\r\n        _updateDelegatedVotingPower(_sharesToUnstake, false);\r\n        emit ScheduledUnstake(\r\n            msg.sender,\r\n            _amount,\r\n            _sharesToUnstake,\r\n            users[msg.sender].unstakeScheduledFor,\r\n            _userSharesUpdate\r\n        );\r\n    }\r\n\r\n    /// @notice convenience method to execute an unstake and withdraw to the user's wallet in a single transaction\r\n    /// @dev withdrawal will revert if the user has less than `unstakeAmount` tokens that are withdrawable\r\n    function unstakeAndWithdraw() external {\r\n        withdrawRegular(unstake(msg.sender));\r\n    }\r\n\r\n    /// @notice called to stake tokens (from user's deposited amount) to receive shares in the pool\r\n    /// @param _amount: amount of tokens to stake\r\n    /// @param _staker: address staking _amount (msg.sender if calling directly, or the address which called 'depositAndStake()')\r\n    function stake(uint256 _amount, address _staker) public nonReentrant {\r\n\t\tif (_staker != msg.sender) revert NotDepositOwner();\r\n        User storage user = users[_staker];\r\n        if (_amount > user.deposited) revert AmountExceedsDeposited();\r\n        uint256 _totalSharesNow = totalSharesAt(block.number);\r\n        uint256 _sharesToMint = _mulDivDown(\r\n            _amount,\r\n            _totalSharesNow,\r\n            totalStake\r\n        );\r\n        uint256 _userSharesUpdate = userSharesAt(_staker, block.number) +\r\n            _sharesToMint;\r\n        uint256 _totalSharesUpdate = _totalSharesNow + _sharesToMint;\r\n\r\n        users[_staker].deposited -= _amount;\r\n\t\tdepositedUnstaked -= _amount;\r\n        totalStake += _amount;\r\n        mostRecentStake[_staker] = block.number;\r\n\r\n        _updateCheckpointArray(user.shares, _userSharesUpdate);\r\n        _updateCheckpointArray(poolShares, _totalSharesUpdate);\r\n        _updateDelegatedVotingPower(_sharesToMint, true);\r\n\r\n        emit Staked(\r\n            _staker,\r\n            _amount,\r\n            _sharesToMint,\r\n            users[_staker].deposited,\r\n            _userSharesUpdate,\r\n            _totalSharesUpdate,\r\n            totalStake\r\n        );\r\n    }\r\n\r\n    /// @notice called to execute a pre-scheduled unstake; unstaked tokens will become 'deposited'\r\n    /// @dev anyone can execute a matured unstake. This is to allow the user to use bots, etc. to execute their unstaking as soon as possible.\r\n    /// @param _userAddress: user address\r\n    /// @return amount of tokens that are unstaked\r\n    function unstake(address _userAddress) public returns (uint256) {\r\n        User storage user = users[_userAddress];\r\n        if (\r\n            user.unstakeScheduledFor == 0 ||\r\n            user.unstakeScheduledFor > block.timestamp\r\n        ) revert UnstakeNotAvailable();\r\n        uint256 _totalShares = totalSharesAt(block.number);\r\n        uint256 _unstakeAmount = user.unstakeAmount;\r\n        uint256 _unstakeAmountByShares = _mulDivDown(\r\n            user.unstakeShares,\r\n            totalStake,\r\n            _totalShares\r\n        );\r\n        if (_unstakeAmount > _unstakeAmountByShares) {\r\n            _unstakeAmount = _unstakeAmountByShares;\r\n        }\r\n        uint256 _totalSharesUpdate = _totalShares - user.unstakeShares;\r\n\r\n        users[_userAddress].deposited += _unstakeAmount;\r\n\t\tdepositedUnstaked += _unstakeAmount;\r\n        totalStake -= _unstakeAmount;\r\n        delete users[_userAddress].unstakeAmount;\r\n        delete users[_userAddress].unstakeShares;\r\n        delete users[_userAddress].unstakeScheduledFor;\r\n\r\n        _updateCheckpointArray(poolShares, _totalSharesUpdate);\r\n\r\n        emit Unstaked(\r\n            _userAddress,\r\n            _unstakeAmount,\r\n            users[_userAddress].deposited,\r\n            _totalSharesUpdate,\r\n            totalStake\r\n        );\r\n        return _unstakeAmount;\r\n    }\r\n}\r\n\r\n/// @notice implements unlocking functionality\r\n/// @dev The TimelockManager contract interfaces with this contract to transfer $ENSHROUD tokens that are locked under an unlocking schedule.\r\nabstract contract TimelockUtils is StakeUtils {\r\n    using SafeTransferLib for address;\r\n\r\n    event DepositedByTimelockManager(\r\n        address indexed user,\r\n        uint256 amount,\r\n        uint256 userUnstaked\r\n    );\r\n\r\n    event DepositedUnlocking(\r\n        address indexed user,\r\n        uint256 amount,\r\n        uint128 start,\r\n        uint128 end\r\n    );\r\n\r\n    event UpdatedTimelock(\r\n        address indexed user,\r\n        uint256 amount,\r\n        uint256 userUnlocking\r\n    );\r\n\r\n    struct Timelock {\r\n        // total amount of tokens subject to lock\r\n        uint256 totalAmount;\r\n        // amount still locked\r\n        uint256 remainingAmount;\r\n        // block number of unlock schedule start\r\n        uint128 releaseStart;\r\n        // block number of unlock schedule end\r\n        uint128 releaseEnd;\r\n    }\r\n\r\n    /// @notice maps user addresses to timelocks (user can only have one Timelock at a time)\r\n    mapping(address => Timelock) public userToTimelock;\r\n\r\n    /// @notice called by the TimelockManager contract to deposit unlocked withdrawable tokens on behalf of a user\r\n    /// @dev this method is only usable by `TimelockManager.sol`.\r\n    /// @param _source Token transfer source\r\n    /// @param _userAddress User that the tokens will be deposited for\r\n    /// @param _amount Amount to be deposited\r\n    function deposit(\r\n        address _source,\r\n        address _userAddress,\r\n        uint256 _amount\r\n    ) external onlyTimelockManager {\r\n        uint256 _unstakedUpdate = users[_userAddress].deposited + _amount;\r\n\r\n        users[_userAddress].deposited = _unstakedUpdate;\r\n\t\tdepositedUnstaked += _amount;\r\n\r\n        enshroudToken.safeTransferFrom(_source, address(this), _amount);\r\n\r\n        emit DepositedByTimelockManager(_userAddress, _amount, _unstakedUpdate);\r\n    }\r\n\r\n    /// @notice Called by the TimelockManager contract to deposit locked, non-withdrawable tokens on behalf of a user on a linear unlock schedule\r\n\t/// @dev to protect locked tokens from getting distributed as rewards, the depositedUnstaked total is incremented\r\n\t/// @dev locked tokens cannot be staked, but can be unlocked and become deposited (see updateTimelockStatus())\r\n    /// @param _source token source address (Timelock Manager)\r\n    /// @param _userAddress Address of the user who will receive the tokens\r\n    /// @param _amount Token amount\r\n    /// @param _releaseStart unlocking schedule starting block\r\n    /// @param _releaseEnd unlocking schedule ending block\r\n    function depositWithLocking(\r\n        address _source,\r\n        address _userAddress,\r\n        uint256 _amount,\r\n        uint128 _releaseStart,\r\n        uint128 _releaseEnd\r\n    ) external onlyTimelockManager {\r\n        if (userToTimelock[_userAddress].remainingAmount != 0)\r\n            revert DAOPool_ExistingTimelock();\r\n        if (_releaseEnd <= _releaseStart) revert DAOPool_StartMustPrecedeEnd();\r\n\t\t// establish Timelock in this contract for user\r\n        userToTimelock[_userAddress] = Timelock({\r\n            totalAmount: _amount,\r\n            remainingAmount: _amount,\r\n            releaseStart: _releaseStart,\r\n            releaseEnd: _releaseEnd\r\n        });\r\n\t\t// treat locked tokens as deposited, but not credited to User.deposited\r\n\t\tdepositedUnstaked += _amount;\r\n\r\n        enshroudToken.safeTransferFrom(_source, address(this), _amount);\r\n\r\n        emit DepositedUnlocking(\r\n            _userAddress,\r\n            _amount,\r\n            _releaseStart,\r\n            _releaseEnd\r\n        );\r\n    }\r\n\r\n    /// @notice Called to release tokens locked by the timelock and update state\r\n    /// @dev must be called in order to update a timelock user's 'deposited' amount -- it initialises at 0 regardless of the timelock's _releaseStart\r\n    /// @param _userAddress Address of the user whose timelock status will be updated\r\n    function updateTimelockStatus(address _userAddress) external {\r\n        Timelock storage timelock = userToTimelock[_userAddress];\r\n        uint256 _start = uint256(timelock.releaseStart);\r\n        uint256 _end = uint256(timelock.releaseEnd);\r\n        if (block.number <= _start) revert DAOPool_ReleaseNotStarted();\r\n\r\n        // if the timelock is complete and has already been updated previously\r\n        if (timelock.remainingAmount == 0) revert DAOPool_ReleaseEnded();\r\n\r\n        uint256 _totalUnlocked;\r\n        if (block.number >= _end) {\r\n            _totalUnlocked = timelock.totalAmount;\r\n        } else {\r\n            uint256 passedTime = block.number - _start;\r\n            uint256 totalTime = _end - _start;\r\n            _totalUnlocked = _mulDivDown(\r\n                timelock.totalAmount,\r\n                passedTime,\r\n                totalTime\r\n            );\r\n        }\r\n\r\n        uint256 _newlyUnlocked = _totalUnlocked -\r\n            (timelock.totalAmount - timelock.remainingAmount);\r\n        // newly unlocked tokens are added to user's deposited amount and deducted from the remainingAmount member of the timelock struct\r\n        users[_userAddress].deposited += _newlyUnlocked;\r\n        userToTimelock[_userAddress].remainingAmount -= _newlyUnlocked;\r\n\r\n        emit UpdatedTimelock(\r\n            _userAddress,\r\n            _newlyUnlocked,\r\n            userToTimelock[_userAddress].remainingAmount\r\n        );\r\n    }\r\n}\r\n\r\n/// @title DAO pool contract\r\n/// @notice Users can stake $ENSHROUD tokens at the pool contract to be granted shares. These shares give the user voting power at the DAO and ability to claim pro-rata in-kind protocol yield.\r\n/// @dev functionalities are distributed to a chain of inheritance:\r\n/// (1) DAOPool.sol\r\n/// (2) TimelockUtils.sol\r\n/// (3) StakeUtils.sol\r\n/// (4) TransferUtils.sol\r\n/// (5) VotingUtils.sol\r\n/// (6) GetterUtils.sol\r\n/// (7) StateUtils.sol\r\ncontract DAOPool is TimelockUtils {\r\n    using SafeTransferLib for address;\r\n\r\n    /// @param _enshroudProtocol: Enshroud protocol contract address\r\n    /// @param _enshroudTokenAddress: $ENSHROUD token contract address\r\n    constructor(\r\n        address _enshroudProtocol,\r\n        address _enshroudTokenAddress\r\n    ) payable StateUtils(_enshroudProtocol, _enshroudTokenAddress) {}\r\n\r\n    /// @notice for a DAO staker to claim their pro rata yields as of block.number. ETH is paid out regardless of token contracts supplied by caller once per epoch.\r\n    /// smaller stakers have the option to time their claims (for epochs in which there are large amounts in this contract, or at least as much yield as the gas expenditure to claim)\r\n    /// @dev claimed mapping is checked for each address and address(0) for ETH every call and userStake (as a ratio of totalStake) is calculated as of block.number; epochPassedSinceStake modifier protects against flash loan + stake + claim\r\n    /// @param _tokenContracts array of token contract addresses which msg.sender seeks to claim in this epoch. Null address not permitted as an input as it used for the ETH claimed mapping.\r\n    function claimYield(\r\n        address[] memory _tokenContracts\r\n    ) external nonReentrant epochPassedSinceStake {\r\n        if (_tokenContracts.length > ARRAY_LIMIT) revert DAOPool_ArrayTooLong();\r\n\r\n        // calculate userStake as of block.number\r\n        uint256 _userStake = userStake(msg.sender);\r\n        if (_userStake == 0) revert NoShares(); // ensure msg.sender has share to claim\r\n        address _zero = address(0);\r\n\r\n\t\t// process all contracts for which user wants to claim their earnings\r\n        for (uint256 i = 0; i < _tokenContracts.length; ) {\r\n            address _addr = _tokenContracts[i];\r\n            if (_addr == _zero) revert ZeroAddress();\r\n            if (BLOCKS_PER_EPOCH > (block.number - claimed[msg.sender][_addr]))\r\n                revert AlreadyClaimedThisEpoch();\r\n\r\n            uint256 _claim;\r\n\r\n            // calculate % claim by the ratio of msg.sender's staked amount to total stake, multiplied by the balanceOf each token in the DAOPool\r\n            if (_addr == enshroudToken) {\r\n\t\t\t\t// if user is claiming $ENSHROUD tokens, must subtract the staked amount and the deposited unstaked amount from the balance to get the claimable amount\r\n                _claim = _mulDivDown(\r\n                    _userStake,\r\n                    IERC20_DAOPool(_addr).balanceOf(address(this))\r\n\t\t\t\t\t\t- totalStake - depositedUnstaked,\r\n                    totalStake\r\n                );\r\n            } else {\r\n                _claim = _mulDivDown(\r\n                    _userStake,\r\n                    IERC20_DAOPool(_addr).balanceOf(address(this)),\r\n                    totalStake\r\n                );\r\n            }\r\n            if (_claim != 0) {\r\n                claimed[msg.sender][_addr] = block.number; // update claimed mapping for this asset\r\n                _addr.safeTransfer(msg.sender, _claim); // transfer tokens to msg.sender if there's a claimable balance\r\n            }\r\n            unchecked {\r\n                ++i; // interate loop, cannot overflow without hitting gas limit\r\n            }\r\n        }\r\n\r\n        // only auto-claim ETH once per epoch regardless of tokenContract inputs. Use null address since it is impermissible as an input.\r\n        // calculate ETH claim and transfer ETH to msg.sender if > 0 and at least an epoch has passed since last claim, otherwise ignore via else{}\r\n        if (BLOCKS_PER_EPOCH < (block.number - claimed[msg.sender][_zero])) {\r\n            uint256 _ethClaim = _mulDivDown(\r\n                _userStake,\r\n                address(this).balance,\r\n                totalStake\r\n            );\r\n            if (_ethClaim != 0) {\r\n                claimed[msg.sender][_zero] = block.number; // update claimed mapping for ETH\r\n                SafeTransferLib.safeTransferETH(msg.sender, _ethClaim);\r\n            }\r\n        } else {}\r\n    }\r\n\r\n    /// @notice for a staker to claim their pro rata token and ETH yields as deposits to the Enshroud Protocol contract\r\n    /// @dev epoch is checked/updated every call and userStake (as a ratio of totalStake) is calculated as of block.number; epochPassedSinceStake modifier protects against flash loan + stake + claim\r\n    /// msg.sender MUST APPROVE() THE ENSHROUD PROTOCOL CONTRACT ADDRESS IN EACH '_tokenContract' FOR THE APPLICABLE CLAIM AMOUNTS\r\n    /// @param _tokenContracts array of token contract addresses which msg.sender seeks to claim in this epoch. Null address not permitted as an input as it used for the ETH claimed mapping.\r\n    function claimTokenYieldAsENFTs(\r\n        address[] memory _tokenContracts\r\n    ) external nonReentrant epochPassedSinceStake {\r\n        if (_tokenContracts.length > ARRAY_LIMIT) revert DAOPool_ArrayTooLong();\r\n\r\n        // calculate userStake as of block.number\r\n        uint256 _userStake = userStake(msg.sender);\r\n        if (_userStake == 0) revert NoShares(); // ensure msg.sender has share to claim\r\n        address _zero = address(0);\r\n\r\n\t\t// process each token contract for which user wants to claim earnings\r\n        for (uint256 i = 0; i < _tokenContracts.length; ) {\r\n            address _addr = _tokenContracts[i];\r\n            if (_addr == _zero) revert ZeroAddress();\r\n            if (BLOCKS_PER_EPOCH > (block.number - claimed[msg.sender][_addr]))\r\n                revert AlreadyClaimedThisEpoch();\r\n\r\n            uint256 _claim;\r\n\r\n            // calculate % claim by the ratio of msg.sender's staked amount to total stake, multiplied by the balanceOf each token in the DAOPool\r\n            if (_addr == enshroudToken) {\r\n\t\t\t\t// if user is claiming $ENSHROUD tokens, must subtract the staked amount and the deposited unstaked from the balance to get the claimable amount\r\n                _claim = _mulDivDown(\r\n                    _userStake,\r\n                    IERC20_DAOPool(_addr).balanceOf(address(this))\r\n\t\t\t\t\t\t- totalStake - depositedUnstaked,\r\n                    totalStake\r\n                );\r\n            } else {\r\n                _claim = _mulDivDown(\r\n                    _userStake,\r\n                    IERC20_DAOPool(_addr).balanceOf(address(this)),\r\n                    totalStake\r\n                );\r\n            }\r\n            if (_claim != 0) {\r\n                claimed[msg.sender][_addr] = block.number; // update claimed mapping for this asset\r\n\r\n\t\t\t\t// account for possibility this ERC20 is fee-on-transfer or a deflationary token\r\n\t\t\t\tuint256 _epBalanceBefore = IERC20_DAOPool(_addr).balanceOf(enshroudProtocol);\r\n\t\t\t\t/// @dev because SafeTransferLib.safeTransfer() will revert if we attempt to call it as msg.sender in iProtocol._depositTokens(), we do it here\r\n                _addr.safeTransfer(enshroudProtocol, _claim);\r\n\t\t\t\tuint256 _epBalanceAfter = IERC20_DAOPool(_addr).balanceOf(enshroudProtocol);\r\n\t\t\t\trequire(_epBalanceAfter >= _epBalanceBefore);\r\n\t\t\t\tuint256 _netClaim = _epBalanceAfter - _epBalanceBefore;\r\n\t\t\t\t// tell EnshroudProtocol to credit the net claim to msg.sender\r\n                iProtocol.depositTokens(msg.sender, _addr, _netClaim);\r\n            }\r\n            unchecked {\r\n                ++i; // interate loop, cannot overflow without hitting gas limit\r\n            }\r\n        }\r\n\r\n        // only auto-claim ETH once per epoch. Null address used since it is impermissible as an input\r\n        // calculate ETH claim and deposit in protocol contract if > 0 and if at least an epoch has passed since last claim, otherwise ignore via else{}\r\n        if (BLOCKS_PER_EPOCH < (block.number - claimed[msg.sender][_zero])) {\r\n            uint256 _ethClaim = _mulDivDown(\r\n                _userStake,\r\n                address(this).balance,\r\n                totalStake\r\n            );\r\n            if (_ethClaim != 0) {\r\n                claimed[msg.sender][_zero] = block.number; // update claimed mapping for ETH\r\n\t\t\t\t// @dev deposited amount will be auto-converted to wETH\r\n                iProtocol.depositEth{value: _ethClaim}(msg.sender);\r\n            }\r\n        } else {}\r\n    }\r\n\r\n    /// @notice for a staker to claim their pro rata ETH yield separately as a deposit to the Enshroud Protocol contract\r\n\t/// @notice claimTokenYieldAsENFTs() above also claims ETH after claiming yields on the passed list of tokens\r\n    /// @dev epoch is checked/updated every call and userStake (as a ratio of totalStake) is calculated as of block.number; epochPassedSinceStake modifier protects against flash loan + stake + claim\r\n    function claimETHYieldAsENFTs() external nonReentrant epochPassedSinceStake\r\n    {\r\n        // calculate userStake as of block.number\r\n\t\tuint256 _userStake = userStake(msg.sender);\r\n        if (_userStake == 0) revert NoShares(); // ensure msg.sender has share to claim\r\n        address _zero = address(0);\r\n\r\n        // only auto-claim ETH once per epoch. Null address used since it is impermissible as an input\r\n        // calculate ETH claim and deposit in protocol contract if > 0 and if at least an epoch has passed since last claim, otherwise ignore via else{}\r\n        if (BLOCKS_PER_EPOCH < (block.number - claimed[msg.sender][_zero])) {\r\n            uint256 _ethClaim = _mulDivDown(\r\n                _userStake,\r\n                address(this).balance,\r\n                totalStake\r\n            );\r\n            if (_ethClaim != 0) {\r\n                claimed[msg.sender][_zero] = block.number; // update claimed mapping for ETH\r\n                iProtocol.depositEth{value: _ethClaim}(msg.sender);\r\n            }\r\n        } else {}\r\n    }\r\n}\r\n",
  "sourcePath": "/home/ensh/dapp/truffle/contracts/DAOPool.sol",
  "ast": {
    "absolutePath": "project:/contracts/DAOPool.sol",
    "exportedSymbols": {
      "DAOPool": [
        2967
      ],
      "GetterUtils": [
        1009
      ],
      "IERC20_DAOPool": [
        30
      ],
      "IEnshroudProtocol_DAOPool": [
        60
      ],
      "ReentrancyGuard": [
        2995
      ],
      "SafeTransferLib": [
        3059
      ],
      "StakeUtils": [
        2141
      ],
      "StateUtils": [
        615
      ],
      "TimelockUtils": [
        2423
      ],
      "TransferUtils": [
        1711
      ],
      "VotingUtils": [
        1344
      ]
    },
    "id": 2968,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 1,
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".18"
        ],
        "nodeType": "PragmaDirective",
        "src": "33:24:0"
      },
      {
        "absolutePath": "project:/contracts/ReentrancyGuard.sol",
        "file": "./ReentrancyGuard.sol",
        "id": 3,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 2968,
        "sourceUnit": 2996,
        "src": "332:54:0",
        "symbolAliases": [
          {
            "foreign": {
              "id": 2,
              "name": "ReentrancyGuard",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 2995,
              "src": "340:15:0",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/SafeTransferLib.sol",
        "file": "./SafeTransferLib.sol",
        "id": 5,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 2968,
        "sourceUnit": 3060,
        "src": "416:54:0",
        "symbolAliases": [
          {
            "foreign": {
              "id": 4,
              "name": "SafeTransferLib",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 3059,
              "src": "424:15:0",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [],
        "canonicalName": "IERC20_DAOPool",
        "contractDependencies": [],
        "contractKind": "interface",
        "fullyImplemented": false,
        "id": 30,
        "linearizedBaseContracts": [
          30
        ],
        "name": "IERC20_DAOPool",
        "nameLocation": "484:14:0",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "functionSelector": "70a08231",
            "id": 12,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "balanceOf",
            "nameLocation": "515:9:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 8,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 7,
                  "mutability": "mutable",
                  "name": "owner",
                  "nameLocation": "533:5:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 12,
                  "src": "525:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "525:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "524:15:0"
            },
            "returnParameters": {
              "id": 11,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 12,
                  "src": "563:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 9,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "563:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "562:9:0"
            },
            "scope": 30,
            "src": "506:66:0",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "functionSelector": "d505accf",
            "id": 29,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "permit",
            "nameLocation": "623:6:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 27,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 14,
                  "mutability": "mutable",
                  "name": "owner",
                  "nameLocation": "648:5:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 29,
                  "src": "640:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 13,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "640:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 16,
                  "mutability": "mutable",
                  "name": "spender",
                  "nameLocation": "672:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 29,
                  "src": "664:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 15,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "664:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18,
                  "mutability": "mutable",
                  "name": "value",
                  "nameLocation": "698:5:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 29,
                  "src": "690:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 17,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "690:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 20,
                  "mutability": "mutable",
                  "name": "deadline",
                  "nameLocation": "722:8:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 29,
                  "src": "714:16:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "714:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 22,
                  "mutability": "mutable",
                  "name": "v",
                  "nameLocation": "747:1:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 29,
                  "src": "741:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 21,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "741:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 24,
                  "mutability": "mutable",
                  "name": "r",
                  "nameLocation": "767:1:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 29,
                  "src": "759:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 23,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "759:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 26,
                  "mutability": "mutable",
                  "name": "s",
                  "nameLocation": "787:1:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 29,
                  "src": "779:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 25,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "779:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "629:166:0"
            },
            "returnParameters": {
              "id": 28,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "804:0:0"
            },
            "scope": 30,
            "src": "614:191:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 2968,
        "src": "474:334:0",
        "usedErrors": [],
        "usedEvents": []
      },
      {
        "abstract": false,
        "baseContracts": [],
        "canonicalName": "IEnshroudProtocol_DAOPool",
        "contractDependencies": [],
        "contractKind": "interface",
        "fullyImplemented": false,
        "id": 60,
        "linearizedBaseContracts": [
          60
        ],
        "name": "IEnshroudProtocol_DAOPool",
        "nameLocation": "822:25:0",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "canonicalName": "IEnshroudProtocol_DAOPool.MVOinfo",
            "documentation": {
              "id": 31,
              "nodeType": "StructuredDocumentation",
              "src": "855:212:0",
              "text": "@notice 'mvoSigs' is an array of MVO signatures provided by the MVO server (first is lead MVO);\n 'mvoIDs' are the IDs of the MVOs, the first of which is the lead MVO which receives the deposit message"
            },
            "id": 38,
            "members": [
              {
                "constant": false,
                "id": 34,
                "mutability": "mutable",
                "name": "mvoSigs",
                "nameLocation": "1107:7:0",
                "nodeType": "VariableDeclaration",
                "scope": 38,
                "src": "1099:15:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr",
                  "typeString": "bytes[]"
                },
                "typeName": {
                  "baseType": {
                    "id": 32,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1099:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "id": 33,
                  "nodeType": "ArrayTypeName",
                  "src": "1099:7:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr",
                    "typeString": "bytes[]"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 37,
                "mutability": "mutable",
                "name": "mvoIDs",
                "nameLocation": "1134:6:0",
                "nodeType": "VariableDeclaration",
                "scope": 38,
                "src": "1125:15:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_array$_t_string_storage_$dyn_storage_ptr",
                  "typeString": "string[]"
                },
                "typeName": {
                  "baseType": {
                    "id": 35,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1125:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "id": 36,
                  "nodeType": "ArrayTypeName",
                  "src": "1125:8:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_string_storage_$dyn_storage_ptr",
                    "typeString": "string[]"
                  }
                },
                "visibility": "internal"
              }
            ],
            "name": "MVOinfo",
            "nameLocation": "1080:7:0",
            "nodeType": "StructDefinition",
            "scope": 60,
            "src": "1073:75:0",
            "visibility": "public"
          },
          {
            "functionSelector": "ad9d4ba3",
            "id": 43,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "depositEth",
            "nameLocation": "1165:10:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 41,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 40,
                  "mutability": "mutable",
                  "name": "depositor",
                  "nameLocation": "1184:9:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 43,
                  "src": "1176:17:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 39,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1176:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1175:19:0"
            },
            "returnParameters": {
              "id": 42,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1211:0:0"
            },
            "scope": 60,
            "src": "1156:56:0",
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "functionSelector": "39dc5ef2",
            "id": 52,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "depositTokens",
            "nameLocation": "1229:13:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 50,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 45,
                  "mutability": "mutable",
                  "name": "depositor",
                  "nameLocation": "1261:9:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 52,
                  "src": "1253:17:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 44,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1253:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47,
                  "mutability": "mutable",
                  "name": "tokenContract",
                  "nameLocation": "1289:13:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 52,
                  "src": "1281:21:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 46,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1281:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 49,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "1321:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 52,
                  "src": "1313:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 48,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1313:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1242:92:0"
            },
            "returnParameters": {
              "id": 51,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1343:0:0"
            },
            "scope": 60,
            "src": "1220:124:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "functionSelector": "3e4a89d1",
            "id": 59,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "adminStatus",
            "nameLocation": "1411:11:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 55,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 54,
                  "mutability": "mutable",
                  "name": "addr",
                  "nameLocation": "1431:4:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 59,
                  "src": "1423:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 53,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1423:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1422:14:0"
            },
            "returnParameters": {
              "id": 58,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 57,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 59,
                  "src": "1460:4:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 56,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1460:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1459:6:0"
            },
            "scope": 60,
            "src": "1402:64:0",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 2968,
        "src": "812:657:0",
        "usedErrors": [],
        "usedEvents": []
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "baseName": {
              "id": 62,
              "name": "ReentrancyGuard",
              "nameLocations": [
                "1592:15:0"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 2995,
              "src": "1592:15:0"
            },
            "id": 63,
            "nodeType": "InheritanceSpecifier",
            "src": "1592:15:0"
          }
        ],
        "canonicalName": "StateUtils",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 61,
          "nodeType": "StructuredDocumentation",
          "src": "1473:87:0",
          "text": "@title contract that keeps state variables including checkpoints and user structs"
        },
        "fullyImplemented": true,
        "id": 615,
        "linearizedBaseContracts": [
          615,
          2995
        ],
        "name": "StateUtils",
        "nameLocation": "1578:10:0",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "global": false,
            "id": 66,
            "libraryName": {
              "id": 64,
              "name": "SafeTransferLib",
              "nameLocations": [
                "1621:15:0"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 3059,
              "src": "1621:15:0"
            },
            "nodeType": "UsingForDirective",
            "src": "1615:34:0",
            "typeName": {
              "id": 65,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "1641:7:0",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            }
          },
          {
            "canonicalName": "StateUtils.AddressCheckpoint",
            "id": 71,
            "members": [
              {
                "constant": false,
                "id": 68,
                "mutability": "mutable",
                "name": "fromBlock",
                "nameLocation": "1700:9:0",
                "nodeType": "VariableDeclaration",
                "scope": 71,
                "src": "1693:16:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint32",
                  "typeString": "uint32"
                },
                "typeName": {
                  "id": 67,
                  "name": "uint32",
                  "nodeType": "ElementaryTypeName",
                  "src": "1693:6:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 70,
                "mutability": "mutable",
                "name": "_address",
                "nameLocation": "1728:8:0",
                "nodeType": "VariableDeclaration",
                "scope": 71,
                "src": "1720:16:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                },
                "typeName": {
                  "id": 69,
                  "name": "address",
                  "nodeType": "ElementaryTypeName",
                  "src": "1720:7:0",
                  "stateMutability": "nonpayable",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  }
                },
                "visibility": "internal"
              }
            ],
            "name": "AddressCheckpoint",
            "nameLocation": "1664:17:0",
            "nodeType": "StructDefinition",
            "scope": 615,
            "src": "1657:87:0",
            "visibility": "public"
          },
          {
            "canonicalName": "StateUtils.Checkpoint",
            "id": 76,
            "members": [
              {
                "constant": false,
                "id": 73,
                "mutability": "mutable",
                "name": "fromBlock",
                "nameLocation": "1788:9:0",
                "nodeType": "VariableDeclaration",
                "scope": 76,
                "src": "1781:16:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint32",
                  "typeString": "uint32"
                },
                "typeName": {
                  "id": 72,
                  "name": "uint32",
                  "nodeType": "ElementaryTypeName",
                  "src": "1781:6:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 75,
                "mutability": "mutable",
                "name": "value",
                "nameLocation": "1816:5:0",
                "nodeType": "VariableDeclaration",
                "scope": 76,
                "src": "1808:13:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint224",
                  "typeString": "uint224"
                },
                "typeName": {
                  "id": 74,
                  "name": "uint224",
                  "nodeType": "ElementaryTypeName",
                  "src": "1808:7:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint224",
                    "typeString": "uint224"
                  }
                },
                "visibility": "internal"
              }
            ],
            "name": "Checkpoint",
            "nameLocation": "1759:10:0",
            "nodeType": "StructDefinition",
            "scope": 615,
            "src": "1752:77:0",
            "visibility": "public"
          },
          {
            "canonicalName": "StateUtils.User",
            "documentation": {
              "id": 77,
              "nodeType": "StructuredDocumentation",
              "src": "1837:99:0",
              "text": "@dev packing uints did not save gas with explicit conversions, so we keep all values at uint256"
            },
            "id": 100,
            "members": [
              {
                "constant": false,
                "id": 81,
                "mutability": "mutable",
                "name": "shares",
                "nameLocation": "1978:6:0",
                "nodeType": "VariableDeclaration",
                "scope": 100,
                "src": "1965:19:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                  "typeString": "struct StateUtils.Checkpoint[]"
                },
                "typeName": {
                  "baseType": {
                    "id": 79,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 78,
                      "name": "Checkpoint",
                      "nameLocations": [
                        "1965:10:0"
                      ],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 76,
                      "src": "1965:10:0"
                    },
                    "referencedDeclaration": 76,
                    "src": "1965:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Checkpoint_$76_storage_ptr",
                      "typeString": "struct StateUtils.Checkpoint"
                    }
                  },
                  "id": 80,
                  "nodeType": "ArrayTypeName",
                  "src": "1965:12:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                    "typeString": "struct StateUtils.Checkpoint[]"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 85,
                "mutability": "mutable",
                "name": "delegatedTo",
                "nameLocation": "2008:11:0",
                "nodeType": "VariableDeclaration",
                "scope": 100,
                "src": "1995:24:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                  "typeString": "struct StateUtils.Checkpoint[]"
                },
                "typeName": {
                  "baseType": {
                    "id": 83,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 82,
                      "name": "Checkpoint",
                      "nameLocations": [
                        "1995:10:0"
                      ],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 76,
                      "src": "1995:10:0"
                    },
                    "referencedDeclaration": 76,
                    "src": "1995:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Checkpoint_$76_storage_ptr",
                      "typeString": "struct StateUtils.Checkpoint"
                    }
                  },
                  "id": 84,
                  "nodeType": "ArrayTypeName",
                  "src": "1995:12:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                    "typeString": "struct StateUtils.Checkpoint[]"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 89,
                "mutability": "mutable",
                "name": "delegates",
                "nameLocation": "2050:9:0",
                "nodeType": "VariableDeclaration",
                "scope": 100,
                "src": "2030:29:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                  "typeString": "struct StateUtils.AddressCheckpoint[]"
                },
                "typeName": {
                  "baseType": {
                    "id": 87,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 86,
                      "name": "AddressCheckpoint",
                      "nameLocations": [
                        "2030:17:0"
                      ],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 71,
                      "src": "2030:17:0"
                    },
                    "referencedDeclaration": 71,
                    "src": "2030:17:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_AddressCheckpoint_$71_storage_ptr",
                      "typeString": "struct StateUtils.AddressCheckpoint"
                    }
                  },
                  "id": 88,
                  "nodeType": "ArrayTypeName",
                  "src": "2030:19:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                    "typeString": "struct StateUtils.AddressCheckpoint[]"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 91,
                "mutability": "mutable",
                "name": "deposited",
                "nameLocation": "2078:9:0",
                "nodeType": "VariableDeclaration",
                "scope": 100,
                "src": "2070:17:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 90,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "2070:7:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 93,
                "mutability": "mutable",
                "name": "unstakeAmount",
                "nameLocation": "2153:13:0",
                "nodeType": "VariableDeclaration",
                "scope": 100,
                "src": "2145:21:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 92,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "2145:7:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 95,
                "mutability": "mutable",
                "name": "unstakeShares",
                "nameLocation": "2219:13:0",
                "nodeType": "VariableDeclaration",
                "scope": 100,
                "src": "2211:21:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 94,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "2211:7:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 97,
                "mutability": "mutable",
                "name": "unstakeScheduledFor",
                "nameLocation": "2285:19:0",
                "nodeType": "VariableDeclaration",
                "scope": 100,
                "src": "2277:27:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 96,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "2277:7:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 99,
                "mutability": "mutable",
                "name": "lastDelegationUpdateTimestamp",
                "nameLocation": "2323:29:0",
                "nodeType": "VariableDeclaration",
                "scope": 100,
                "src": "2315:37:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 98,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "2315:7:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "visibility": "internal"
              }
            ],
            "name": "User",
            "nameLocation": "1949:4:0",
            "nodeType": "StructDefinition",
            "scope": 615,
            "src": "1942:418:0",
            "visibility": "public"
          },
          {
            "canonicalName": "StateUtils.ApprovalTypes",
            "documentation": {
              "id": 101,
              "nodeType": "StructuredDocumentation",
              "src": "2365:33:0",
              "text": "types to distinguish Requests"
            },
            "id": 104,
            "members": [
              {
                "id": 102,
                "name": "Protocol",
                "nameLocation": "2422:8:0",
                "nodeType": "EnumValue",
                "src": "2422:8:0"
              },
              {
                "id": 103,
                "name": "FeeBot",
                "nameLocation": "2432:6:0",
                "nodeType": "EnumValue",
                "src": "2432:6:0"
              }
            ],
            "name": "ApprovalTypes",
            "nameLocation": "2406:13:0",
            "nodeType": "EnumDefinition",
            "src": "2401:39:0"
          },
          {
            "canonicalName": "StateUtils.Requests",
            "documentation": {
              "id": 105,
              "nodeType": "StructuredDocumentation",
              "src": "2445:101:0",
              "text": "@notice to track admin update requests; addresses truncated to bytes8 for size/gas considerations"
            },
            "id": 113,
            "members": [
              {
                "constant": false,
                "id": 107,
                "mutability": "mutable",
                "name": "requester1",
                "nameLocation": "2577:10:0",
                "nodeType": "VariableDeclaration",
                "scope": 113,
                "src": "2570:17:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_bytes8",
                  "typeString": "bytes8"
                },
                "typeName": {
                  "id": 106,
                  "name": "bytes8",
                  "nodeType": "ElementaryTypeName",
                  "src": "2570:6:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes8",
                    "typeString": "bytes8"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 109,
                "mutability": "mutable",
                "name": "requester2",
                "nameLocation": "2599:10:0",
                "nodeType": "VariableDeclaration",
                "scope": 113,
                "src": "2592:17:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_bytes8",
                  "typeString": "bytes8"
                },
                "typeName": {
                  "id": 108,
                  "name": "bytes8",
                  "nodeType": "ElementaryTypeName",
                  "src": "2592:6:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes8",
                    "typeString": "bytes8"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 112,
                "mutability": "mutable",
                "name": "requestType",
                "nameLocation": "2628:11:0",
                "nodeType": "VariableDeclaration",
                "scope": 113,
                "src": "2614:25:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                  "typeString": "enum StateUtils.ApprovalTypes"
                },
                "typeName": {
                  "id": 111,
                  "nodeType": "UserDefinedTypeName",
                  "pathNode": {
                    "id": 110,
                    "name": "ApprovalTypes",
                    "nameLocations": [
                      "2614:13:0"
                    ],
                    "nodeType": "IdentifierPath",
                    "referencedDeclaration": 104,
                    "src": "2614:13:0"
                  },
                  "referencedDeclaration": 104,
                  "src": "2614:13:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                    "typeString": "enum StateUtils.ApprovalTypes"
                  }
                },
                "visibility": "internal"
              }
            ],
            "name": "Requests",
            "nameLocation": "2556:8:0",
            "nodeType": "StructDefinition",
            "scope": 615,
            "src": "2549:95:0",
            "visibility": "public"
          },
          {
            "constant": true,
            "id": 116,
            "mutability": "constant",
            "name": "ARRAY_LIMIT",
            "nameLocation": "2678:11:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "2652:42:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 114,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "2652:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "hexValue": "3230",
              "id": 115,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "2692:2:0",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_20_by_1",
                "typeString": "int_const 20"
              },
              "value": "20"
            },
            "visibility": "internal"
          },
          {
            "constant": true,
            "id": 119,
            "mutability": "constant",
            "name": "DECIMALS",
            "nameLocation": "2786:8:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "2760:41:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 117,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "2760:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "hexValue": "31653138",
              "id": 118,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "2797:4:0",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_1000000000000000000_by_1",
                "typeString": "int_const 1000000000000000000"
              },
              "value": "1e18"
            },
            "visibility": "internal"
          },
          {
            "constant": true,
            "id": 126,
            "mutability": "constant",
            "name": "MAX_UINT256",
            "nameLocation": "2834:11:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "2808:52:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 120,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "2808:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "commonType": {
                "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1",
                "typeString": "int_const 1157...(70 digits omitted)...9935"
              },
              "id": 125,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "lValueRequested": false,
              "leftExpression": {
                "commonType": {
                  "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639936_by_1",
                  "typeString": "int_const 1157...(70 digits omitted)...9936"
                },
                "id": 123,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "lValueRequested": false,
                "leftExpression": {
                  "hexValue": "32",
                  "id": 121,
                  "isConstant": false,
                  "isLValue": false,
                  "isPure": true,
                  "kind": "number",
                  "lValueRequested": false,
                  "nodeType": "Literal",
                  "src": "2848:1:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_rational_2_by_1",
                    "typeString": "int_const 2"
                  },
                  "value": "2"
                },
                "nodeType": "BinaryOperation",
                "operator": "**",
                "rightExpression": {
                  "hexValue": "323536",
                  "id": 122,
                  "isConstant": false,
                  "isLValue": false,
                  "isPure": true,
                  "kind": "number",
                  "lValueRequested": false,
                  "nodeType": "Literal",
                  "src": "2853:3:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_rational_256_by_1",
                    "typeString": "int_const 256"
                  },
                  "value": "256"
                },
                "src": "2848:8:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639936_by_1",
                  "typeString": "int_const 1157...(70 digits omitted)...9936"
                }
              },
              "nodeType": "BinaryOperation",
              "operator": "-",
              "rightExpression": {
                "hexValue": "31",
                "id": 124,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "kind": "number",
                "lValueRequested": false,
                "nodeType": "Literal",
                "src": "2859:1:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_1_by_1",
                  "typeString": "int_const 1"
                },
                "value": "1"
              },
              "src": "2848:12:0",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1",
                "typeString": "int_const 1157...(70 digits omitted)...9935"
              }
            },
            "visibility": "internal"
          },
          {
            "constant": true,
            "documentation": {
              "id": 127,
              "nodeType": "StructuredDocumentation",
              "src": "2869:68:0",
              "text": "@notice constant variable of one week for timestamp calculations"
            },
            "functionSelector": "ac4746ab",
            "id": 130,
            "mutability": "constant",
            "name": "EPOCH_LENGTH",
            "nameLocation": "2967:12:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "2943:46:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 128,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "2943:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "hexValue": "31",
              "id": 129,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "2982:7:0",
              "subdenomination": "weeks",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_604800_by_1",
                "typeString": "int_const 604800"
              },
              "value": "1"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "documentation": {
              "id": 131,
              "nodeType": "StructuredDocumentation",
              "src": "2998:167:0",
              "text": "@notice for block number calculations, approximated via 7150 blocks/day on ETH mainnet * 7 days.\n @dev should be altered accordingly for other deployments."
            },
            "functionSelector": "1f3adc0f",
            "id": 134,
            "mutability": "constant",
            "name": "BLOCKS_PER_EPOCH",
            "nameLocation": "3195:16:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "3171:48:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 132,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "3171:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "hexValue": "3530303530",
              "id": 133,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "3214:5:0",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_50050_by_1",
                "typeString": "int_const 50050"
              },
              "value": "50050"
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "documentation": {
              "id": 135,
              "nodeType": "StructuredDocumentation",
              "src": "3228:55:0",
              "text": "@notice block starting point for epoch calculations"
            },
            "id": 137,
            "mutability": "immutable",
            "name": "genesisBlock",
            "nameLocation": "3316:12:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "3289:39:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 136,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "3289:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "documentation": {
              "id": 138,
              "nodeType": "StructuredDocumentation",
              "src": "3337:324:0",
              "text": "@notice Enshroud protocol contract. If a v2 protocol is deployed, updateProtocol() should be called by 3 admins, or else a DAOPool v2 may be deployed.\n @notice Without doing so, the functions claimETHYieldAsENFTs() and claimTokenYieldsAsENFTs() in address(this) would deposit value only to the v1 protocol contract."
            },
            "functionSelector": "5de4d643",
            "id": 140,
            "mutability": "mutable",
            "name": "enshroudProtocol",
            "nameLocation": "3679:16:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "3664:31:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 139,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "3664:7:0",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "1eb38cd6",
            "id": 143,
            "mutability": "mutable",
            "name": "iProtocol",
            "nameLocation": "3735:9:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "3702:42:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IEnshroudProtocol_DAOPool_$60",
              "typeString": "contract IEnshroudProtocol_DAOPool"
            },
            "typeName": {
              "id": 142,
              "nodeType": "UserDefinedTypeName",
              "pathNode": {
                "id": 141,
                "name": "IEnshroudProtocol_DAOPool",
                "nameLocations": [
                  "3702:25:0"
                ],
                "nodeType": "IdentifierPath",
                "referencedDeclaration": 60,
                "src": "3702:25:0"
              },
              "referencedDeclaration": 60,
              "src": "3702:25:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IEnshroudProtocol_DAOPool_$60",
                "typeString": "contract IEnshroudProtocol_DAOPool"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "documentation": {
              "id": 144,
              "nodeType": "StructuredDocumentation",
              "src": "3753:27:0",
              "text": "@notice $ENSHROUD token"
            },
            "functionSelector": "acf2040c",
            "id": 146,
            "mutability": "immutable",
            "name": "enshroudToken",
            "nameLocation": "3811:13:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "3786:38:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 145,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "3786:7:0",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "documentation": {
              "id": 147,
              "nodeType": "StructuredDocumentation",
              "src": "3833:76:0",
              "text": "@notice TimelockManager contract, initialised by admin via TimelockUtils"
            },
            "functionSelector": "bf5669bd",
            "id": 149,
            "mutability": "mutable",
            "name": "timelockManager",
            "nameLocation": "3930:15:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "3915:30:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 148,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "3915:7:0",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "documentation": {
              "id": 150,
              "nodeType": "StructuredDocumentation",
              "src": "3951:69:0",
              "text": "@notice address used by bot to import fees earned on other chains"
            },
            "id": 152,
            "mutability": "mutable",
            "name": "feesBot",
            "nameLocation": "4040:7:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "4023:24:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 151,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "4023:7:0",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "documentation": {
              "id": 153,
              "nodeType": "StructuredDocumentation",
              "src": "4053:134:0",
              "text": "@notice total number of $ENSHROUD tokens deposited but not staked (some could be locked in a Timelock, but those cannot be staked)"
            },
            "functionSelector": "b55db352",
            "id": 155,
            "mutability": "mutable",
            "name": "depositedUnstaked",
            "nameLocation": "4205:17:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "4190:32:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 154,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "4190:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "documentation": {
              "id": 156,
              "nodeType": "StructuredDocumentation",
              "src": "4231:68:0",
              "text": "@notice total number of $ENSHROUD tokens staked in this contract"
            },
            "functionSelector": "8b0e9f3f",
            "id": 158,
            "mutability": "mutable",
            "name": "totalStake",
            "nameLocation": "4320:10:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "4305:25:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 157,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "4305:7:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "documentation": {
              "id": 159,
              "nodeType": "StructuredDocumentation",
              "src": "4339:50:0",
              "text": "@notice maps an address to their 'User' struct"
            },
            "functionSelector": "a87430ba",
            "id": 164,
            "mutability": "mutable",
            "name": "users",
            "nameLocation": "4427:5:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "4395:37:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
              "typeString": "mapping(address => struct StateUtils.User)"
            },
            "typeName": {
              "id": 163,
              "keyName": "",
              "keyNameLocation": "-1:-1:-1",
              "keyType": {
                "id": 160,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "4403:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "4395:24:0",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                "typeString": "mapping(address => struct StateUtils.User)"
              },
              "valueName": "",
              "valueNameLocation": "-1:-1:-1",
              "valueType": {
                "id": 162,
                "nodeType": "UserDefinedTypeName",
                "pathNode": {
                  "id": 161,
                  "name": "User",
                  "nameLocations": [
                    "4414:4:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 100,
                  "src": "4414:4:0"
                },
                "referencedDeclaration": 100,
                "src": "4414:4:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                  "typeString": "struct StateUtils.User"
                }
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "documentation": {
              "id": 165,
              "nodeType": "StructuredDocumentation",
              "src": "4441:78:0",
              "text": "@notice maps an address to the block.number of their most recent 'stake()'"
            },
            "functionSelector": "430dc7ab",
            "id": 169,
            "mutability": "mutable",
            "name": "mostRecentStake",
            "nameLocation": "4560:15:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "4525:50:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
              "typeString": "mapping(address => uint256)"
            },
            "typeName": {
              "id": 168,
              "keyName": "",
              "keyNameLocation": "-1:-1:-1",
              "keyType": {
                "id": 166,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "4533:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "4525:27:0",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                "typeString": "mapping(address => uint256)"
              },
              "valueName": "",
              "valueNameLocation": "-1:-1:-1",
              "valueType": {
                "id": 167,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "4544:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "documentation": {
              "id": 170,
              "nodeType": "StructuredDocumentation",
              "src": "4584:196:0",
              "text": "@notice nesting mapping of user address to an asset's address to the number of blocks since such user has claimed their yield for such asset, to compare against epoch length in claim functions"
            },
            "functionSelector": "0c9cbf0e",
            "id": 176,
            "mutability": "mutable",
            "name": "claimed",
            "nameLocation": "4841:7:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "4786:62:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
              "typeString": "mapping(address => mapping(address => uint256))"
            },
            "typeName": {
              "id": 175,
              "keyName": "",
              "keyNameLocation": "-1:-1:-1",
              "keyType": {
                "id": 171,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "4794:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "4786:47:0",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                "typeString": "mapping(address => mapping(address => uint256))"
              },
              "valueName": "",
              "valueNameLocation": "-1:-1:-1",
              "valueType": {
                "id": 174,
                "keyName": "",
                "keyNameLocation": "-1:-1:-1",
                "keyType": {
                  "id": 172,
                  "name": "address",
                  "nodeType": "ElementaryTypeName",
                  "src": "4813:7:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  }
                },
                "nodeType": "Mapping",
                "src": "4805:27:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                  "typeString": "mapping(address => uint256)"
                },
                "valueName": "",
                "valueNameLocation": "-1:-1:-1",
                "valueType": {
                  "id": 173,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "4824:7:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                }
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "documentation": {
              "id": 177,
              "nodeType": "StructuredDocumentation",
              "src": "4857:56:0",
              "text": "@notice keeps the total number of shares of the pool"
            },
            "functionSelector": "75c385d6",
            "id": 181,
            "mutability": "mutable",
            "name": "poolShares",
            "nameLocation": "4939:10:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "4919:30:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
              "typeString": "struct StateUtils.Checkpoint[]"
            },
            "typeName": {
              "baseType": {
                "id": 179,
                "nodeType": "UserDefinedTypeName",
                "pathNode": {
                  "id": 178,
                  "name": "Checkpoint",
                  "nameLocations": [
                    "4919:10:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 76,
                  "src": "4919:10:0"
                },
                "referencedDeclaration": 76,
                "src": "4919:10:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_Checkpoint_$76_storage_ptr",
                  "typeString": "struct StateUtils.Checkpoint"
                }
              },
              "id": 180,
              "nodeType": "ArrayTypeName",
              "src": "4919:12:0",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                "typeString": "struct StateUtils.Checkpoint[]"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "documentation": {
              "id": 182,
              "nodeType": "StructuredDocumentation",
              "src": "4955:60:0",
              "text": "@notice used for tracking state of update*() invocations"
            },
            "id": 187,
            "mutability": "mutable",
            "name": "updateRequested",
            "nameLocation": "5056:15:0",
            "nodeType": "VariableDeclaration",
            "scope": 615,
            "src": "5018:53:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
              "typeString": "mapping(address => struct StateUtils.Requests)"
            },
            "typeName": {
              "id": 186,
              "keyName": "",
              "keyNameLocation": "-1:-1:-1",
              "keyType": {
                "id": 183,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "5026:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "5018:28:0",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                "typeString": "mapping(address => struct StateUtils.Requests)"
              },
              "valueName": "",
              "valueNameLocation": "-1:-1:-1",
              "valueType": {
                "id": 185,
                "nodeType": "UserDefinedTypeName",
                "pathNode": {
                  "id": 184,
                  "name": "Requests",
                  "nameLocations": [
                    "5037:8:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 113,
                  "src": "5037:8:0"
                },
                "referencedDeclaration": 113,
                "src": "5037:8:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_Requests_$113_storage_ptr",
                  "typeString": "struct StateUtils.Requests"
                }
              }
            },
            "visibility": "internal"
          },
          {
            "errorSelector": "c57ab2a4",
            "id": 189,
            "name": "AlreadyClaimedThisEpoch",
            "nameLocation": "5265:23:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 188,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5288:2:0"
            },
            "src": "5259:32:0"
          },
          {
            "errorSelector": "d1860468",
            "id": 191,
            "name": "AlreadyDelegated",
            "nameLocation": "5303:16:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 190,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5319:2:0"
            },
            "src": "5297:25:0"
          },
          {
            "errorSelector": "d5ead1b4",
            "id": 193,
            "name": "AmountExceedsDeposited",
            "nameLocation": "5334:22:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 192,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5356:2:0"
            },
            "src": "5328:31:0"
          },
          {
            "errorSelector": "161607ce",
            "id": 195,
            "name": "AmountExceedsStaked",
            "nameLocation": "5371:19:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 194,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5390:2:0"
            },
            "src": "5365:28:0"
          },
          {
            "errorSelector": "15c840d8",
            "id": 197,
            "name": "AmountExceedsUnlocked",
            "nameLocation": "5405:21:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 196,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5426:2:0"
            },
            "src": "5399:30:0"
          },
          {
            "errorSelector": "822963d3",
            "id": 199,
            "name": "DAOPool_ArrayTooLong",
            "nameLocation": "5441:20:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 198,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5461:2:0"
            },
            "src": "5435:29:0"
          },
          {
            "errorSelector": "d731af9a",
            "id": 201,
            "name": "DAOPool_ExistingTimelock",
            "nameLocation": "5476:24:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 200,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5500:2:0"
            },
            "src": "5470:33:0"
          },
          {
            "errorSelector": "dfb18095",
            "id": 203,
            "name": "DAOPool_ReleaseNotStarted",
            "nameLocation": "5515:25:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 202,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5540:2:0"
            },
            "src": "5509:34:0"
          },
          {
            "errorSelector": "f66b5aa3",
            "id": 205,
            "name": "DAOPool_ReleaseEnded",
            "nameLocation": "5555:20:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 204,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5575:2:0"
            },
            "src": "5549:29:0"
          },
          {
            "errorSelector": "72888906",
            "id": 207,
            "name": "DAOPool_StartMustPrecedeEnd",
            "nameLocation": "5590:27:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 206,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5617:2:0"
            },
            "src": "5584:36:0"
          },
          {
            "errorSelector": "af1b8608",
            "id": 209,
            "name": "DelegateUpdatedTooRecently",
            "nameLocation": "5632:26:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 208,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5658:2:0"
            },
            "src": "5626:35:0"
          },
          {
            "errorSelector": "c5c63bd8",
            "id": 211,
            "name": "ExistingUnstake",
            "nameLocation": "5673:15:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 210,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5688:2:0"
            },
            "src": "5667:24:0"
          },
          {
            "errorSelector": "bf2fed54",
            "id": 213,
            "name": "GreaterThanMaxValue",
            "nameLocation": "5703:19:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 212,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5722:2:0"
            },
            "src": "5697:28:0"
          },
          {
            "errorSelector": "7a47c9a2",
            "id": 215,
            "name": "InvalidChainId",
            "nameLocation": "5737:14:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 214,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5751:2:0"
            },
            "src": "5731:23:0"
          },
          {
            "errorSelector": "b5863604",
            "id": 217,
            "name": "InvalidDelegate",
            "nameLocation": "5766:15:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 216,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5781:2:0"
            },
            "src": "5760:24:0"
          },
          {
            "errorSelector": "ff633a38",
            "id": 219,
            "name": "LengthMismatch",
            "nameLocation": "5793:14:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 218,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5807:2:0"
            },
            "src": "5787:23:0"
          },
          {
            "errorSelector": "85a5387d",
            "id": 221,
            "name": "LessThanOneEpochSinceStake",
            "nameLocation": "5822:26:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 220,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5848:2:0"
            },
            "src": "5816:35:0"
          },
          {
            "errorSelector": "ad251c27",
            "id": 223,
            "name": "MulDivFailed",
            "nameLocation": "5863:12:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 222,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5875:2:0"
            },
            "src": "5857:21:0"
          },
          {
            "errorSelector": "b317087b",
            "id": 225,
            "name": "NoShares",
            "nameLocation": "5890:8:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 224,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5898:2:0"
            },
            "src": "5884:17:0"
          },
          {
            "errorSelector": "c74ecfa1",
            "id": 227,
            "name": "NotDepositOwner",
            "nameLocation": "5913:15:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 226,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5928:2:0"
            },
            "src": "5907:24:0"
          },
          {
            "errorSelector": "7bfa4b9f",
            "id": 229,
            "name": "NotAdmin",
            "nameLocation": "5943:8:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 228,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5951:2:0"
            },
            "src": "5937:17:0"
          },
          {
            "errorSelector": "9ccd6d76",
            "id": 231,
            "name": "NotDelegated",
            "nameLocation": "5966:12:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 230,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5978:2:0"
            },
            "src": "5960:21:0"
          },
          {
            "errorSelector": "34470dd9",
            "id": 233,
            "name": "NotTimelockManager",
            "nameLocation": "5993:18:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 232,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6011:2:0"
            },
            "src": "5987:27:0"
          },
          {
            "errorSelector": "e675c31e",
            "id": 235,
            "name": "OnlyFeesBot",
            "nameLocation": "6023:11:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 234,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6034:2:0"
            },
            "src": "6017:20:0"
          },
          {
            "errorSelector": "93fbcd4f",
            "id": 237,
            "name": "UnstakeNotAvailable",
            "nameLocation": "6049:19:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 236,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6068:2:0"
            },
            "src": "6043:28:0"
          },
          {
            "errorSelector": "d92e233d",
            "id": 239,
            "name": "ZeroAddress",
            "nameLocation": "6083:11:0",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 238,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6094:2:0"
            },
            "src": "6077:20:0"
          },
          {
            "body": {
              "id": 256,
              "nodeType": "Block",
              "src": "6511:146:0",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 250,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 248,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "expression": {
                          "id": 242,
                          "name": "block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -4,
                          "src": "6526:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_block",
                            "typeString": "block"
                          }
                        },
                        "id": 243,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "6532:6:0",
                        "memberName": "number",
                        "nodeType": "MemberAccess",
                        "src": "6526:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "-",
                      "rightExpression": {
                        "baseExpression": {
                          "id": 244,
                          "name": "mostRecentStake",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 169,
                          "src": "6541:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                            "typeString": "mapping(address => uint256)"
                          }
                        },
                        "id": 247,
                        "indexExpression": {
                          "expression": {
                            "id": 245,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "6557:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 246,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "6561:6:0",
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "6557:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "6541:27:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "6526:42:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "id": 249,
                      "name": "BLOCKS_PER_EPOCH",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 134,
                      "src": "6571:16:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "6526:61:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 254,
                  "nodeType": "IfStatement",
                  "src": "6522:115:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 251,
                        "name": "LessThanOneEpochSinceStake",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 221,
                        "src": "6609:26:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 252,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "6609:28:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 253,
                    "nodeType": "RevertStatement",
                    "src": "6602:35:0"
                  }
                },
                {
                  "id": 255,
                  "nodeType": "PlaceholderStatement",
                  "src": "6648:1:0"
                }
              ]
            },
            "documentation": {
              "id": 240,
              "nodeType": "StructuredDocumentation",
              "src": "6287:185:0",
              "text": "@notice ensures msg.sender has waited full epoch before calling modified function, to prevent flashloan attacks (for example take loan, depositAndStake, claim, unstake, return loan)"
            },
            "id": 257,
            "name": "epochPassedSinceStake",
            "nameLocation": "6487:21:0",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 241,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6508:2:0"
            },
            "src": "6478:179:0",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 268,
              "nodeType": "Block",
              "src": "6696:93:0",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 262,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 259,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "6711:3:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 260,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "6715:6:0",
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "src": "6711:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "id": 261,
                      "name": "timelockManager",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 149,
                      "src": "6725:15:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "6711:29:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 266,
                  "nodeType": "IfStatement",
                  "src": "6707:62:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 263,
                        "name": "NotTimelockManager",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 233,
                        "src": "6749:18:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 264,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "6749:20:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 265,
                    "nodeType": "RevertStatement",
                    "src": "6742:27:0"
                  }
                },
                {
                  "id": 267,
                  "nodeType": "PlaceholderStatement",
                  "src": "6780:1:0"
                }
              ]
            },
            "id": 269,
            "name": "onlyTimelockManager",
            "nameLocation": "6674:19:0",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 258,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6693:2:0"
            },
            "src": "6665:124:0",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 282,
              "nodeType": "Block",
              "src": "6891:79:0",
              "statements": [
                {
                  "condition": {
                    "id": 276,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "!",
                    "prefix": true,
                    "src": "6906:34:0",
                    "subExpression": {
                      "arguments": [
                        {
                          "expression": {
                            "id": 273,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "6929:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 274,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "6933:6:0",
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "6929:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "expression": {
                          "id": 271,
                          "name": "iProtocol",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 143,
                          "src": "6907:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IEnshroudProtocol_DAOPool_$60",
                            "typeString": "contract IEnshroudProtocol_DAOPool"
                          }
                        },
                        "id": 272,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "6917:11:0",
                        "memberName": "adminStatus",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 59,
                        "src": "6907:21:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_bool_$",
                          "typeString": "function (address) view external returns (bool)"
                        }
                      },
                      "id": 275,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "6907:33:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 280,
                  "nodeType": "IfStatement",
                  "src": "6902:57:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 277,
                        "name": "NotAdmin",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 229,
                        "src": "6949:8:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 278,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "6949:10:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 279,
                    "nodeType": "RevertStatement",
                    "src": "6942:17:0"
                  }
                },
                {
                  "id": 281,
                  "nodeType": "PlaceholderStatement",
                  "src": "6964:1:0"
                }
              ]
            },
            "id": 283,
            "name": "onlyAdmin",
            "nameLocation": "6879:9:0",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 270,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6888:2:0"
            },
            "src": "6870:100:0",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 319,
              "nodeType": "Block",
              "src": "7403:330:0",
              "statements": [
                {
                  "expression": {
                    "id": 293,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 291,
                      "name": "enshroudToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 146,
                      "src": "7414:13:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 292,
                      "name": "_enshroudTokenAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 288,
                      "src": "7430:21:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "7414:37:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 294,
                  "nodeType": "ExpressionStatement",
                  "src": "7414:37:0"
                },
                {
                  "expression": {
                    "id": 297,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 295,
                      "name": "enshroudProtocol",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 140,
                      "src": "7456:16:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 296,
                      "name": "_enshroudProtocol",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 286,
                      "src": "7475:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "7456:36:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 298,
                  "nodeType": "ExpressionStatement",
                  "src": "7456:36:0"
                },
                {
                  "expression": {
                    "id": 303,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 299,
                      "name": "iProtocol",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 143,
                      "src": "7503:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IEnshroudProtocol_DAOPool_$60",
                        "typeString": "contract IEnshroudProtocol_DAOPool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "id": 301,
                          "name": "_enshroudProtocol",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 286,
                          "src": "7541:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 300,
                        "name": "IEnshroudProtocol_DAOPool",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60,
                        "src": "7515:25:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_IEnshroudProtocol_DAOPool_$60_$",
                          "typeString": "type(contract IEnshroudProtocol_DAOPool)"
                        }
                      },
                      "id": 302,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "7515:44:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IEnshroudProtocol_DAOPool_$60",
                        "typeString": "contract IEnshroudProtocol_DAOPool"
                      }
                    },
                    "src": "7503:56:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IEnshroudProtocol_DAOPool_$60",
                      "typeString": "contract IEnshroudProtocol_DAOPool"
                    }
                  },
                  "id": 304,
                  "nodeType": "ExpressionStatement",
                  "src": "7503:56:0"
                },
                {
                  "expression": {
                    "id": 308,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 305,
                      "name": "genesisBlock",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 137,
                      "src": "7570:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "expression": {
                        "id": 306,
                        "name": "block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -4,
                        "src": "7585:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_block",
                          "typeString": "block"
                        }
                      },
                      "id": 307,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "7591:6:0",
                      "memberName": "number",
                      "nodeType": "MemberAccess",
                      "src": "7585:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "7570:27:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 309,
                  "nodeType": "ExpressionStatement",
                  "src": "7570:27:0"
                },
                {
                  "expression": {
                    "id": 312,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 310,
                      "name": "totalStake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 158,
                      "src": "7663:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "hexValue": "31",
                      "id": 311,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "7676:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_1_by_1",
                        "typeString": "int_const 1"
                      },
                      "value": "1"
                    },
                    "src": "7663:14:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 313,
                  "nodeType": "ExpressionStatement",
                  "src": "7663:14:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 315,
                        "name": "poolShares",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 181,
                        "src": "7711:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        }
                      },
                      {
                        "hexValue": "31",
                        "id": 316,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "7723:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_1_by_1",
                          "typeString": "int_const 1"
                        },
                        "value": "1"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        },
                        {
                          "typeIdentifier": "t_rational_1_by_1",
                          "typeString": "int_const 1"
                        }
                      ],
                      "id": 314,
                      "name": "_updateCheckpointArray",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 462,
                      "src": "7688:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr_$_t_uint256_$returns$__$",
                        "typeString": "function (struct StateUtils.Checkpoint storage ref[] storage pointer,uint256)"
                      }
                    },
                    "id": 317,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7688:37:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 318,
                  "nodeType": "ExpressionStatement",
                  "src": "7688:37:0"
                }
              ]
            },
            "documentation": {
              "id": 284,
              "nodeType": "StructuredDocumentation",
              "src": "7160:134:0",
              "text": "@param _enshroudProtocol Enshroud protocol contract address\n @param _enshroudTokenAddress $ENSHROUD token contract address"
            },
            "id": 320,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 289,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 286,
                  "mutability": "mutable",
                  "name": "_enshroudProtocol",
                  "nameLocation": "7330:17:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 320,
                  "src": "7322:25:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 285,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7322:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 288,
                  "mutability": "mutable",
                  "name": "_enshroudTokenAddress",
                  "nameLocation": "7366:21:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 320,
                  "src": "7358:29:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 287,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7358:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7311:83:0"
            },
            "returnParameters": {
              "id": 290,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "7403:0:0"
            },
            "scope": 615,
            "src": "7300:433:0",
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 324,
              "nodeType": "Block",
              "src": "7879:2:0",
              "statements": []
            },
            "documentation": {
              "id": 321,
              "nodeType": "StructuredDocumentation",
              "src": "7741:105:0",
              "text": "@notice allow this contract to receive ETH, needed for fees earned from protocol contract and feesBot"
            },
            "id": 325,
            "implemented": true,
            "kind": "receive",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 322,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "7859:2:0"
            },
            "returnParameters": {
              "id": 323,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "7879:0:0"
            },
            "scope": 615,
            "src": "7852:29:0",
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 337,
              "nodeType": "Block",
              "src": "8137:60:0",
              "statements": [
                {
                  "expression": {
                    "id": 335,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 333,
                      "name": "timelockManager",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 149,
                      "src": "8148:15:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 334,
                      "name": "_timelockManagerAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 328,
                      "src": "8166:23:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "8148:41:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 336,
                  "nodeType": "ExpressionStatement",
                  "src": "8148:41:0"
                }
              ]
            },
            "documentation": {
              "id": 326,
              "nodeType": "StructuredDocumentation",
              "src": "7889:155:0",
              "text": "@notice admin may set or update the address of the timelock manager contract.\n @param _timelockManagerAddress timelock manager contract address"
            },
            "functionSelector": "aac3ac82",
            "id": 338,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 331,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 330,
                  "name": "onlyAdmin",
                  "nameLocations": [
                    "8127:9:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 283,
                  "src": "8127:9:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "8127:9:0"
              }
            ],
            "name": "setTimelockManager",
            "nameLocation": "8059:18:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 329,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 328,
                  "mutability": "mutable",
                  "name": "_timelockManagerAddress",
                  "nameLocation": "8090:23:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 338,
                  "src": "8082:31:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 327,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8082:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8077:40:0"
            },
            "returnParameters": {
              "id": 332,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8137:0:0"
            },
            "scope": 615,
            "src": "8050:147:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 377,
              "nodeType": "Block",
              "src": "8414:331:0",
              "statements": [
                {
                  "assignments": [
                    347
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 347,
                      "mutability": "mutable",
                      "name": "_caller",
                      "nameLocation": "8426:7:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 377,
                      "src": "8419:14:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes8",
                        "typeString": "bytes8"
                      },
                      "typeName": {
                        "id": 346,
                        "name": "bytes8",
                        "nodeType": "ElementaryTypeName",
                        "src": "8419:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes8",
                          "typeString": "bytes8"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 359,
                  "initialValue": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "expression": {
                                  "id": 354,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "8458:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 355,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberLocation": "8462:6:0",
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "src": "8458:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 353,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "8450:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint160_$",
                                "typeString": "type(uint160)"
                              },
                              "typeName": {
                                "id": 352,
                                "name": "uint160",
                                "nodeType": "ElementaryTypeName",
                                "src": "8450:7:0",
                                "typeDescriptions": {}
                              }
                            },
                            "id": 356,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "8450:19:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint160",
                              "typeString": "uint160"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint160",
                              "typeString": "uint160"
                            }
                          ],
                          "id": 351,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "8443:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_uint64_$",
                            "typeString": "type(uint64)"
                          },
                          "typeName": {
                            "id": 350,
                            "name": "uint64",
                            "nodeType": "ElementaryTypeName",
                            "src": "8443:6:0",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 357,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8443:27:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      ],
                      "id": 349,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "8436:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_bytes8_$",
                        "typeString": "type(bytes8)"
                      },
                      "typeName": {
                        "id": 348,
                        "name": "bytes8",
                        "nodeType": "ElementaryTypeName",
                        "src": "8436:6:0",
                        "typeDescriptions": {}
                      }
                    },
                    "id": 358,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8436:35:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes8",
                      "typeString": "bytes8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "8419:52:0"
                },
                {
                  "condition": {
                    "arguments": [
                      {
                        "id": 361,
                        "name": "_newFeesBot",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 341,
                        "src": "8499:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 362,
                        "name": "_caller",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 347,
                        "src": "8512:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes8",
                          "typeString": "bytes8"
                        }
                      },
                      {
                        "expression": {
                          "id": 363,
                          "name": "ApprovalTypes",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 104,
                          "src": "8521:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_enum$_ApprovalTypes_$104_$",
                            "typeString": "type(enum StateUtils.ApprovalTypes)"
                          }
                        },
                        "id": 364,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "memberLocation": "8535:6:0",
                        "memberName": "FeeBot",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 103,
                        "src": "8521:20:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                          "typeString": "enum StateUtils.ApprovalTypes"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes8",
                          "typeString": "bytes8"
                        },
                        {
                          "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                          "typeString": "enum StateUtils.ApprovalTypes"
                        }
                      ],
                      "id": 360,
                      "name": "_isRequestApproved",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 600,
                      "src": "8480:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes8_$_t_enum$_ApprovalTypes_$104_$returns$_t_bool_$",
                        "typeString": "function (address,bytes8,enum StateUtils.ApprovalTypes) returns (bool)"
                      }
                    },
                    "id": 365,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8480:62:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 376,
                  "nodeType": "IfStatement",
                  "src": "8476:265:0",
                  "trueBody": {
                    "id": 375,
                    "nodeType": "Block",
                    "src": "8544:197:0",
                    "statements": [
                      {
                        "expression": {
                          "id": 368,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "id": 366,
                            "name": "feesBot",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 152,
                            "src": "8636:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "id": 367,
                            "name": "_newFeesBot",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 341,
                            "src": "8646:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "8636:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 369,
                        "nodeType": "ExpressionStatement",
                        "src": "8636:21:0"
                      },
                      {
                        "expression": {
                          "id": 373,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "delete",
                          "prefix": true,
                          "src": "8700:35:0",
                          "subExpression": {
                            "baseExpression": {
                              "id": 370,
                              "name": "updateRequested",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 187,
                              "src": "8707:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                                "typeString": "mapping(address => struct StateUtils.Requests storage ref)"
                              }
                            },
                            "id": 372,
                            "indexExpression": {
                              "id": 371,
                              "name": "_newFeesBot",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 341,
                              "src": "8723:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "8707:28:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Requests_$113_storage",
                              "typeString": "struct StateUtils.Requests storage ref"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 374,
                        "nodeType": "ExpressionStatement",
                        "src": "8700:35:0"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 339,
              "nodeType": "StructuredDocumentation",
              "src": "8202:146:0",
              "text": "@notice may set or update 'feesBot' with a new address\n @param _newFeesBot address of bot's EOA which imports fees earned on other chains"
            },
            "functionSelector": "7eb61c81",
            "id": 378,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 344,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 343,
                  "name": "onlyAdmin",
                  "nameLocations": [
                    "8404:9:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 283,
                  "src": "8404:9:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "8404:9:0"
              }
            ],
            "name": "updateFeesBot",
            "nameLocation": "8360:13:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 342,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 341,
                  "mutability": "mutable",
                  "name": "_newFeesBot",
                  "nameLocation": "8382:11:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 378,
                  "src": "8374:19:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 340,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8374:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8373:21:0"
            },
            "returnParameters": {
              "id": 345,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8414:0:0"
            },
            "scope": 615,
            "src": "8351:394:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 423,
              "nodeType": "Block",
              "src": "8965:442:0",
              "statements": [
                {
                  "assignments": [
                    387
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 387,
                      "mutability": "mutable",
                      "name": "_caller",
                      "nameLocation": "8977:7:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 423,
                      "src": "8970:14:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes8",
                        "typeString": "bytes8"
                      },
                      "typeName": {
                        "id": 386,
                        "name": "bytes8",
                        "nodeType": "ElementaryTypeName",
                        "src": "8970:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes8",
                          "typeString": "bytes8"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 399,
                  "initialValue": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "expression": {
                                  "id": 394,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "9009:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 395,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberLocation": "9013:6:0",
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "src": "9009:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 393,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "9001:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint160_$",
                                "typeString": "type(uint160)"
                              },
                              "typeName": {
                                "id": 392,
                                "name": "uint160",
                                "nodeType": "ElementaryTypeName",
                                "src": "9001:7:0",
                                "typeDescriptions": {}
                              }
                            },
                            "id": 396,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "9001:19:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint160",
                              "typeString": "uint160"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint160",
                              "typeString": "uint160"
                            }
                          ],
                          "id": 391,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "8994:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_uint64_$",
                            "typeString": "type(uint64)"
                          },
                          "typeName": {
                            "id": 390,
                            "name": "uint64",
                            "nodeType": "ElementaryTypeName",
                            "src": "8994:6:0",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 397,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8994:27:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      ],
                      "id": 389,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "8987:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_bytes8_$",
                        "typeString": "type(bytes8)"
                      },
                      "typeName": {
                        "id": 388,
                        "name": "bytes8",
                        "nodeType": "ElementaryTypeName",
                        "src": "8987:6:0",
                        "typeDescriptions": {}
                      }
                    },
                    "id": 398,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8987:35:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes8",
                      "typeString": "bytes8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "8970:52:0"
                },
                {
                  "condition": {
                    "arguments": [
                      {
                        "id": 401,
                        "name": "_newProtocol",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 381,
                        "src": "9050:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 402,
                        "name": "_caller",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 387,
                        "src": "9064:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes8",
                          "typeString": "bytes8"
                        }
                      },
                      {
                        "expression": {
                          "id": 403,
                          "name": "ApprovalTypes",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 104,
                          "src": "9073:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_enum$_ApprovalTypes_$104_$",
                            "typeString": "type(enum StateUtils.ApprovalTypes)"
                          }
                        },
                        "id": 404,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "memberLocation": "9087:8:0",
                        "memberName": "Protocol",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 102,
                        "src": "9073:22:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                          "typeString": "enum StateUtils.ApprovalTypes"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes8",
                          "typeString": "bytes8"
                        },
                        {
                          "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                          "typeString": "enum StateUtils.ApprovalTypes"
                        }
                      ],
                      "id": 400,
                      "name": "_isRequestApproved",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 600,
                      "src": "9031:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes8_$_t_enum$_ApprovalTypes_$104_$returns$_t_bool_$",
                        "typeString": "function (address,bytes8,enum StateUtils.ApprovalTypes) returns (bool)"
                      }
                    },
                    "id": 405,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9031:65:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 422,
                  "nodeType": "IfStatement",
                  "src": "9027:376:0",
                  "trueBody": {
                    "id": 421,
                    "nodeType": "Block",
                    "src": "9098:305:0",
                    "statements": [
                      {
                        "expression": {
                          "id": 408,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "id": 406,
                            "name": "enshroudProtocol",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 140,
                            "src": "9230:16:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "id": 407,
                            "name": "_newProtocol",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 381,
                            "src": "9249:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "9230:31:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 409,
                        "nodeType": "ExpressionStatement",
                        "src": "9230:31:0"
                      },
                      {
                        "expression": {
                          "id": 414,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "id": 410,
                            "name": "iProtocol",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 143,
                            "src": "9267:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IEnshroudProtocol_DAOPool_$60",
                              "typeString": "contract IEnshroudProtocol_DAOPool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "arguments": [
                              {
                                "id": 412,
                                "name": "_newProtocol",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 381,
                                "src": "9305:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 411,
                              "name": "IEnshroudProtocol_DAOPool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 60,
                              "src": "9279:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_IEnshroudProtocol_DAOPool_$60_$",
                                "typeString": "type(contract IEnshroudProtocol_DAOPool)"
                              }
                            },
                            "id": 413,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "9279:39:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IEnshroudProtocol_DAOPool_$60",
                              "typeString": "contract IEnshroudProtocol_DAOPool"
                            }
                          },
                          "src": "9267:51:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IEnshroudProtocol_DAOPool_$60",
                            "typeString": "contract IEnshroudProtocol_DAOPool"
                          }
                        },
                        "id": 415,
                        "nodeType": "ExpressionStatement",
                        "src": "9267:51:0"
                      },
                      {
                        "expression": {
                          "id": 419,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "delete",
                          "prefix": true,
                          "src": "9361:36:0",
                          "subExpression": {
                            "baseExpression": {
                              "id": 416,
                              "name": "updateRequested",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 187,
                              "src": "9368:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                                "typeString": "mapping(address => struct StateUtils.Requests storage ref)"
                              }
                            },
                            "id": 418,
                            "indexExpression": {
                              "id": 417,
                              "name": "_newProtocol",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 381,
                              "src": "9384:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "9368:29:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Requests_$113_storage",
                              "typeString": "struct StateUtils.Requests storage ref"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 420,
                        "nodeType": "ExpressionStatement",
                        "src": "9361:36:0"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 379,
              "nodeType": "StructuredDocumentation",
              "src": "8750:147:0",
              "text": "@notice admin may update 'iProtocol' with a new protocol address (v2, v3, etc.)\n @param _newProtocol new EnshroudProtocol contract address"
            },
            "functionSelector": "727a573c",
            "id": 424,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 384,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 383,
                  "name": "onlyAdmin",
                  "nameLocations": [
                    "8955:9:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 283,
                  "src": "8955:9:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "8955:9:0"
              }
            ],
            "name": "updateProtocol",
            "nameLocation": "8909:14:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 382,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 381,
                  "mutability": "mutable",
                  "name": "_newProtocol",
                  "nameLocation": "8932:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 424,
                  "src": "8924:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 380,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8924:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8923:22:0"
            },
            "returnParameters": {
              "id": 385,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8965:0:0"
            },
            "scope": 615,
            "src": "8900:507:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 461,
              "nodeType": "Block",
              "src": "10117:255:0",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 440,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 434,
                      "name": "_value",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 431,
                      "src": "10132:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "expression": {
                        "arguments": [
                          {
                            "id": 437,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "10146:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint224_$",
                              "typeString": "type(uint224)"
                            },
                            "typeName": {
                              "id": 436,
                              "name": "uint224",
                              "nodeType": "ElementaryTypeName",
                              "src": "10146:7:0",
                              "typeDescriptions": {}
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_type$_t_uint224_$",
                              "typeString": "type(uint224)"
                            }
                          ],
                          "id": 435,
                          "name": "type",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -27,
                          "src": "10141:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_metatype_pure$__$returns$__$",
                            "typeString": "function () pure"
                          }
                        },
                        "id": 438,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "10141:13:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_meta_type_t_uint224",
                          "typeString": "type(uint224)"
                        }
                      },
                      "id": 439,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberLocation": "10155:3:0",
                      "memberName": "max",
                      "nodeType": "MemberAccess",
                      "src": "10141:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint224",
                        "typeString": "uint224"
                      }
                    },
                    "src": "10132:26:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 444,
                  "nodeType": "IfStatement",
                  "src": "10128:60:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 441,
                        "name": "GreaterThanMaxValue",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 213,
                        "src": "10167:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 442,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "10167:21:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 443,
                    "nodeType": "RevertStatement",
                    "src": "10160:28:0"
                  }
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "expression": {
                                  "id": 451,
                                  "name": "block",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -4,
                                  "src": "10283:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_block",
                                    "typeString": "block"
                                  }
                                },
                                "id": 452,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberLocation": "10289:6:0",
                                "memberName": "number",
                                "nodeType": "MemberAccess",
                                "src": "10283:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 450,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "10276:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint32_$",
                                "typeString": "type(uint32)"
                              },
                              "typeName": {
                                "id": 449,
                                "name": "uint32",
                                "nodeType": "ElementaryTypeName",
                                "src": "10276:6:0",
                                "typeDescriptions": {}
                              }
                            },
                            "id": 453,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "10276:20:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          {
                            "arguments": [
                              {
                                "id": 456,
                                "name": "_value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 431,
                                "src": "10330:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 455,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "10322:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint224_$",
                                "typeString": "type(uint224)"
                              },
                              "typeName": {
                                "id": 454,
                                "name": "uint224",
                                "nodeType": "ElementaryTypeName",
                                "src": "10322:7:0",
                                "typeDescriptions": {}
                              }
                            },
                            "id": 457,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "10322:15:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint224",
                              "typeString": "uint224"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            },
                            {
                              "typeIdentifier": "t_uint224",
                              "typeString": "uint224"
                            }
                          ],
                          "id": 448,
                          "name": "Checkpoint",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 76,
                          "src": "10235:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_struct$_Checkpoint_$76_storage_ptr_$",
                            "typeString": "type(struct StateUtils.Checkpoint storage pointer)"
                          }
                        },
                        "id": 458,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "structConstructorCall",
                        "lValueRequested": false,
                        "nameLocations": [
                          "10265:9:0",
                          "10315:5:0"
                        ],
                        "names": [
                          "fromBlock",
                          "value"
                        ],
                        "nodeType": "FunctionCall",
                        "src": "10235:118:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Checkpoint_$76_memory_ptr",
                          "typeString": "struct StateUtils.Checkpoint memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_Checkpoint_$76_memory_ptr",
                          "typeString": "struct StateUtils.Checkpoint memory"
                        }
                      ],
                      "expression": {
                        "id": 445,
                        "name": "_checkpointArray",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 429,
                        "src": "10199:16:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage pointer"
                        }
                      },
                      "id": 447,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "10216:4:0",
                      "memberName": "push",
                      "nodeType": "MemberAccess",
                      "src": "10199:21:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_arraypush_nonpayable$_t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr_$_t_struct$_Checkpoint_$76_storage_$returns$__$attached_to$_t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr_$",
                        "typeString": "function (struct StateUtils.Checkpoint storage ref[] storage pointer,struct StateUtils.Checkpoint storage ref)"
                      }
                    },
                    "id": 459,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10199:165:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 460,
                  "nodeType": "ExpressionStatement",
                  "src": "10199:165:0"
                }
              ]
            },
            "documentation": {
              "id": 425,
              "nodeType": "StructuredDocumentation",
              "src": "9415:575:0",
              "text": "@notice called internally to update a checkpoint array by pushing a new checkpoint\n @dev assumes `block.number` will always fit in a uint32 (as this contract is only to be deployed on ETH mainnet) and `value` will always fit in a uint224. `value` will either be a raw token amount\n or a raw pool share amount so this assumption will be correct in practice with a token with 18 decimals and no overwhelming single-address centralisation.\n @param _checkpointArray checkpoint array\n @param _value value to be used to create the new checkpoint"
            },
            "id": 462,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_updateCheckpointArray",
            "nameLocation": "10005:22:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 432,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 429,
                  "mutability": "mutable",
                  "name": "_checkpointArray",
                  "nameLocation": "10059:16:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 462,
                  "src": "10038:37:0",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                    "typeString": "struct StateUtils.Checkpoint[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 427,
                      "nodeType": "UserDefinedTypeName",
                      "pathNode": {
                        "id": 426,
                        "name": "Checkpoint",
                        "nameLocations": [
                          "10038:10:0"
                        ],
                        "nodeType": "IdentifierPath",
                        "referencedDeclaration": 76,
                        "src": "10038:10:0"
                      },
                      "referencedDeclaration": 76,
                      "src": "10038:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Checkpoint_$76_storage_ptr",
                        "typeString": "struct StateUtils.Checkpoint"
                      }
                    },
                    "id": 428,
                    "nodeType": "ArrayTypeName",
                    "src": "10038:12:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                      "typeString": "struct StateUtils.Checkpoint[]"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 431,
                  "mutability": "mutable",
                  "name": "_value",
                  "nameLocation": "10094:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 462,
                  "src": "10086:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 430,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "10086:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "10027:80:0"
            },
            "returnParameters": {
              "id": 433,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "10117:0:0"
            },
            "scope": 615,
            "src": "9996:376:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 485,
              "nodeType": "Block",
              "src": "10874:190:0",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "expression": {
                                  "id": 478,
                                  "name": "block",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -4,
                                  "src": "10982:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_block",
                                    "typeString": "block"
                                  }
                                },
                                "id": 479,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberLocation": "10988:6:0",
                                "memberName": "number",
                                "nodeType": "MemberAccess",
                                "src": "10982:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 477,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "10975:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint32_$",
                                "typeString": "type(uint32)"
                              },
                              "typeName": {
                                "id": 476,
                                "name": "uint32",
                                "nodeType": "ElementaryTypeName",
                                "src": "10975:6:0",
                                "typeDescriptions": {}
                              }
                            },
                            "id": 480,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "10975:20:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          {
                            "id": 481,
                            "name": "_addr",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 469,
                            "src": "11024:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 475,
                          "name": "AddressCheckpoint",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 71,
                          "src": "10927:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_struct$_AddressCheckpoint_$71_storage_ptr_$",
                            "typeString": "type(struct StateUtils.AddressCheckpoint storage pointer)"
                          }
                        },
                        "id": 482,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "structConstructorCall",
                        "lValueRequested": false,
                        "nameLocations": [
                          "10964:9:0",
                          "11014:8:0"
                        ],
                        "names": [
                          "fromBlock",
                          "_address"
                        ],
                        "nodeType": "FunctionCall",
                        "src": "10927:118:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressCheckpoint_$71_memory_ptr",
                          "typeString": "struct StateUtils.AddressCheckpoint memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_AddressCheckpoint_$71_memory_ptr",
                          "typeString": "struct StateUtils.AddressCheckpoint memory"
                        }
                      ],
                      "expression": {
                        "id": 472,
                        "name": "addressCheckpointArray",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 467,
                        "src": "10885:22:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                          "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage pointer"
                        }
                      },
                      "id": 474,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "10908:4:0",
                      "memberName": "push",
                      "nodeType": "MemberAccess",
                      "src": "10885:27:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_arraypush_nonpayable$_t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr_$_t_struct$_AddressCheckpoint_$71_storage_$returns$__$attached_to$_t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr_$",
                        "typeString": "function (struct StateUtils.AddressCheckpoint storage ref[] storage pointer,struct StateUtils.AddressCheckpoint storage ref)"
                      }
                    },
                    "id": 483,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10885:171:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 484,
                  "nodeType": "ExpressionStatement",
                  "src": "10885:171:0"
                }
              ]
            },
            "documentation": {
              "id": 463,
              "nodeType": "StructuredDocumentation",
              "src": "10380:348:0",
              "text": "@notice called internally to update an address-checkpoint array by pushing a new checkpoint\n @dev assumes block.number will always fit in a uint32, as this contract is only to be deployed on ETH mainnet\n @param addressCheckpointArray address-checkpoint array\n @param _addr address to be used to create the new checkpoint"
            },
            "id": 486,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_updateAddressCheckpointArray",
            "nameLocation": "10743:29:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 470,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 467,
                  "mutability": "mutable",
                  "name": "addressCheckpointArray",
                  "nameLocation": "10811:22:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 486,
                  "src": "10783:50:0",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                    "typeString": "struct StateUtils.AddressCheckpoint[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 465,
                      "nodeType": "UserDefinedTypeName",
                      "pathNode": {
                        "id": 464,
                        "name": "AddressCheckpoint",
                        "nameLocations": [
                          "10783:17:0"
                        ],
                        "nodeType": "IdentifierPath",
                        "referencedDeclaration": 71,
                        "src": "10783:17:0"
                      },
                      "referencedDeclaration": 71,
                      "src": "10783:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_AddressCheckpoint_$71_storage_ptr",
                        "typeString": "struct StateUtils.AddressCheckpoint"
                      }
                    },
                    "id": 466,
                    "nodeType": "ArrayTypeName",
                    "src": "10783:19:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                      "typeString": "struct StateUtils.AddressCheckpoint[]"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 469,
                  "mutability": "mutable",
                  "name": "_addr",
                  "nameLocation": "10852:5:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 486,
                  "src": "10844:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 468,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10844:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "10772:92:0"
            },
            "returnParameters": {
              "id": 471,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "10874:0:0"
            },
            "scope": 615,
            "src": "10734:330:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 599,
              "nodeType": "Block",
              "src": "11484:816:0",
              "statements": [
                {
                  "assignments": [
                    500
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 500,
                      "mutability": "mutable",
                      "name": "_default",
                      "nameLocation": "11496:8:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 599,
                      "src": "11489:15:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes8",
                        "typeString": "bytes8"
                      },
                      "typeName": {
                        "id": 499,
                        "name": "bytes8",
                        "nodeType": "ElementaryTypeName",
                        "src": "11489:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes8",
                          "typeString": "bytes8"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 501,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "11489:15:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_bytes8",
                      "typeString": "bytes8"
                    },
                    "id": 507,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "baseExpression": {
                          "id": 502,
                          "name": "updateRequested",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 187,
                          "src": "11515:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                            "typeString": "mapping(address => struct StateUtils.Requests storage ref)"
                          }
                        },
                        "id": 504,
                        "indexExpression": {
                          "id": 503,
                          "name": "_reqAddr",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 489,
                          "src": "11531:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "11515:25:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Requests_$113_storage",
                          "typeString": "struct StateUtils.Requests storage ref"
                        }
                      },
                      "id": 505,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "11541:10:0",
                      "memberName": "requester1",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 107,
                      "src": "11515:36:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes8",
                        "typeString": "bytes8"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "id": 506,
                      "name": "_default",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 500,
                      "src": "11555:8:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes8",
                        "typeString": "bytes8"
                      }
                    },
                    "src": "11515:48:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "condition": {
                      "commonType": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "id": 549,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 542,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 535,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "commonType": {
                              "typeIdentifier": "t_bytes8",
                              "typeString": "bytes8"
                            },
                            "id": 528,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "expression": {
                                "baseExpression": {
                                  "id": 523,
                                  "name": "updateRequested",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 187,
                                  "src": "11692:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                                    "typeString": "mapping(address => struct StateUtils.Requests storage ref)"
                                  }
                                },
                                "id": 525,
                                "indexExpression": {
                                  "id": 524,
                                  "name": "_reqAddr",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 489,
                                  "src": "11708:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "11692:25:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Requests_$113_storage",
                                  "typeString": "struct StateUtils.Requests storage ref"
                                }
                              },
                              "id": 526,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "11718:10:0",
                              "memberName": "requester1",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 107,
                              "src": "11692:36:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes8",
                                "typeString": "bytes8"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "id": 527,
                              "name": "_default",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 500,
                              "src": "11732:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes8",
                                "typeString": "bytes8"
                              }
                            },
                            "src": "11692:48:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "commonType": {
                              "typeIdentifier": "t_bytes8",
                              "typeString": "bytes8"
                            },
                            "id": 534,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "expression": {
                                "baseExpression": {
                                  "id": 529,
                                  "name": "updateRequested",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 187,
                                  "src": "11748:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                                    "typeString": "mapping(address => struct StateUtils.Requests storage ref)"
                                  }
                                },
                                "id": 531,
                                "indexExpression": {
                                  "id": 530,
                                  "name": "_reqAddr",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 489,
                                  "src": "11764:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "11748:25:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Requests_$113_storage",
                                  "typeString": "struct StateUtils.Requests storage ref"
                                }
                              },
                              "id": 532,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "11774:10:0",
                              "memberName": "requester2",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 109,
                              "src": "11748:36:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes8",
                                "typeString": "bytes8"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "id": 533,
                              "name": "_default",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 500,
                              "src": "11788:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes8",
                                "typeString": "bytes8"
                              }
                            },
                            "src": "11748:48:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "11692:104:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "&&",
                        "rightExpression": {
                          "commonType": {
                            "typeIdentifier": "t_bytes8",
                            "typeString": "bytes8"
                          },
                          "id": 541,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 536,
                            "name": "_caller",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 491,
                            "src": "11804:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes8",
                              "typeString": "bytes8"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "expression": {
                              "baseExpression": {
                                "id": 537,
                                "name": "updateRequested",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 187,
                                "src": "11815:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                                  "typeString": "mapping(address => struct StateUtils.Requests storage ref)"
                                }
                              },
                              "id": 539,
                              "indexExpression": {
                                "id": 538,
                                "name": "_reqAddr",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 489,
                                "src": "11831:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "11815:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Requests_$113_storage",
                                "typeString": "struct StateUtils.Requests storage ref"
                              }
                            },
                            "id": 540,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "11841:10:0",
                            "memberName": "requester1",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 107,
                            "src": "11815:36:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes8",
                              "typeString": "bytes8"
                            }
                          },
                          "src": "11804:47:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "11692:159:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "&&",
                      "rightExpression": {
                        "commonType": {
                          "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                          "typeString": "enum StateUtils.ApprovalTypes"
                        },
                        "id": 548,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 543,
                          "name": "_reqType",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 494,
                          "src": "11859:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                            "typeString": "enum StateUtils.ApprovalTypes"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "expression": {
                            "baseExpression": {
                              "id": 544,
                              "name": "updateRequested",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 187,
                              "src": "11871:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                                "typeString": "mapping(address => struct StateUtils.Requests storage ref)"
                              }
                            },
                            "id": 546,
                            "indexExpression": {
                              "id": 545,
                              "name": "_reqAddr",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 489,
                              "src": "11887:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "11871:25:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Requests_$113_storage",
                              "typeString": "struct StateUtils.Requests storage ref"
                            }
                          },
                          "id": 547,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "11897:11:0",
                          "memberName": "requestType",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 112,
                          "src": "11871:37:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                            "typeString": "enum StateUtils.ApprovalTypes"
                          }
                        },
                        "src": "11859:49:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "src": "11692:216:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "falseBody": {
                      "condition": {
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 590,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 583,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "commonType": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "id": 576,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 569,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "commonType": {
                                  "typeIdentifier": "t_bytes8",
                                  "typeString": "bytes8"
                                },
                                "id": 562,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "expression": {
                                    "baseExpression": {
                                      "id": 557,
                                      "name": "updateRequested",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 187,
                                      "src": "11979:15:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                                        "typeString": "mapping(address => struct StateUtils.Requests storage ref)"
                                      }
                                    },
                                    "id": 559,
                                    "indexExpression": {
                                      "id": 558,
                                      "name": "_reqAddr",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 489,
                                      "src": "11995:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "11979:25:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Requests_$113_storage",
                                      "typeString": "struct StateUtils.Requests storage ref"
                                    }
                                  },
                                  "id": 560,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "12005:10:0",
                                  "memberName": "requester1",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 107,
                                  "src": "11979:36:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes8",
                                    "typeString": "bytes8"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "id": 561,
                                  "name": "_default",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 500,
                                  "src": "12019:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes8",
                                    "typeString": "bytes8"
                                  }
                                },
                                "src": "11979:48:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "&&",
                              "rightExpression": {
                                "commonType": {
                                  "typeIdentifier": "t_bytes8",
                                  "typeString": "bytes8"
                                },
                                "id": 568,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "expression": {
                                    "baseExpression": {
                                      "id": 563,
                                      "name": "updateRequested",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 187,
                                      "src": "12035:15:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                                        "typeString": "mapping(address => struct StateUtils.Requests storage ref)"
                                      }
                                    },
                                    "id": 565,
                                    "indexExpression": {
                                      "id": 564,
                                      "name": "_reqAddr",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 489,
                                      "src": "12051:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "12035:25:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Requests_$113_storage",
                                      "typeString": "struct StateUtils.Requests storage ref"
                                    }
                                  },
                                  "id": 566,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "12061:10:0",
                                  "memberName": "requester2",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 109,
                                  "src": "12035:36:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes8",
                                    "typeString": "bytes8"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "id": 567,
                                  "name": "_default",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 500,
                                  "src": "12075:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes8",
                                    "typeString": "bytes8"
                                  }
                                },
                                "src": "12035:48:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "11979:104:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "&&",
                            "rightExpression": {
                              "commonType": {
                                "typeIdentifier": "t_bytes8",
                                "typeString": "bytes8"
                              },
                              "id": 575,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "id": 570,
                                "name": "_caller",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 491,
                                "src": "12091:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes8",
                                  "typeString": "bytes8"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "expression": {
                                  "baseExpression": {
                                    "id": 571,
                                    "name": "updateRequested",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 187,
                                    "src": "12102:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                                      "typeString": "mapping(address => struct StateUtils.Requests storage ref)"
                                    }
                                  },
                                  "id": 573,
                                  "indexExpression": {
                                    "id": 572,
                                    "name": "_reqAddr",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 489,
                                    "src": "12118:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "12102:25:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Requests_$113_storage",
                                    "typeString": "struct StateUtils.Requests storage ref"
                                  }
                                },
                                "id": 574,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberLocation": "12128:10:0",
                                "memberName": "requester1",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 107,
                                "src": "12102:36:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes8",
                                  "typeString": "bytes8"
                                }
                              },
                              "src": "12091:47:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "src": "11979:159:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "commonType": {
                              "typeIdentifier": "t_bytes8",
                              "typeString": "bytes8"
                            },
                            "id": 582,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "id": 577,
                              "name": "_caller",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 491,
                              "src": "12146:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes8",
                                "typeString": "bytes8"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "expression": {
                                "baseExpression": {
                                  "id": 578,
                                  "name": "updateRequested",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 187,
                                  "src": "12157:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                                    "typeString": "mapping(address => struct StateUtils.Requests storage ref)"
                                  }
                                },
                                "id": 580,
                                "indexExpression": {
                                  "id": 579,
                                  "name": "_reqAddr",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 489,
                                  "src": "12173:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "12157:25:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Requests_$113_storage",
                                  "typeString": "struct StateUtils.Requests storage ref"
                                }
                              },
                              "id": 581,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "12183:10:0",
                              "memberName": "requester2",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 109,
                              "src": "12157:36:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes8",
                                "typeString": "bytes8"
                              }
                            },
                            "src": "12146:47:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "11979:214:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "&&",
                        "rightExpression": {
                          "commonType": {
                            "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                            "typeString": "enum StateUtils.ApprovalTypes"
                          },
                          "id": 589,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 584,
                            "name": "_reqType",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 494,
                            "src": "12201:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                              "typeString": "enum StateUtils.ApprovalTypes"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "expression": {
                              "baseExpression": {
                                "id": 585,
                                "name": "updateRequested",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 187,
                                "src": "12213:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                                  "typeString": "mapping(address => struct StateUtils.Requests storage ref)"
                                }
                              },
                              "id": 587,
                              "indexExpression": {
                                "id": 586,
                                "name": "_reqAddr",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 489,
                                "src": "12229:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "12213:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Requests_$113_storage",
                                "typeString": "struct StateUtils.Requests storage ref"
                              }
                            },
                            "id": 588,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "12239:11:0",
                            "memberName": "requestType",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 112,
                            "src": "12213:37:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                              "typeString": "enum StateUtils.ApprovalTypes"
                            }
                          },
                          "src": "12201:49:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "11979:271:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "id": 594,
                      "nodeType": "IfStatement",
                      "src": "11970:309:0",
                      "trueBody": {
                        "id": 593,
                        "nodeType": "Block",
                        "src": "12256:23:0",
                        "statements": [
                          {
                            "expression": {
                              "hexValue": "74727565",
                              "id": 591,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "12269:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            },
                            "functionReturnParameters": 498,
                            "id": 592,
                            "nodeType": "Return",
                            "src": "12262:11:0"
                          }
                        ]
                      }
                    },
                    "id": 595,
                    "nodeType": "IfStatement",
                    "src": "11683:596:0",
                    "trueBody": {
                      "expression": {
                        "id": 555,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftHandSide": {
                          "expression": {
                            "baseExpression": {
                              "id": 550,
                              "name": "updateRequested",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 187,
                              "src": "11914:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                                "typeString": "mapping(address => struct StateUtils.Requests storage ref)"
                              }
                            },
                            "id": 552,
                            "indexExpression": {
                              "id": 551,
                              "name": "_reqAddr",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 489,
                              "src": "11930:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "11914:25:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Requests_$113_storage",
                              "typeString": "struct StateUtils.Requests storage ref"
                            }
                          },
                          "id": 553,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": true,
                          "memberLocation": "11940:10:0",
                          "memberName": "requester2",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 109,
                          "src": "11914:36:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes8",
                            "typeString": "bytes8"
                          }
                        },
                        "nodeType": "Assignment",
                        "operator": "=",
                        "rightHandSide": {
                          "id": 554,
                          "name": "_caller",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 491,
                          "src": "11953:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes8",
                            "typeString": "bytes8"
                          }
                        },
                        "src": "11914:46:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes8",
                          "typeString": "bytes8"
                        }
                      },
                      "id": 556,
                      "nodeType": "ExpressionStatement",
                      "src": "11914:46:0"
                    }
                  },
                  "id": 596,
                  "nodeType": "IfStatement",
                  "src": "11511:768:0",
                  "trueBody": {
                    "id": 522,
                    "nodeType": "Block",
                    "src": "11565:112:0",
                    "statements": [
                      {
                        "expression": {
                          "id": 513,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "expression": {
                              "baseExpression": {
                                "id": 508,
                                "name": "updateRequested",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 187,
                                "src": "11571:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                                  "typeString": "mapping(address => struct StateUtils.Requests storage ref)"
                                }
                              },
                              "id": 510,
                              "indexExpression": {
                                "id": 509,
                                "name": "_reqAddr",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 489,
                                "src": "11587:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "11571:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Requests_$113_storage",
                                "typeString": "struct StateUtils.Requests storage ref"
                              }
                            },
                            "id": 511,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberLocation": "11597:10:0",
                            "memberName": "requester1",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 107,
                            "src": "11571:36:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes8",
                              "typeString": "bytes8"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "id": 512,
                            "name": "_caller",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 491,
                            "src": "11610:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes8",
                              "typeString": "bytes8"
                            }
                          },
                          "src": "11571:46:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes8",
                            "typeString": "bytes8"
                          }
                        },
                        "id": 514,
                        "nodeType": "ExpressionStatement",
                        "src": "11571:46:0"
                      },
                      {
                        "expression": {
                          "id": 520,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "expression": {
                              "baseExpression": {
                                "id": 515,
                                "name": "updateRequested",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 187,
                                "src": "11623:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Requests_$113_storage_$",
                                  "typeString": "mapping(address => struct StateUtils.Requests storage ref)"
                                }
                              },
                              "id": 517,
                              "indexExpression": {
                                "id": 516,
                                "name": "_reqAddr",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 489,
                                "src": "11639:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "11623:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Requests_$113_storage",
                                "typeString": "struct StateUtils.Requests storage ref"
                              }
                            },
                            "id": 518,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberLocation": "11649:11:0",
                            "memberName": "requestType",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 112,
                            "src": "11623:37:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                              "typeString": "enum StateUtils.ApprovalTypes"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "id": 519,
                            "name": "_reqType",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 494,
                            "src": "11663:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                              "typeString": "enum StateUtils.ApprovalTypes"
                            }
                          },
                          "src": "11623:48:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                            "typeString": "enum StateUtils.ApprovalTypes"
                          }
                        },
                        "id": 521,
                        "nodeType": "ExpressionStatement",
                        "src": "11623:48:0"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "hexValue": "66616c7365",
                    "id": 597,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "12290:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "false"
                  },
                  "functionReturnParameters": 498,
                  "id": 598,
                  "nodeType": "Return",
                  "src": "12283:12:0"
                }
              ]
            },
            "documentation": {
              "id": 487,
              "nodeType": "StructuredDocumentation",
              "src": "11069:289:0",
              "text": "@notice for variable updates that require update requests from three unique admins\n @param _reqAddr the address passed as the new protocol address\n @param _caller shortened form of the address of the calling admin\n @param _reqType: disambiguation for type of update call"
            },
            "id": 600,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_isRequestApproved",
            "nameLocation": "11370:18:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 495,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 489,
                  "mutability": "mutable",
                  "name": "_reqAddr",
                  "nameLocation": "11401:8:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 600,
                  "src": "11393:16:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 488,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "11393:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 491,
                  "mutability": "mutable",
                  "name": "_caller",
                  "nameLocation": "11421:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 600,
                  "src": "11414:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes8",
                    "typeString": "bytes8"
                  },
                  "typeName": {
                    "id": 490,
                    "name": "bytes8",
                    "nodeType": "ElementaryTypeName",
                    "src": "11414:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes8",
                      "typeString": "bytes8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 494,
                  "mutability": "mutable",
                  "name": "_reqType",
                  "nameLocation": "11447:8:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 600,
                  "src": "11433:22:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                    "typeString": "enum StateUtils.ApprovalTypes"
                  },
                  "typeName": {
                    "id": 493,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 492,
                      "name": "ApprovalTypes",
                      "nameLocations": [
                        "11433:13:0"
                      ],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 104,
                      "src": "11433:13:0"
                    },
                    "referencedDeclaration": 104,
                    "src": "11433:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_enum$_ApprovalTypes_$104",
                      "typeString": "enum StateUtils.ApprovalTypes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "11388:71:0"
            },
            "returnParameters": {
              "id": 498,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 497,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 600,
                  "src": "11478:4:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 496,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "11478:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "11477:6:0"
            },
            "scope": 615,
            "src": "11361:939:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 613,
              "nodeType": "Block",
              "src": "12767:607:0",
              "statements": [
                {
                  "AST": {
                    "nativeSrc": "12831:536:0",
                    "nodeType": "YulBlock",
                    "src": "12831:536:0",
                    "statements": [
                      {
                        "body": {
                          "nativeSrc": "13048:211:0",
                          "nodeType": "YulBlock",
                          "src": "13048:211:0",
                          "statements": [
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nativeSrc": "13143:4:0",
                                    "nodeType": "YulLiteral",
                                    "src": "13143:4:0",
                                    "type": "",
                                    "value": "0x00"
                                  },
                                  {
                                    "kind": "number",
                                    "nativeSrc": "13149:10:0",
                                    "nodeType": "YulLiteral",
                                    "src": "13149:10:0",
                                    "type": "",
                                    "value": "0xad251c27"
                                  }
                                ],
                                "functionName": {
                                  "name": "mstore",
                                  "nativeSrc": "13136:6:0",
                                  "nodeType": "YulIdentifier",
                                  "src": "13136:6:0"
                                },
                                "nativeSrc": "13136:24:0",
                                "nodeType": "YulFunctionCall",
                                "src": "13136:24:0"
                              },
                              "nativeSrc": "13136:24:0",
                              "nodeType": "YulExpressionStatement",
                              "src": "13136:24:0"
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nativeSrc": "13233:4:0",
                                    "nodeType": "YulLiteral",
                                    "src": "13233:4:0",
                                    "type": "",
                                    "value": "0x1c"
                                  },
                                  {
                                    "kind": "number",
                                    "nativeSrc": "13239:4:0",
                                    "nodeType": "YulLiteral",
                                    "src": "13239:4:0",
                                    "type": "",
                                    "value": "0x04"
                                  }
                                ],
                                "functionName": {
                                  "name": "revert",
                                  "nativeSrc": "13226:6:0",
                                  "nodeType": "YulIdentifier",
                                  "src": "13226:6:0"
                                },
                                "nativeSrc": "13226:18:0",
                                "nodeType": "YulFunctionCall",
                                "src": "13226:18:0"
                              },
                              "nativeSrc": "13226:18:0",
                              "nodeType": "YulExpressionStatement",
                              "src": "13226:18:0"
                            }
                          ]
                        },
                        "condition": {
                          "arguments": [
                            {
                              "arguments": [
                                {
                                  "name": "denominator",
                                  "nativeSrc": "12976:11:0",
                                  "nodeType": "YulIdentifier",
                                  "src": "12976:11:0"
                                },
                                {
                                  "arguments": [
                                    {
                                      "arguments": [
                                        {
                                          "name": "y",
                                          "nativeSrc": "13000:1:0",
                                          "nodeType": "YulIdentifier",
                                          "src": "13000:1:0"
                                        },
                                        {
                                          "arguments": [
                                            {
                                              "name": "x",
                                              "nativeSrc": "13006:1:0",
                                              "nodeType": "YulIdentifier",
                                              "src": "13006:1:0"
                                            },
                                            {
                                              "arguments": [
                                                {
                                                  "name": "MAX_UINT256",
                                                  "nativeSrc": "13013:11:0",
                                                  "nodeType": "YulIdentifier",
                                                  "src": "13013:11:0"
                                                },
                                                {
                                                  "name": "y",
                                                  "nativeSrc": "13026:1:0",
                                                  "nodeType": "YulIdentifier",
                                                  "src": "13026:1:0"
                                                }
                                              ],
                                              "functionName": {
                                                "name": "div",
                                                "nativeSrc": "13009:3:0",
                                                "nodeType": "YulIdentifier",
                                                "src": "13009:3:0"
                                              },
                                              "nativeSrc": "13009:19:0",
                                              "nodeType": "YulFunctionCall",
                                              "src": "13009:19:0"
                                            }
                                          ],
                                          "functionName": {
                                            "name": "gt",
                                            "nativeSrc": "13003:2:0",
                                            "nodeType": "YulIdentifier",
                                            "src": "13003:2:0"
                                          },
                                          "nativeSrc": "13003:26:0",
                                          "nodeType": "YulFunctionCall",
                                          "src": "13003:26:0"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mul",
                                        "nativeSrc": "12996:3:0",
                                        "nodeType": "YulIdentifier",
                                        "src": "12996:3:0"
                                      },
                                      "nativeSrc": "12996:34:0",
                                      "nodeType": "YulFunctionCall",
                                      "src": "12996:34:0"
                                    }
                                  ],
                                  "functionName": {
                                    "name": "iszero",
                                    "nativeSrc": "12989:6:0",
                                    "nodeType": "YulIdentifier",
                                    "src": "12989:6:0"
                                  },
                                  "nativeSrc": "12989:42:0",
                                  "nodeType": "YulFunctionCall",
                                  "src": "12989:42:0"
                                }
                              ],
                              "functionName": {
                                "name": "mul",
                                "nativeSrc": "12972:3:0",
                                "nodeType": "YulIdentifier",
                                "src": "12972:3:0"
                              },
                              "nativeSrc": "12972:60:0",
                              "nodeType": "YulFunctionCall",
                              "src": "12972:60:0"
                            }
                          ],
                          "functionName": {
                            "name": "iszero",
                            "nativeSrc": "12947:6:0",
                            "nodeType": "YulIdentifier",
                            "src": "12947:6:0"
                          },
                          "nativeSrc": "12947:100:0",
                          "nodeType": "YulFunctionCall",
                          "src": "12947:100:0"
                        },
                        "nativeSrc": "12944:315:0",
                        "nodeType": "YulIf",
                        "src": "12944:315:0"
                      },
                      {
                        "nativeSrc": "13324:32:0",
                        "nodeType": "YulAssignment",
                        "src": "13324:32:0",
                        "value": {
                          "arguments": [
                            {
                              "arguments": [
                                {
                                  "name": "x",
                                  "nativeSrc": "13337:1:0",
                                  "nodeType": "YulIdentifier",
                                  "src": "13337:1:0"
                                },
                                {
                                  "name": "y",
                                  "nativeSrc": "13340:1:0",
                                  "nodeType": "YulIdentifier",
                                  "src": "13340:1:0"
                                }
                              ],
                              "functionName": {
                                "name": "mul",
                                "nativeSrc": "13333:3:0",
                                "nodeType": "YulIdentifier",
                                "src": "13333:3:0"
                              },
                              "nativeSrc": "13333:9:0",
                              "nodeType": "YulFunctionCall",
                              "src": "13333:9:0"
                            },
                            {
                              "name": "denominator",
                              "nativeSrc": "13344:11:0",
                              "nodeType": "YulIdentifier",
                              "src": "13344:11:0"
                            }
                          ],
                          "functionName": {
                            "name": "div",
                            "nativeSrc": "13329:3:0",
                            "nodeType": "YulIdentifier",
                            "src": "13329:3:0"
                          },
                          "nativeSrc": "13329:27:0",
                          "nodeType": "YulFunctionCall",
                          "src": "13329:27:0"
                        },
                        "variableNames": [
                          {
                            "name": "z",
                            "nativeSrc": "13324:1:0",
                            "nodeType": "YulIdentifier",
                            "src": "13324:1:0"
                          }
                        ]
                      }
                    ]
                  },
                  "documentation": "@solidity memory-safe-assembly",
                  "evmVersion": "shanghai",
                  "externalReferences": [
                    {
                      "declaration": 126,
                      "isOffset": false,
                      "isSlot": false,
                      "src": "13013:11:0",
                      "valueSize": 1
                    },
                    {
                      "declaration": 607,
                      "isOffset": false,
                      "isSlot": false,
                      "src": "12976:11:0",
                      "valueSize": 1
                    },
                    {
                      "declaration": 607,
                      "isOffset": false,
                      "isSlot": false,
                      "src": "13344:11:0",
                      "valueSize": 1
                    },
                    {
                      "declaration": 603,
                      "isOffset": false,
                      "isSlot": false,
                      "src": "13006:1:0",
                      "valueSize": 1
                    },
                    {
                      "declaration": 603,
                      "isOffset": false,
                      "isSlot": false,
                      "src": "13337:1:0",
                      "valueSize": 1
                    },
                    {
                      "declaration": 605,
                      "isOffset": false,
                      "isSlot": false,
                      "src": "13000:1:0",
                      "valueSize": 1
                    },
                    {
                      "declaration": 605,
                      "isOffset": false,
                      "isSlot": false,
                      "src": "13026:1:0",
                      "valueSize": 1
                    },
                    {
                      "declaration": 605,
                      "isOffset": false,
                      "isSlot": false,
                      "src": "13340:1:0",
                      "valueSize": 1
                    },
                    {
                      "declaration": 610,
                      "isOffset": false,
                      "isSlot": false,
                      "src": "13324:1:0",
                      "valueSize": 1
                    }
                  ],
                  "id": 612,
                  "nodeType": "InlineAssembly",
                  "src": "12822:545:0"
                }
              ]
            },
            "documentation": {
              "id": 601,
              "nodeType": "StructuredDocumentation",
              "src": "12308:321:0",
              "text": "@dev SolDAO gas-efficient multiplication and division function, see https://github.com/Sol-DAO/solbase/blob/main/src/utils/FixedPointMath.sol\n @param x: numerator, to be multiplied by 'y'\n @param y: numerator, to be multiplied by 'x'\n @param denominator: divisor for the product of 'x' and 'y'"
            },
            "id": 614,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_mulDivDown",
            "nameLocation": "12644:11:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 608,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 603,
                  "mutability": "mutable",
                  "name": "x",
                  "nameLocation": "12674:1:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 614,
                  "src": "12666:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 602,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12666:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 605,
                  "mutability": "mutable",
                  "name": "y",
                  "nameLocation": "12694:1:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 614,
                  "src": "12686:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 604,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12686:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 607,
                  "mutability": "mutable",
                  "name": "denominator",
                  "nameLocation": "12714:11:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 614,
                  "src": "12706:19:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 606,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12706:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "12655:77:0"
            },
            "returnParameters": {
              "id": 611,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 610,
                  "mutability": "mutable",
                  "name": "z",
                  "nameLocation": "12764:1:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 614,
                  "src": "12756:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 609,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12756:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "12755:11:0"
            },
            "scope": 615,
            "src": "12635:739:0",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 2968,
        "src": "1560:11817:0",
        "usedErrors": [
          189,
          191,
          193,
          195,
          197,
          199,
          201,
          203,
          205,
          207,
          209,
          211,
          213,
          215,
          217,
          219,
          221,
          223,
          225,
          227,
          229,
          231,
          233,
          235,
          237,
          239,
          2972
        ],
        "usedEvents": []
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "baseName": {
              "id": 617,
              "name": "StateUtils",
              "nameLocations": [
                "13459:10:0"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 615,
              "src": "13459:10:0"
            },
            "id": 618,
            "nodeType": "InheritanceSpecifier",
            "src": "13459:10:0"
          }
        ],
        "canonicalName": "GetterUtils",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 616,
          "nodeType": "StructuredDocumentation",
          "src": "13381:45:0",
          "text": "@title Contract that implements getters"
        },
        "fullyImplemented": true,
        "id": 1009,
        "linearizedBaseContracts": [
          1009,
          615,
          2995
        ],
        "name": "GetterUtils",
        "nameLocation": "13444:11:0",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 651,
              "nodeType": "Block",
              "src": "13848:290:0",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 636,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "arguments": [
                        {
                          "id": 629,
                          "name": "_userAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 621,
                          "src": "13938:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "id": 630,
                          "name": "_block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 623,
                          "src": "13952:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "id": 628,
                        "name": "userDelegateAt",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 745,
                        "src": "13923:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_address_$",
                          "typeString": "function (address,uint256) view returns (address)"
                        }
                      },
                      "id": 631,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "13923:36:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "arguments": [
                        {
                          "hexValue": "30",
                          "id": 634,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "13971:1:0",
                          "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": 633,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "13963:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 632,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "13963:7:0",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 635,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "13963:10:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "13923:50:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 640,
                  "nodeType": "IfStatement",
                  "src": "13919:91:0",
                  "trueBody": {
                    "id": 639,
                    "nodeType": "Block",
                    "src": "13975:35:0",
                    "statements": [
                      {
                        "expression": {
                          "hexValue": "30",
                          "id": 637,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "13997:1:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "functionReturnParameters": 627,
                        "id": 638,
                        "nodeType": "Return",
                        "src": "13990:8:0"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 649,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "arguments": [
                        {
                          "id": 642,
                          "name": "_userAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 621,
                          "src": "14053:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "id": 643,
                          "name": "_block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 623,
                          "src": "14067:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "id": 641,
                        "name": "userSharesAt",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 685,
                        "src": "14040:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                          "typeString": "function (address,uint256) view returns (uint256)"
                        }
                      },
                      "id": 644,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "14040:34:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "arguments": [
                        {
                          "id": 646,
                          "name": "_userAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 621,
                          "src": "14109:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "id": 647,
                          "name": "_block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 623,
                          "src": "14123:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "id": 645,
                        "name": "delegatedToUserAt",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 726,
                        "src": "14091:17:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                          "typeString": "function (address,uint256) view returns (uint256)"
                        }
                      },
                      "id": 648,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "14091:39:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "14040:90:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 627,
                  "id": 650,
                  "nodeType": "Return",
                  "src": "14020:110:0"
                }
              ]
            },
            "documentation": {
              "id": 619,
              "nodeType": "StructuredDocumentation",
              "src": "13477:243:0",
              "text": "@notice Called to get the voting power of a user at a specific block\n @param _userAddress User address\n @param _block Block number for which the query is being made for\n @return Voting power of the user at the block"
            },
            "functionSelector": "4f8a137f",
            "id": 652,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "userVotingPowerAt",
            "nameLocation": "13735:17:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 624,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 621,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "13771:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 652,
                  "src": "13763:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 620,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13763:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 623,
                  "mutability": "mutable",
                  "name": "_block",
                  "nameLocation": "13802:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 652,
                  "src": "13794:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 622,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13794:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "13752:63:0"
            },
            "returnParameters": {
              "id": 627,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 626,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 652,
                  "src": "13839:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 625,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13839:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "13838:9:0"
            },
            "scope": 1009,
            "src": "13726:412:0",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 665,
              "nodeType": "Block",
              "src": "14481:57:0",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 661,
                        "name": "poolShares",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 181,
                        "src": "14511:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        }
                      },
                      {
                        "id": 662,
                        "name": "_block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 655,
                        "src": "14523:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 660,
                      "name": "_getValueAt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 881,
                      "src": "14499:11:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (struct StateUtils.Checkpoint storage ref[] storage pointer,uint256) view returns (uint256)"
                      }
                    },
                    "id": 663,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "14499:31:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 659,
                  "id": 664,
                  "nodeType": "Return",
                  "src": "14492:38:0"
                }
              ]
            },
            "documentation": {
              "id": 653,
              "nodeType": "StructuredDocumentation",
              "src": "14146:260:0",
              "text": "@notice Called to get the total pool shares at a specific block\n @dev Total pool shares also corresponds to total voting power\n @param _block Block number for which the query is being made for\n @return Total pool shares at the block"
            },
            "functionSelector": "3b490a5d",
            "id": 666,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "totalSharesAt",
            "nameLocation": "14421:13:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 656,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 655,
                  "mutability": "mutable",
                  "name": "_block",
                  "nameLocation": "14443:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 666,
                  "src": "14435:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 654,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "14435:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "14434:16:0"
            },
            "returnParameters": {
              "id": 659,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 658,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 666,
                  "src": "14472:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 657,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "14472:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "14471:9:0"
            },
            "scope": 1009,
            "src": "14412:126:0",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 684,
              "nodeType": "Block",
              "src": "14906:72:0",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "baseExpression": {
                            "id": 677,
                            "name": "users",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 164,
                            "src": "14936:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                              "typeString": "mapping(address => struct StateUtils.User storage ref)"
                            }
                          },
                          "id": 679,
                          "indexExpression": {
                            "id": 678,
                            "name": "userAddress",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 669,
                            "src": "14942:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "14936:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage",
                            "typeString": "struct StateUtils.User storage ref"
                          }
                        },
                        "id": 680,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "14955:6:0",
                        "memberName": "shares",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 81,
                        "src": "14936:25:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        }
                      },
                      {
                        "id": 681,
                        "name": "_block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 671,
                        "src": "14963:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 676,
                      "name": "_getValueAt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 881,
                      "src": "14924:11:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (struct StateUtils.Checkpoint storage ref[] storage pointer,uint256) view returns (uint256)"
                      }
                    },
                    "id": 682,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "14924:46:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 675,
                  "id": 683,
                  "nodeType": "Return",
                  "src": "14917:53:0"
                }
              ]
            },
            "documentation": {
              "id": 667,
              "nodeType": "StructuredDocumentation",
              "src": "14546:240:0",
              "text": "@notice Called to get the pool shares of a user at a specific block\n @param userAddress User address\n @param _block Block number for which the query is being made for\n @return Pool shares of the user at the block"
            },
            "functionSelector": "fc5da2aa",
            "id": 685,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "userSharesAt",
            "nameLocation": "14801:12:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 672,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 669,
                  "mutability": "mutable",
                  "name": "userAddress",
                  "nameLocation": "14832:11:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 685,
                  "src": "14824:19:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 668,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "14824:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 671,
                  "mutability": "mutable",
                  "name": "_block",
                  "nameLocation": "14862:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 685,
                  "src": "14854:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 670,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "14854:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "14813:62:0"
            },
            "returnParameters": {
              "id": 675,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 674,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 685,
                  "src": "14897:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 673,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "14897:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "14896:9:0"
            },
            "scope": 1009,
            "src": "14792:186:0",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 706,
              "nodeType": "Block",
              "src": "15327:199:0",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 695,
                            "name": "_userAddress",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 688,
                            "src": "15401:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "expression": {
                              "id": 696,
                              "name": "block",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -4,
                              "src": "15415:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_block",
                                "typeString": "block"
                              }
                            },
                            "id": 697,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "15421:6:0",
                            "memberName": "number",
                            "nodeType": "MemberAccess",
                            "src": "15415:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 694,
                          "name": "userSharesAt",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 685,
                          "src": "15388:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                            "typeString": "function (address,uint256) view returns (uint256)"
                          }
                        },
                        "id": 698,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "15388:40:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 699,
                        "name": "totalStake",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 158,
                        "src": "15447:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "expression": {
                              "id": 701,
                              "name": "block",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -4,
                              "src": "15490:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_block",
                                "typeString": "block"
                              }
                            },
                            "id": 702,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "15496:6:0",
                            "memberName": "number",
                            "nodeType": "MemberAccess",
                            "src": "15490:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 700,
                          "name": "totalSharesAt",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 666,
                          "src": "15476:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$",
                            "typeString": "function (uint256) view returns (uint256)"
                          }
                        },
                        "id": 703,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "15476:27:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 693,
                      "name": "_mulDivDown",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 614,
                      "src": "15358:11:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256,uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 704,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "15358:160:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 692,
                  "id": 705,
                  "nodeType": "Return",
                  "src": "15338:180:0"
                }
              ]
            },
            "documentation": {
              "id": 686,
              "nodeType": "StructuredDocumentation",
              "src": "14986:264:0",
              "text": "@notice Called to get the current staked tokens of the user\n @dev any DAO voting app should call here to ensure a voter's stake and calculate weighting of vote\n @param _userAddress User address\n @return Current staked tokens of the user"
            },
            "functionSelector": "68e5585d",
            "id": 707,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "userStake",
            "nameLocation": "15265:9:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 689,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 688,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "15283:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 707,
                  "src": "15275:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 687,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "15275:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "15274:22:0"
            },
            "returnParameters": {
              "id": 692,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 691,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 707,
                  "src": "15318:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 690,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "15318:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "15317:9:0"
            },
            "scope": 1009,
            "src": "15256:270:0",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 725,
              "nodeType": "Block",
              "src": "15923:78:0",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "baseExpression": {
                            "id": 718,
                            "name": "users",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 164,
                            "src": "15953:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                              "typeString": "mapping(address => struct StateUtils.User storage ref)"
                            }
                          },
                          "id": 720,
                          "indexExpression": {
                            "id": 719,
                            "name": "_userAddress",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 710,
                            "src": "15959:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "15953:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage",
                            "typeString": "struct StateUtils.User storage ref"
                          }
                        },
                        "id": 721,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "15973:11:0",
                        "memberName": "delegatedTo",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 85,
                        "src": "15953:31:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        }
                      },
                      {
                        "id": 722,
                        "name": "_block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 712,
                        "src": "15986:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 717,
                      "name": "_getValueAt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 881,
                      "src": "15941:11:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (struct StateUtils.Checkpoint storage ref[] storage pointer,uint256) view returns (uint256)"
                      }
                    },
                    "id": 723,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "15941:52:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 716,
                  "id": 724,
                  "nodeType": "Return",
                  "src": "15934:59:0"
                }
              ]
            },
            "documentation": {
              "id": 708,
              "nodeType": "StructuredDocumentation",
              "src": "15534:263:0",
              "text": "@notice Called to get the voting power delegated to a user at a specific block\n @param _userAddress User address\n @param _block Block number for which the query is being made for\n @return Voting power delegated to the user at the block"
            },
            "functionSelector": "bf577a00",
            "id": 726,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "delegatedToUserAt",
            "nameLocation": "15812:17:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 713,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 710,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "15848:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 726,
                  "src": "15840:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 709,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "15840:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 712,
                  "mutability": "mutable",
                  "name": "_block",
                  "nameLocation": "15879:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 726,
                  "src": "15871:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 711,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "15871:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "15829:63:0"
            },
            "returnParameters": {
              "id": 716,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 715,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 726,
                  "src": "15914:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 714,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "15914:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "15913:9:0"
            },
            "scope": 1009,
            "src": "15803:198:0",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 744,
              "nodeType": "Block",
              "src": "16340:78:0",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "baseExpression": {
                            "id": 737,
                            "name": "users",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 164,
                            "src": "16372:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                              "typeString": "mapping(address => struct StateUtils.User storage ref)"
                            }
                          },
                          "id": 739,
                          "indexExpression": {
                            "id": 738,
                            "name": "_userAddress",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 729,
                            "src": "16378:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "16372:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage",
                            "typeString": "struct StateUtils.User storage ref"
                          }
                        },
                        "id": 740,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "16392:9:0",
                        "memberName": "delegates",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 89,
                        "src": "16372:29:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage",
                          "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage ref"
                        }
                      },
                      {
                        "id": 741,
                        "name": "_block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 731,
                        "src": "16403:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage",
                          "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage ref"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 736,
                      "name": "_getAddressAt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1008,
                      "src": "16358:13:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr_$_t_uint256_$returns$_t_address_$",
                        "typeString": "function (struct StateUtils.AddressCheckpoint storage ref[] storage pointer,uint256) view returns (address)"
                      }
                    },
                    "id": 742,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16358:52:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 735,
                  "id": 743,
                  "nodeType": "Return",
                  "src": "16351:59:0"
                }
              ]
            },
            "documentation": {
              "id": 727,
              "nodeType": "StructuredDocumentation",
              "src": "16009:208:0",
              "text": "@notice Called to get the delegate of the user at a specific block\n @param _userAddress User address\n @param _block Block number\n @return Delegate of the user at the specific block"
            },
            "functionSelector": "cad2ab25",
            "id": 745,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "userDelegateAt",
            "nameLocation": "16232:14:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 732,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 729,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "16265:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 745,
                  "src": "16257:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 728,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "16257:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 731,
                  "mutability": "mutable",
                  "name": "_block",
                  "nameLocation": "16296:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 745,
                  "src": "16288:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 730,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "16288:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "16246:63:0"
            },
            "returnParameters": {
              "id": 735,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 734,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 745,
                  "src": "16331:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 733,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "16331:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "16330:9:0"
            },
            "scope": 1009,
            "src": "16223:195:0",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 759,
              "nodeType": "Block",
              "src": "16652:68:0",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 754,
                        "name": "_userAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 748,
                        "src": "16685:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "expression": {
                          "id": 755,
                          "name": "block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -4,
                          "src": "16699:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_block",
                            "typeString": "block"
                          }
                        },
                        "id": 756,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "16705:6:0",
                        "memberName": "number",
                        "nodeType": "MemberAccess",
                        "src": "16699:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 753,
                      "name": "userDelegateAt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 745,
                      "src": "16670:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_address_$",
                        "typeString": "function (address,uint256) view returns (address)"
                      }
                    },
                    "id": 757,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16670:42:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 752,
                  "id": 758,
                  "nodeType": "Return",
                  "src": "16663:49:0"
                }
              ]
            },
            "documentation": {
              "id": 746,
              "nodeType": "StructuredDocumentation",
              "src": "16426:146:0",
              "text": "@notice Called to get the current delegate of the user\n @param _userAddress User address\n @return Current delegate of the user"
            },
            "functionSelector": "b330fc53",
            "id": 760,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "userDelegate",
            "nameLocation": "16587:12:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 749,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 748,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "16608:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 760,
                  "src": "16600:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 747,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "16600:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "16599:22:0"
            },
            "returnParameters": {
              "id": 752,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 751,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 760,
                  "src": "16643:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 750,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "16643:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "16642:9:0"
            },
            "scope": 1009,
            "src": "16578:142:0",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 880,
              "nodeType": "Block",
              "src": "17273:1033:0",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 775,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 772,
                        "name": "checkpoints",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 765,
                        "src": "17288:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage pointer"
                        }
                      },
                      "id": 773,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "17300:6:0",
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "17288:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 774,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "17310:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "17288:23:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 778,
                  "nodeType": "IfStatement",
                  "src": "17284:37:0",
                  "trueBody": {
                    "expression": {
                      "hexValue": "30",
                      "id": 776,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "17320:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "functionReturnParameters": 771,
                    "id": 777,
                    "nodeType": "Return",
                    "src": "17313:8:0"
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 787,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 779,
                      "name": "_block",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 767,
                      "src": "17380:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">=",
                    "rightExpression": {
                      "expression": {
                        "baseExpression": {
                          "id": 780,
                          "name": "checkpoints",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 765,
                          "src": "17390:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                            "typeString": "struct StateUtils.Checkpoint storage ref[] storage pointer"
                          }
                        },
                        "id": 785,
                        "indexExpression": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 784,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 781,
                              "name": "checkpoints",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 765,
                              "src": "17402:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                                "typeString": "struct StateUtils.Checkpoint storage ref[] storage pointer"
                              }
                            },
                            "id": 782,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "17414:6:0",
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "src": "17402:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "hexValue": "31",
                            "id": 783,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "17423:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_1_by_1",
                              "typeString": "int_const 1"
                            },
                            "value": "1"
                          },
                          "src": "17402:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "17390:35:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Checkpoint_$76_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref"
                        }
                      },
                      "id": 786,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "17426:9:0",
                      "memberName": "fromBlock",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 73,
                      "src": "17390:45:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "src": "17380:55:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 796,
                  "nodeType": "IfStatement",
                  "src": "17376:122:0",
                  "trueBody": {
                    "expression": {
                      "expression": {
                        "baseExpression": {
                          "id": 788,
                          "name": "checkpoints",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 765,
                          "src": "17457:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                            "typeString": "struct StateUtils.Checkpoint storage ref[] storage pointer"
                          }
                        },
                        "id": 793,
                        "indexExpression": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 792,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 789,
                              "name": "checkpoints",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 765,
                              "src": "17469:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                                "typeString": "struct StateUtils.Checkpoint storage ref[] storage pointer"
                              }
                            },
                            "id": 790,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "17481:6:0",
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "src": "17469:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "hexValue": "31",
                            "id": 791,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "17490:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_1_by_1",
                              "typeString": "int_const 1"
                            },
                            "value": "1"
                          },
                          "src": "17469:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "17457:35:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Checkpoint_$76_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref"
                        }
                      },
                      "id": 794,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "17493:5:0",
                      "memberName": "value",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 75,
                      "src": "17457:41:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint224",
                        "typeString": "uint224"
                      }
                    },
                    "functionReturnParameters": 771,
                    "id": 795,
                    "nodeType": "Return",
                    "src": "17450:48:0"
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 802,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 797,
                      "name": "_block",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 767,
                      "src": "17513:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "expression": {
                        "baseExpression": {
                          "id": 798,
                          "name": "checkpoints",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 765,
                          "src": "17522:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                            "typeString": "struct StateUtils.Checkpoint storage ref[] storage pointer"
                          }
                        },
                        "id": 800,
                        "indexExpression": {
                          "hexValue": "30",
                          "id": 799,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "17534:1:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "17522:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Checkpoint_$76_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref"
                        }
                      },
                      "id": 801,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "17537:9:0",
                      "memberName": "fromBlock",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 73,
                      "src": "17522:24:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "src": "17513:33:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 805,
                  "nodeType": "IfStatement",
                  "src": "17509:47:0",
                  "trueBody": {
                    "expression": {
                      "hexValue": "30",
                      "id": 803,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "17555:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "functionReturnParameters": 771,
                    "id": 804,
                    "nodeType": "Return",
                    "src": "17548:8:0"
                  }
                },
                {
                  "assignments": [
                    807
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 807,
                      "mutability": "mutable",
                      "name": "_min",
                      "nameLocation": "17697:4:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 880,
                      "src": "17689:12:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 806,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "17689:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 809,
                  "initialValue": {
                    "hexValue": "30",
                    "id": 808,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "17704:1:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_0_by_1",
                      "typeString": "int_const 0"
                    },
                    "value": "0"
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "17689:16:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 823,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 813,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "expression": {
                          "id": 810,
                          "name": "checkpoints",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 765,
                          "src": "17734:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                            "typeString": "struct StateUtils.Checkpoint storage ref[] storage pointer"
                          }
                        },
                        "id": 811,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "17746:6:0",
                        "memberName": "length",
                        "nodeType": "MemberAccess",
                        "src": "17734:18:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": ">",
                      "rightExpression": {
                        "hexValue": "31303234",
                        "id": 812,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "17755:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_1024_by_1",
                          "typeString": "int_const 1024"
                        },
                        "value": "1024"
                      },
                      "src": "17734:25:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "&&",
                    "rightExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 822,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "expression": {
                          "baseExpression": {
                            "id": 814,
                            "name": "checkpoints",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 765,
                            "src": "17776:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                              "typeString": "struct StateUtils.Checkpoint storage ref[] storage pointer"
                            }
                          },
                          "id": 819,
                          "indexExpression": {
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 818,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "expression": {
                                "id": 815,
                                "name": "checkpoints",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 765,
                                "src": "17788:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                                  "typeString": "struct StateUtils.Checkpoint storage ref[] storage pointer"
                                }
                              },
                              "id": 816,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "17800:6:0",
                              "memberName": "length",
                              "nodeType": "MemberAccess",
                              "src": "17788:18:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "-",
                            "rightExpression": {
                              "hexValue": "31303234",
                              "id": 817,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "17809:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1024_by_1",
                                "typeString": "int_const 1024"
                              },
                              "value": "1024"
                            },
                            "src": "17788:25:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "17776:38:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Checkpoint_$76_storage",
                            "typeString": "struct StateUtils.Checkpoint storage ref"
                          }
                        },
                        "id": 820,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "17815:9:0",
                        "memberName": "fromBlock",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 73,
                        "src": "17776:48:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "<",
                      "rightExpression": {
                        "id": 821,
                        "name": "_block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 767,
                        "src": "17827:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "17776:57:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "17734:99:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 832,
                  "nodeType": "IfStatement",
                  "src": "17716:188:0",
                  "trueBody": {
                    "id": 831,
                    "nodeType": "Block",
                    "src": "17845:59:0",
                    "statements": [
                      {
                        "expression": {
                          "id": 829,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "id": 824,
                            "name": "_min",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 807,
                            "src": "17860:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 828,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "expression": {
                                "id": 825,
                                "name": "checkpoints",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 765,
                                "src": "17867:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                                  "typeString": "struct StateUtils.Checkpoint storage ref[] storage pointer"
                                }
                              },
                              "id": 826,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "17879:6:0",
                              "memberName": "length",
                              "nodeType": "MemberAccess",
                              "src": "17867:18:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "-",
                            "rightExpression": {
                              "hexValue": "31303234",
                              "id": 827,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "17888:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1024_by_1",
                                "typeString": "int_const 1024"
                              },
                              "value": "1024"
                            },
                            "src": "17867:25:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "17860:32:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 830,
                        "nodeType": "ExpressionStatement",
                        "src": "17860:32:0"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    834
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 834,
                      "mutability": "mutable",
                      "name": "_max",
                      "nameLocation": "17976:4:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 880,
                      "src": "17968:12:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 833,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "17968:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 839,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 838,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 835,
                        "name": "checkpoints",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 765,
                        "src": "17983:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage pointer"
                        }
                      },
                      "id": 836,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "17995:6:0",
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "17983:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "hexValue": "31",
                      "id": 837,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "18004:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_1_by_1",
                        "typeString": "int_const 1"
                      },
                      "value": "1"
                    },
                    "src": "17983:22:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "17968:37:0"
                },
                {
                  "body": {
                    "id": 873,
                    "nodeType": "Block",
                    "src": "18036:222:0",
                    "statements": [
                      {
                        "assignments": [
                          844
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 844,
                            "mutability": "mutable",
                            "name": "_mid",
                            "nameLocation": "18059:4:0",
                            "nodeType": "VariableDeclaration",
                            "scope": 873,
                            "src": "18051:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 843,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "18051:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 853,
                        "initialValue": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 852,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "components": [
                              {
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 849,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 847,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "id": 845,
                                    "name": "_max",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 834,
                                    "src": "18067:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "+",
                                  "rightExpression": {
                                    "id": 846,
                                    "name": "_min",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 807,
                                    "src": "18074:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "18067:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "+",
                                "rightExpression": {
                                  "hexValue": "31",
                                  "id": 848,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "18081:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_1_by_1",
                                    "typeString": "int_const 1"
                                  },
                                  "value": "1"
                                },
                                "src": "18067:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 850,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "18066:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "/",
                          "rightExpression": {
                            "hexValue": "32",
                            "id": 851,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "18086:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_2_by_1",
                              "typeString": "int_const 2"
                            },
                            "value": "2"
                          },
                          "src": "18066:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "18051:36:0"
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 859,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "baseExpression": {
                                "id": 854,
                                "name": "checkpoints",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 765,
                                "src": "18106:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                                  "typeString": "struct StateUtils.Checkpoint storage ref[] storage pointer"
                                }
                              },
                              "id": 856,
                              "indexExpression": {
                                "id": 855,
                                "name": "_mid",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 844,
                                "src": "18118:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "18106:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Checkpoint_$76_storage",
                                "typeString": "struct StateUtils.Checkpoint storage ref"
                              }
                            },
                            "id": 857,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "18124:9:0",
                            "memberName": "fromBlock",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 73,
                            "src": "18106:27:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<=",
                          "rightExpression": {
                            "id": 858,
                            "name": "_block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 767,
                            "src": "18137:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "18106:37:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 871,
                          "nodeType": "Block",
                          "src": "18197:50:0",
                          "statements": [
                            {
                              "expression": {
                                "id": 869,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "id": 865,
                                  "name": "_max",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 834,
                                  "src": "18216:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 868,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "id": 866,
                                    "name": "_mid",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 844,
                                    "src": "18223:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "-",
                                  "rightExpression": {
                                    "hexValue": "31",
                                    "id": 867,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "18230:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_1_by_1",
                                      "typeString": "int_const 1"
                                    },
                                    "value": "1"
                                  },
                                  "src": "18223:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "18216:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 870,
                              "nodeType": "ExpressionStatement",
                              "src": "18216:15:0"
                            }
                          ]
                        },
                        "id": 872,
                        "nodeType": "IfStatement",
                        "src": "18102:145:0",
                        "trueBody": {
                          "id": 864,
                          "nodeType": "Block",
                          "src": "18145:46:0",
                          "statements": [
                            {
                              "expression": {
                                "id": 862,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "id": 860,
                                  "name": "_min",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 807,
                                  "src": "18164:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "id": 861,
                                  "name": "_mid",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 844,
                                  "src": "18171:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "18164:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 863,
                              "nodeType": "ExpressionStatement",
                              "src": "18164:11:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 842,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 840,
                      "name": "_max",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 834,
                      "src": "18023:4:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "id": 841,
                      "name": "_min",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 807,
                      "src": "18030:4:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "18023:11:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 874,
                  "nodeType": "WhileStatement",
                  "src": "18016:242:0"
                },
                {
                  "expression": {
                    "expression": {
                      "baseExpression": {
                        "id": 875,
                        "name": "checkpoints",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 765,
                        "src": "18275:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage pointer"
                        }
                      },
                      "id": 877,
                      "indexExpression": {
                        "id": 876,
                        "name": "_min",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 807,
                        "src": "18287:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "18275:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Checkpoint_$76_storage",
                        "typeString": "struct StateUtils.Checkpoint storage ref"
                      }
                    },
                    "id": 878,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberLocation": "18293:5:0",
                    "memberName": "value",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 75,
                    "src": "18275:23:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint224",
                      "typeString": "uint224"
                    }
                  },
                  "functionReturnParameters": 771,
                  "id": 879,
                  "nodeType": "Return",
                  "src": "18268:30:0"
                }
              ]
            },
            "documentation": {
              "id": 761,
              "nodeType": "StructuredDocumentation",
              "src": "16728:411:0",
              "text": "@notice Called to get the value of a checkpoint array at a specific block using binary search.\n @dev Adapted from https://github.com/aragon/minime/blob/1d5251fc88eee5024ff318d95bc9f4c5de130430/contracts/MiniMeToken.sol#L431\n @param checkpoints Checkpoints array\n @param _block block number for which the query is being made\n @return Value of the checkpoint array at the block"
            },
            "id": 881,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_getValueAt",
            "nameLocation": "17154:11:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 768,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 765,
                  "mutability": "mutable",
                  "name": "checkpoints",
                  "nameLocation": "17197:11:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 881,
                  "src": "17176:32:0",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                    "typeString": "struct StateUtils.Checkpoint[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 763,
                      "nodeType": "UserDefinedTypeName",
                      "pathNode": {
                        "id": 762,
                        "name": "Checkpoint",
                        "nameLocations": [
                          "17176:10:0"
                        ],
                        "nodeType": "IdentifierPath",
                        "referencedDeclaration": 76,
                        "src": "17176:10:0"
                      },
                      "referencedDeclaration": 76,
                      "src": "17176:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Checkpoint_$76_storage_ptr",
                        "typeString": "struct StateUtils.Checkpoint"
                      }
                    },
                    "id": 764,
                    "nodeType": "ArrayTypeName",
                    "src": "17176:12:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr",
                      "typeString": "struct StateUtils.Checkpoint[]"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 767,
                  "mutability": "mutable",
                  "name": "_block",
                  "nameLocation": "17227:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 881,
                  "src": "17219:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 766,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "17219:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "17165:75:0"
            },
            "returnParameters": {
              "id": 771,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 770,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 881,
                  "src": "17264:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 769,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "17264:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "17263:9:0"
            },
            "scope": 1009,
            "src": "17145:1161:0",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 1007,
              "nodeType": "Block",
              "src": "18890:1057:0",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 896,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 893,
                        "name": "checkpoints",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 886,
                        "src": "18905:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                          "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage pointer"
                        }
                      },
                      "id": 894,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "18917:6:0",
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "18905:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 895,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "18927:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "18905:23:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 902,
                  "nodeType": "IfStatement",
                  "src": "18901:46:0",
                  "trueBody": {
                    "expression": {
                      "arguments": [
                        {
                          "hexValue": "30",
                          "id": 899,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "18945:1:0",
                          "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": 898,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "18937:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 897,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "18937:7:0",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 900,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "18937:10:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "functionReturnParameters": 892,
                    "id": 901,
                    "nodeType": "Return",
                    "src": "18930:17:0"
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 911,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 903,
                      "name": "_block",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 888,
                      "src": "19006:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">=",
                    "rightExpression": {
                      "expression": {
                        "baseExpression": {
                          "id": 904,
                          "name": "checkpoints",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 886,
                          "src": "19016:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                            "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage pointer"
                          }
                        },
                        "id": 909,
                        "indexExpression": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 908,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 905,
                              "name": "checkpoints",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 886,
                              "src": "19028:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                                "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage pointer"
                              }
                            },
                            "id": 906,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "19040:6:0",
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "src": "19028:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "hexValue": "31",
                            "id": 907,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "19049:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_1_by_1",
                              "typeString": "int_const 1"
                            },
                            "value": "1"
                          },
                          "src": "19028:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "19016:35:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressCheckpoint_$71_storage",
                          "typeString": "struct StateUtils.AddressCheckpoint storage ref"
                        }
                      },
                      "id": 910,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "19052:9:0",
                      "memberName": "fromBlock",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 68,
                      "src": "19016:45:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "src": "19006:55:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 920,
                  "nodeType": "IfStatement",
                  "src": "19002:125:0",
                  "trueBody": {
                    "expression": {
                      "expression": {
                        "baseExpression": {
                          "id": 912,
                          "name": "checkpoints",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 886,
                          "src": "19083:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                            "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage pointer"
                          }
                        },
                        "id": 917,
                        "indexExpression": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 916,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 913,
                              "name": "checkpoints",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 886,
                              "src": "19095:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                                "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage pointer"
                              }
                            },
                            "id": 914,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "19107:6:0",
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "src": "19095:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "hexValue": "31",
                            "id": 915,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "19116:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_1_by_1",
                              "typeString": "int_const 1"
                            },
                            "value": "1"
                          },
                          "src": "19095:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "19083:35:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressCheckpoint_$71_storage",
                          "typeString": "struct StateUtils.AddressCheckpoint storage ref"
                        }
                      },
                      "id": 918,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "19119:8:0",
                      "memberName": "_address",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 70,
                      "src": "19083:44:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "functionReturnParameters": 892,
                    "id": 919,
                    "nodeType": "Return",
                    "src": "19076:51:0"
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 926,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 921,
                      "name": "_block",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 888,
                      "src": "19142:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "expression": {
                        "baseExpression": {
                          "id": 922,
                          "name": "checkpoints",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 886,
                          "src": "19151:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                            "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage pointer"
                          }
                        },
                        "id": 924,
                        "indexExpression": {
                          "hexValue": "30",
                          "id": 923,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "19163:1:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "19151:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressCheckpoint_$71_storage",
                          "typeString": "struct StateUtils.AddressCheckpoint storage ref"
                        }
                      },
                      "id": 925,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "19166:9:0",
                      "memberName": "fromBlock",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 68,
                      "src": "19151:24:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "src": "19142:33:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 932,
                  "nodeType": "IfStatement",
                  "src": "19138:56:0",
                  "trueBody": {
                    "expression": {
                      "arguments": [
                        {
                          "hexValue": "30",
                          "id": 929,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "19192:1:0",
                          "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": 928,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "19184:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 927,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "19184:7:0",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 930,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "19184:10:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "functionReturnParameters": 892,
                    "id": 931,
                    "nodeType": "Return",
                    "src": "19177:17:0"
                  }
                },
                {
                  "assignments": [
                    934
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 934,
                      "mutability": "mutable",
                      "name": "_min",
                      "nameLocation": "19335:4:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1007,
                      "src": "19327:12:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 933,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "19327:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 936,
                  "initialValue": {
                    "hexValue": "30",
                    "id": 935,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "19342:1:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_0_by_1",
                      "typeString": "int_const 0"
                    },
                    "value": "0"
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "19327:16:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 950,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 940,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "expression": {
                          "id": 937,
                          "name": "checkpoints",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 886,
                          "src": "19372:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                            "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage pointer"
                          }
                        },
                        "id": 938,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "19384:6:0",
                        "memberName": "length",
                        "nodeType": "MemberAccess",
                        "src": "19372:18:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": ">",
                      "rightExpression": {
                        "hexValue": "31303234",
                        "id": 939,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "19393:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_1024_by_1",
                          "typeString": "int_const 1024"
                        },
                        "value": "1024"
                      },
                      "src": "19372:25:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "&&",
                    "rightExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 949,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "expression": {
                          "baseExpression": {
                            "id": 941,
                            "name": "checkpoints",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 886,
                            "src": "19414:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                              "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage pointer"
                            }
                          },
                          "id": 946,
                          "indexExpression": {
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 945,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "expression": {
                                "id": 942,
                                "name": "checkpoints",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 886,
                                "src": "19426:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                                  "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage pointer"
                                }
                              },
                              "id": 943,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "19438:6:0",
                              "memberName": "length",
                              "nodeType": "MemberAccess",
                              "src": "19426:18:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "-",
                            "rightExpression": {
                              "hexValue": "31303234",
                              "id": 944,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "19447:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1024_by_1",
                                "typeString": "int_const 1024"
                              },
                              "value": "1024"
                            },
                            "src": "19426:25:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "19414:38:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_AddressCheckpoint_$71_storage",
                            "typeString": "struct StateUtils.AddressCheckpoint storage ref"
                          }
                        },
                        "id": 947,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "19453:9:0",
                        "memberName": "fromBlock",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 68,
                        "src": "19414:48:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "<",
                      "rightExpression": {
                        "id": 948,
                        "name": "_block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 888,
                        "src": "19465:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "19414:57:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "19372:99:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 959,
                  "nodeType": "IfStatement",
                  "src": "19354:188:0",
                  "trueBody": {
                    "id": 958,
                    "nodeType": "Block",
                    "src": "19483:59:0",
                    "statements": [
                      {
                        "expression": {
                          "id": 956,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "id": 951,
                            "name": "_min",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 934,
                            "src": "19498:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 955,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "expression": {
                                "id": 952,
                                "name": "checkpoints",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 886,
                                "src": "19505:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                                  "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage pointer"
                                }
                              },
                              "id": 953,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "19517:6:0",
                              "memberName": "length",
                              "nodeType": "MemberAccess",
                              "src": "19505:18:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "-",
                            "rightExpression": {
                              "hexValue": "31303234",
                              "id": 954,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "19526:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1024_by_1",
                                "typeString": "int_const 1024"
                              },
                              "value": "1024"
                            },
                            "src": "19505:25:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "19498:32:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 957,
                        "nodeType": "ExpressionStatement",
                        "src": "19498:32:0"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    961
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 961,
                      "mutability": "mutable",
                      "name": "_max",
                      "nameLocation": "19614:4:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1007,
                      "src": "19606:12:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 960,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "19606:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 966,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 965,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 962,
                        "name": "checkpoints",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 886,
                        "src": "19621:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                          "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage pointer"
                        }
                      },
                      "id": 963,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "19633:6:0",
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "19621:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "hexValue": "31",
                      "id": 964,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "19642:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_1_by_1",
                        "typeString": "int_const 1"
                      },
                      "value": "1"
                    },
                    "src": "19621:22:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "19606:37:0"
                },
                {
                  "body": {
                    "id": 1000,
                    "nodeType": "Block",
                    "src": "19674:222:0",
                    "statements": [
                      {
                        "assignments": [
                          971
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 971,
                            "mutability": "mutable",
                            "name": "_mid",
                            "nameLocation": "19697:4:0",
                            "nodeType": "VariableDeclaration",
                            "scope": 1000,
                            "src": "19689:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 970,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "19689:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 980,
                        "initialValue": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 979,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "components": [
                              {
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 976,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 974,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "id": 972,
                                    "name": "_max",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 961,
                                    "src": "19705:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "+",
                                  "rightExpression": {
                                    "id": 973,
                                    "name": "_min",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 934,
                                    "src": "19712:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "19705:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "+",
                                "rightExpression": {
                                  "hexValue": "31",
                                  "id": 975,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "19719:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_1_by_1",
                                    "typeString": "int_const 1"
                                  },
                                  "value": "1"
                                },
                                "src": "19705:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 977,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "19704:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "/",
                          "rightExpression": {
                            "hexValue": "32",
                            "id": 978,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "19724:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_2_by_1",
                              "typeString": "int_const 2"
                            },
                            "value": "2"
                          },
                          "src": "19704:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "19689:36:0"
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 986,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "baseExpression": {
                                "id": 981,
                                "name": "checkpoints",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 886,
                                "src": "19744:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                                  "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage pointer"
                                }
                              },
                              "id": 983,
                              "indexExpression": {
                                "id": 982,
                                "name": "_mid",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 971,
                                "src": "19756:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "19744:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_AddressCheckpoint_$71_storage",
                                "typeString": "struct StateUtils.AddressCheckpoint storage ref"
                              }
                            },
                            "id": 984,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "19762:9:0",
                            "memberName": "fromBlock",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 68,
                            "src": "19744:27:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<=",
                          "rightExpression": {
                            "id": 985,
                            "name": "_block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 888,
                            "src": "19775:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "19744:37:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 998,
                          "nodeType": "Block",
                          "src": "19835:50:0",
                          "statements": [
                            {
                              "expression": {
                                "id": 996,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "id": 992,
                                  "name": "_max",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 961,
                                  "src": "19854:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 995,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "id": 993,
                                    "name": "_mid",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 971,
                                    "src": "19861:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "-",
                                  "rightExpression": {
                                    "hexValue": "31",
                                    "id": 994,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "19868:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_1_by_1",
                                      "typeString": "int_const 1"
                                    },
                                    "value": "1"
                                  },
                                  "src": "19861:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "19854:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 997,
                              "nodeType": "ExpressionStatement",
                              "src": "19854:15:0"
                            }
                          ]
                        },
                        "id": 999,
                        "nodeType": "IfStatement",
                        "src": "19740:145:0",
                        "trueBody": {
                          "id": 991,
                          "nodeType": "Block",
                          "src": "19783:46:0",
                          "statements": [
                            {
                              "expression": {
                                "id": 989,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "id": 987,
                                  "name": "_min",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 934,
                                  "src": "19802:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "id": 988,
                                  "name": "_mid",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 971,
                                  "src": "19809:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "19802:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 990,
                              "nodeType": "ExpressionStatement",
                              "src": "19802:11:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 969,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 967,
                      "name": "_max",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 961,
                      "src": "19661:4:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "id": 968,
                      "name": "_min",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 934,
                      "src": "19668:4:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "19661:11:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1001,
                  "nodeType": "WhileStatement",
                  "src": "19654:242:0"
                },
                {
                  "expression": {
                    "expression": {
                      "baseExpression": {
                        "id": 1002,
                        "name": "checkpoints",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 886,
                        "src": "19913:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                          "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage pointer"
                        }
                      },
                      "id": 1004,
                      "indexExpression": {
                        "id": 1003,
                        "name": "_min",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 934,
                        "src": "19925:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "19913:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_AddressCheckpoint_$71_storage",
                        "typeString": "struct StateUtils.AddressCheckpoint storage ref"
                      }
                    },
                    "id": 1005,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberLocation": "19931:8:0",
                    "memberName": "_address",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 70,
                    "src": "19913:26:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 892,
                  "id": 1006,
                  "nodeType": "Return",
                  "src": "19906:33:0"
                }
              ]
            },
            "documentation": {
              "id": 882,
              "nodeType": "StructuredDocumentation",
              "src": "18314:434:0",
              "text": "@notice Called to get the value of an address-checkpoint array at a specific block using binary search\n @dev Adapted from https://github.com/aragon/minime/blob/1d5251fc88eee5024ff318d95bc9f4c5de130430/contracts/MiniMeToken.sol#L431\n @param checkpoints Address-checkpoint array\n @param _block Block number for which the query is being made\n @return Value of the address-checkpoint array at the block"
            },
            "id": 1008,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_getAddressAt",
            "nameLocation": "18763:13:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 889,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 886,
                  "mutability": "mutable",
                  "name": "checkpoints",
                  "nameLocation": "18815:11:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1008,
                  "src": "18787:39:0",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                    "typeString": "struct StateUtils.AddressCheckpoint[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 884,
                      "nodeType": "UserDefinedTypeName",
                      "pathNode": {
                        "id": 883,
                        "name": "AddressCheckpoint",
                        "nameLocations": [
                          "18787:17:0"
                        ],
                        "nodeType": "IdentifierPath",
                        "referencedDeclaration": 71,
                        "src": "18787:17:0"
                      },
                      "referencedDeclaration": 71,
                      "src": "18787:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_AddressCheckpoint_$71_storage_ptr",
                        "typeString": "struct StateUtils.AddressCheckpoint"
                      }
                    },
                    "id": 885,
                    "nodeType": "ArrayTypeName",
                    "src": "18787:19:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr",
                      "typeString": "struct StateUtils.AddressCheckpoint[]"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 888,
                  "mutability": "mutable",
                  "name": "_block",
                  "nameLocation": "18845:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1008,
                  "src": "18837:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 887,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "18837:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "18776:82:0"
            },
            "returnParameters": {
              "id": 892,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 891,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 1008,
                  "src": "18881:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 890,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "18881:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "18880:9:0"
            },
            "scope": 1009,
            "src": "18754:1193:0",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          }
        ],
        "scope": 2968,
        "src": "13426:6524:0",
        "usedErrors": [
          189,
          191,
          193,
          195,
          197,
          199,
          201,
          203,
          205,
          207,
          209,
          211,
          213,
          215,
          217,
          219,
          221,
          223,
          225,
          227,
          229,
          231,
          233,
          235,
          237,
          239,
          2972
        ],
        "usedEvents": []
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "baseName": {
              "id": 1011,
              "name": "GetterUtils",
              "nameLocations": [
                "20207:11:0"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 1009,
              "src": "20207:11:0"
            },
            "id": 1012,
            "nodeType": "InheritanceSpecifier",
            "src": "20207:11:0"
          }
        ],
        "canonicalName": "VotingUtils",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 1010,
          "nodeType": "StructuredDocumentation",
          "src": "19954:220:0",
          "text": "@notice implements voting interface and voting power delegation\n @dev any DAO voting app/contract can call userVotingPowerAt() in GetterUtils with a voter's address for their voting power (including delegation)"
        },
        "fullyImplemented": true,
        "id": 1344,
        "linearizedBaseContracts": [
          1344,
          1009,
          615,
          2995
        ],
        "name": "VotingUtils",
        "nameLocation": "20192:11:0",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "eventSelector": "24d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e04",
            "id": 1022,
            "name": "Delegated",
            "nameLocation": "20232:9:0",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 1021,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1014,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "user",
                  "nameLocation": "20268:4:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1022,
                  "src": "20252:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1013,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "20252:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1016,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "delegate",
                  "nameLocation": "20299:8:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1022,
                  "src": "20283:24:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1015,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "20283:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1018,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "shares",
                  "nameLocation": "20326:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1022,
                  "src": "20318:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1017,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "20318:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1020,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "totalDelegatedTo",
                  "nameLocation": "20351:16:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1022,
                  "src": "20343:24:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1019,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "20343:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "20241:133:0"
            },
            "src": "20226:149:0"
          },
          {
            "anonymous": false,
            "eventSelector": "3aace7340547de7b9156593a7652dc07ee900cea3fd8f82cb6c9d38b40829802",
            "id": 1032,
            "name": "Undelegated",
            "nameLocation": "20389:11:0",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 1031,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1024,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "user",
                  "nameLocation": "20427:4:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1032,
                  "src": "20411:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1023,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "20411:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1026,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "delegate",
                  "nameLocation": "20458:8:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1032,
                  "src": "20442:24:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1025,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "20442:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1028,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "shares",
                  "nameLocation": "20485:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1032,
                  "src": "20477:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1027,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "20477:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1030,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "totalDelegatedTo",
                  "nameLocation": "20510:16:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1032,
                  "src": "20502:24:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1029,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "20502:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "20400:133:0"
            },
            "src": "20383:151:0"
          },
          {
            "anonymous": false,
            "eventSelector": "f310def5b4718cefe3603eb46259d8061fd58003695cf952de94c53e14dbb309",
            "id": 1044,
            "name": "UpdatedDelegation",
            "nameLocation": "20548:17:0",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 1043,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1034,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "user",
                  "nameLocation": "20592:4:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1044,
                  "src": "20576:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1033,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "20576:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1036,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "delegate",
                  "nameLocation": "20623:8:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1044,
                  "src": "20607:24:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1035,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "20607:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1038,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "delta",
                  "nameLocation": "20647:5:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1044,
                  "src": "20642:10:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 1037,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "20642:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1040,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "shares",
                  "nameLocation": "20671:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1044,
                  "src": "20663:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1039,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "20663:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1042,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "totalDelegatedTo",
                  "nameLocation": "20696:16:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1044,
                  "src": "20688:24:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1041,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "20688:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "20565:154:0"
            },
            "src": "20542:178:0"
          },
          {
            "body": {
              "id": 1188,
              "nodeType": "Block",
              "src": "20923:1758:0",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 1060,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "id": 1055,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 1050,
                        "name": "_delegate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1047,
                        "src": "20938:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "arguments": [
                          {
                            "hexValue": "30",
                            "id": 1053,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "20959:1:0",
                            "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": 1052,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "20951:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 1051,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "20951:7:0",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 1054,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "20951:10:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "src": "20938:23:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "||",
                    "rightExpression": {
                      "commonType": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "id": 1059,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 1056,
                        "name": "_delegate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1047,
                        "src": "20965:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "expression": {
                          "id": 1057,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "20978:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1058,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "20982:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "20978:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "src": "20965:23:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "20938:50:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1064,
                  "nodeType": "IfStatement",
                  "src": "20934:93:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1061,
                        "name": "InvalidDelegate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 217,
                        "src": "21010:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 1062,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "21010:17:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 1063,
                    "nodeType": "RevertStatement",
                    "src": "21003:24:0"
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 1072,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "arguments": [
                        {
                          "id": 1066,
                          "name": "_delegate",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1047,
                          "src": "21202:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 1065,
                        "name": "userDelegate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 760,
                        "src": "21189:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_address_$",
                          "typeString": "function (address) view returns (address)"
                        }
                      },
                      "id": 1067,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "21189:23:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "arguments": [
                        {
                          "hexValue": "30",
                          "id": 1070,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "21224:1:0",
                          "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": 1069,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "21216:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 1068,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21216:7:0",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 1071,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "21216:10:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "21189:37:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1076,
                  "nodeType": "IfStatement",
                  "src": "21185:68:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1073,
                        "name": "AlreadyDelegated",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 191,
                        "src": "21235:16:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 1074,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "21235:18:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 1075,
                    "nodeType": "RevertStatement",
                    "src": "21228:25:0"
                  }
                },
                {
                  "assignments": [
                    1079
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1079,
                      "mutability": "mutable",
                      "name": "user",
                      "nameLocation": "21277:4:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1188,
                      "src": "21264:17:0",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                        "typeString": "struct StateUtils.User"
                      },
                      "typeName": {
                        "id": 1078,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 1077,
                          "name": "User",
                          "nameLocations": [
                            "21264:4:0"
                          ],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 100,
                          "src": "21264:4:0"
                        },
                        "referencedDeclaration": 100,
                        "src": "21264:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                          "typeString": "struct StateUtils.User"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1084,
                  "initialValue": {
                    "baseExpression": {
                      "id": 1080,
                      "name": "users",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 164,
                      "src": "21284:5:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                        "typeString": "mapping(address => struct StateUtils.User storage ref)"
                      }
                    },
                    "id": 1083,
                    "indexExpression": {
                      "expression": {
                        "id": 1081,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "21290:3:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 1082,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "21294:6:0",
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "src": "21290:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "21284:17:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_User_$100_storage",
                      "typeString": "struct StateUtils.User storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "21264:37:0"
                },
                {
                  "id": 1103,
                  "nodeType": "UncheckedBlock",
                  "src": "21437:262:0",
                  "statements": [
                    {
                      "condition": {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 1091,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1088,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 1085,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1079,
                              "src": "21484:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                                "typeString": "struct StateUtils.User storage pointer"
                              }
                            },
                            "id": 1086,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "21489:29:0",
                            "memberName": "lastDelegationUpdateTimestamp",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 99,
                            "src": "21484:34:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "+",
                          "rightExpression": {
                            "id": 1087,
                            "name": "EPOCH_LENGTH",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 130,
                            "src": "21521:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "21484:49:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "expression": {
                            "id": 1089,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -4,
                            "src": "21554:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 1090,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "21560:9:0",
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "src": "21554:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "21484:85:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "id": 1095,
                      "nodeType": "IfStatement",
                      "src": "21462:158:0",
                      "trueBody": {
                        "errorCall": {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 1092,
                            "name": "DelegateUpdatedTooRecently",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 209,
                            "src": "21592:26:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                              "typeString": "function () pure returns (error)"
                            }
                          },
                          "id": 1093,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21592:28:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_error",
                            "typeString": "error"
                          }
                        },
                        "id": 1094,
                        "nodeType": "RevertStatement",
                        "src": "21585:35:0"
                      }
                    },
                    {
                      "expression": {
                        "id": 1101,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftHandSide": {
                          "expression": {
                            "id": 1096,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1079,
                            "src": "21635:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                              "typeString": "struct StateUtils.User storage pointer"
                            }
                          },
                          "id": 1098,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": true,
                          "memberLocation": "21640:29:0",
                          "memberName": "lastDelegationUpdateTimestamp",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 99,
                          "src": "21635:34:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "Assignment",
                        "operator": "=",
                        "rightHandSide": {
                          "expression": {
                            "id": 1099,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -4,
                            "src": "21672:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 1100,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "21678:9:0",
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "src": "21672:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "21635:52:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 1102,
                      "nodeType": "ExpressionStatement",
                      "src": "21635:52:0"
                    }
                  ]
                },
                {
                  "assignments": [
                    1105
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1105,
                      "mutability": "mutable",
                      "name": "userShares",
                      "nameLocation": "21719:10:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1188,
                      "src": "21711:18:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1104,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "21711:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1112,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1107,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "21745:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1108,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "21749:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "21745:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "expression": {
                          "id": 1109,
                          "name": "block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -4,
                          "src": "21757:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_block",
                            "typeString": "block"
                          }
                        },
                        "id": 1110,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "21763:6:0",
                        "memberName": "number",
                        "nodeType": "MemberAccess",
                        "src": "21757:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1106,
                      "name": "userSharesAt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 685,
                      "src": "21732:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (address,uint256) view returns (uint256)"
                      }
                    },
                    "id": 1111,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "21732:38:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "21711:59:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1115,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 1113,
                      "name": "userShares",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1105,
                      "src": "21785:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 1114,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "21799:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "21785:15:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1119,
                  "nodeType": "IfStatement",
                  "src": "21781:38:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1116,
                        "name": "NoShares",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 225,
                        "src": "21809:8:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 1117,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "21809:10:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 1118,
                    "nodeType": "RevertStatement",
                    "src": "21802:17:0"
                  }
                },
                {
                  "assignments": [
                    1121
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1121,
                      "mutability": "mutable",
                      "name": "_previousDelegate",
                      "nameLocation": "21840:17:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1188,
                      "src": "21832:25:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 1120,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "21832:7:0",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1126,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1123,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "21873:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1124,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "21877:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "21873:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 1122,
                      "name": "userDelegate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 760,
                      "src": "21860:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_address_$",
                        "typeString": "function (address) view returns (address)"
                      }
                    },
                    "id": 1125,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "21860:24:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "21832:52:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 1129,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 1127,
                      "name": "_previousDelegate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1121,
                      "src": "21899:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "id": 1128,
                      "name": "_delegate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1047,
                      "src": "21920:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "21899:30:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1133,
                  "nodeType": "IfStatement",
                  "src": "21895:61:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1130,
                        "name": "AlreadyDelegated",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 191,
                        "src": "21938:16:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 1131,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "21938:18:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 1132,
                    "nodeType": "RevertStatement",
                    "src": "21931:25:0"
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 1139,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 1134,
                      "name": "_previousDelegate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1121,
                      "src": "21971:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "arguments": [
                        {
                          "hexValue": "30",
                          "id": 1137,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "22000:1:0",
                          "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": 1136,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "21992:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 1135,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21992:7:0",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 1138,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "21992:10:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "21971:31:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1155,
                  "nodeType": "IfStatement",
                  "src": "21967:281:0",
                  "trueBody": {
                    "id": 1154,
                    "nodeType": "Block",
                    "src": "22004:244:0",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "expression": {
                                "baseExpression": {
                                  "id": 1141,
                                  "name": "users",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 164,
                                  "src": "22103:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                                    "typeString": "mapping(address => struct StateUtils.User storage ref)"
                                  }
                                },
                                "id": 1143,
                                "indexExpression": {
                                  "id": 1142,
                                  "name": "_previousDelegate",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1121,
                                  "src": "22109:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "22103:24:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_User_$100_storage",
                                  "typeString": "struct StateUtils.User storage ref"
                                }
                              },
                              "id": 1144,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "22128:11:0",
                              "memberName": "delegatedTo",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 85,
                              "src": "22103:36:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                                "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                              }
                            },
                            {
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1151,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "arguments": [
                                  {
                                    "id": 1146,
                                    "name": "_previousDelegate",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1121,
                                    "src": "22176:17:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "expression": {
                                      "id": 1147,
                                      "name": "block",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -4,
                                      "src": "22195:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_block",
                                        "typeString": "block"
                                      }
                                    },
                                    "id": 1148,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberLocation": "22201:6:0",
                                    "memberName": "number",
                                    "nodeType": "MemberAccess",
                                    "src": "22195:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 1145,
                                  "name": "delegatedToUserAt",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 726,
                                  "src": "22158:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (address,uint256) view returns (uint256)"
                                  }
                                },
                                "id": 1149,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "22158:50:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "-",
                              "rightExpression": {
                                "id": 1150,
                                "name": "userShares",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1105,
                                "src": "22211:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "22158:63:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                                "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1140,
                            "name": "_updateCheckpointArray",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 462,
                            "src": "22062:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr_$_t_uint256_$returns$__$",
                              "typeString": "function (struct StateUtils.Checkpoint storage ref[] storage pointer,uint256)"
                            }
                          },
                          "id": 1152,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22062:174:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1153,
                        "nodeType": "ExpressionStatement",
                        "src": "22062:174:0"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    1157
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1157,
                      "mutability": "mutable",
                      "name": "delegatedToUpdate",
                      "nameLocation": "22306:17:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1188,
                      "src": "22298:25:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1156,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "22298:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1165,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1164,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "arguments": [
                        {
                          "id": 1159,
                          "name": "_delegate",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1047,
                          "src": "22344:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "expression": {
                            "id": 1160,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -4,
                            "src": "22355:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 1161,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "22361:6:0",
                          "memberName": "number",
                          "nodeType": "MemberAccess",
                          "src": "22355:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "id": 1158,
                        "name": "delegatedToUserAt",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 726,
                        "src": "22326:17:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                          "typeString": "function (address,uint256) view returns (uint256)"
                        }
                      },
                      "id": 1162,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "22326:42:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "id": 1163,
                      "name": "userShares",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1105,
                      "src": "22384:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "22326:68:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "22298:96:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "baseExpression": {
                            "id": 1167,
                            "name": "users",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 164,
                            "src": "22428:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                              "typeString": "mapping(address => struct StateUtils.User storage ref)"
                            }
                          },
                          "id": 1169,
                          "indexExpression": {
                            "id": 1168,
                            "name": "_delegate",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1047,
                            "src": "22434:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "22428:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage",
                            "typeString": "struct StateUtils.User storage ref"
                          }
                        },
                        "id": 1170,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "22445:11:0",
                        "memberName": "delegatedTo",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 85,
                        "src": "22428:28:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        }
                      },
                      {
                        "id": 1171,
                        "name": "delegatedToUpdate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1157,
                        "src": "22458:17:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1166,
                      "name": "_updateCheckpointArray",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 462,
                      "src": "22405:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr_$_t_uint256_$returns$__$",
                        "typeString": "function (struct StateUtils.Checkpoint storage ref[] storage pointer,uint256)"
                      }
                    },
                    "id": 1172,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "22405:71:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1173,
                  "nodeType": "ExpressionStatement",
                  "src": "22405:71:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1175,
                          "name": "user",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1079,
                          "src": "22568:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                            "typeString": "struct StateUtils.User storage pointer"
                          }
                        },
                        "id": 1176,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "22573:9:0",
                        "memberName": "delegates",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 89,
                        "src": "22568:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage",
                          "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage ref"
                        }
                      },
                      {
                        "id": 1177,
                        "name": "_delegate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1047,
                        "src": "22584:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage",
                          "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage ref"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 1174,
                      "name": "_updateAddressCheckpointArray",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 486,
                      "src": "22538:29:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr_$_t_address_$returns$__$",
                        "typeString": "function (struct StateUtils.AddressCheckpoint storage ref[] storage pointer,address)"
                      }
                    },
                    "id": 1178,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "22538:56:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1179,
                  "nodeType": "ExpressionStatement",
                  "src": "22538:56:0"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1181,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "22620:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1182,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "22624:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "22620:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 1183,
                        "name": "_delegate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1047,
                        "src": "22632:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 1184,
                        "name": "userShares",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1105,
                        "src": "22643:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 1185,
                        "name": "delegatedToUpdate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1157,
                        "src": "22655:17:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1180,
                      "name": "Delegated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1022,
                      "src": "22610:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256,uint256)"
                      }
                    },
                    "id": 1186,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "22610:63:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1187,
                  "nodeType": "EmitStatement",
                  "src": "22605:68:0"
                }
              ]
            },
            "documentation": {
              "id": 1045,
              "nodeType": "StructuredDocumentation",
              "src": "20728:132:0",
              "text": "@notice Called by the user to delegate voting power\n @param _delegate User address the voting power will be delegated to"
            },
            "functionSelector": "f3ff955a",
            "id": 1189,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "delegateVotingPower",
            "nameLocation": "20875:19:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1048,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1047,
                  "mutability": "mutable",
                  "name": "_delegate",
                  "nameLocation": "20903:9:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1189,
                  "src": "20895:17:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1046,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "20895:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "20894:19:0"
            },
            "returnParameters": {
              "id": 1049,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "20923:0:0"
            },
            "scope": 1344,
            "src": "20866:1815:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 1281,
              "nodeType": "Block",
              "src": "22800:1073:0",
              "statements": [
                {
                  "assignments": [
                    1195
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1195,
                      "mutability": "mutable",
                      "name": "user",
                      "nameLocation": "22824:4:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1281,
                      "src": "22811:17:0",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                        "typeString": "struct StateUtils.User"
                      },
                      "typeName": {
                        "id": 1194,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 1193,
                          "name": "User",
                          "nameLocations": [
                            "22811:4:0"
                          ],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 100,
                          "src": "22811:4:0"
                        },
                        "referencedDeclaration": 100,
                        "src": "22811:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                          "typeString": "struct StateUtils.User"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1200,
                  "initialValue": {
                    "baseExpression": {
                      "id": 1196,
                      "name": "users",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 164,
                      "src": "22831:5:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                        "typeString": "mapping(address => struct StateUtils.User storage ref)"
                      }
                    },
                    "id": 1199,
                    "indexExpression": {
                      "expression": {
                        "id": 1197,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "22837:3:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 1198,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "22841:6:0",
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "src": "22837:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "22831:17:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_User_$100_storage",
                      "typeString": "struct StateUtils.User storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "22811:37:0"
                },
                {
                  "assignments": [
                    1202
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1202,
                      "mutability": "mutable",
                      "name": "_previousDelegate",
                      "nameLocation": "22867:17:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1281,
                      "src": "22859:25:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 1201,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "22859:7:0",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1207,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1204,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "22900:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1205,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "22904:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "22900:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 1203,
                      "name": "userDelegate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 760,
                      "src": "22887:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_address_$",
                        "typeString": "function (address) view returns (address)"
                      }
                    },
                    "id": 1206,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "22887:24:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "22859:52:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 1213,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 1208,
                      "name": "_previousDelegate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1202,
                      "src": "22926:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "arguments": [
                        {
                          "hexValue": "30",
                          "id": 1211,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "22955:1:0",
                          "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": 1210,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "22947:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 1209,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22947:7:0",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 1212,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "22947:10:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "22926:31:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1217,
                  "nodeType": "IfStatement",
                  "src": "22922:58:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1214,
                        "name": "NotDelegated",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 231,
                        "src": "22966:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 1215,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "22966:14:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 1216,
                    "nodeType": "RevertStatement",
                    "src": "22959:21:0"
                  }
                },
                {
                  "id": 1236,
                  "nodeType": "UncheckedBlock",
                  "src": "23040:262:0",
                  "statements": [
                    {
                      "condition": {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 1224,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1221,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 1218,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1195,
                              "src": "23087:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                                "typeString": "struct StateUtils.User storage pointer"
                              }
                            },
                            "id": 1219,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "23092:29:0",
                            "memberName": "lastDelegationUpdateTimestamp",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 99,
                            "src": "23087:34:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "+",
                          "rightExpression": {
                            "id": 1220,
                            "name": "EPOCH_LENGTH",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 130,
                            "src": "23124:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "23087:49:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "expression": {
                            "id": 1222,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -4,
                            "src": "23157:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 1223,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "23163:9:0",
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "src": "23157:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "23087:85:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "id": 1228,
                      "nodeType": "IfStatement",
                      "src": "23065:158:0",
                      "trueBody": {
                        "errorCall": {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 1225,
                            "name": "DelegateUpdatedTooRecently",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 209,
                            "src": "23195:26:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                              "typeString": "function () pure returns (error)"
                            }
                          },
                          "id": 1226,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "23195:28:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_error",
                            "typeString": "error"
                          }
                        },
                        "id": 1227,
                        "nodeType": "RevertStatement",
                        "src": "23188:35:0"
                      }
                    },
                    {
                      "expression": {
                        "id": 1234,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftHandSide": {
                          "expression": {
                            "id": 1229,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1195,
                            "src": "23238:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                              "typeString": "struct StateUtils.User storage pointer"
                            }
                          },
                          "id": 1231,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": true,
                          "memberLocation": "23243:29:0",
                          "memberName": "lastDelegationUpdateTimestamp",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 99,
                          "src": "23238:34:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "Assignment",
                        "operator": "=",
                        "rightHandSide": {
                          "expression": {
                            "id": 1232,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -4,
                            "src": "23275:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 1233,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "23281:9:0",
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "src": "23275:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "23238:52:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 1235,
                      "nodeType": "ExpressionStatement",
                      "src": "23238:52:0"
                    }
                  ]
                },
                {
                  "assignments": [
                    1238
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1238,
                      "mutability": "mutable",
                      "name": "_userShares",
                      "nameLocation": "23322:11:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1281,
                      "src": "23314:19:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1237,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "23314:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1245,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1240,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "23349:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1241,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "23353:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "23349:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "expression": {
                          "id": 1242,
                          "name": "block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -4,
                          "src": "23361:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_block",
                            "typeString": "block"
                          }
                        },
                        "id": 1243,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "23367:6:0",
                        "memberName": "number",
                        "nodeType": "MemberAccess",
                        "src": "23361:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1239,
                      "name": "userSharesAt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 685,
                      "src": "23336:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (address,uint256) view returns (uint256)"
                      }
                    },
                    "id": 1244,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "23336:38:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "23314:60:0"
                },
                {
                  "assignments": [
                    1247
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1247,
                      "mutability": "mutable",
                      "name": "_delegatedToUpdate",
                      "nameLocation": "23393:18:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1281,
                      "src": "23385:26:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1246,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "23385:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1255,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1254,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "arguments": [
                        {
                          "id": 1249,
                          "name": "_previousDelegate",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1202,
                          "src": "23446:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "expression": {
                            "id": 1250,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -4,
                            "src": "23478:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 1251,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "23484:6:0",
                          "memberName": "number",
                          "nodeType": "MemberAccess",
                          "src": "23478:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "id": 1248,
                        "name": "delegatedToUserAt",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 726,
                        "src": "23414:17:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                          "typeString": "function (address,uint256) view returns (uint256)"
                        }
                      },
                      "id": 1252,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "23414:87:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "id": 1253,
                      "name": "_userShares",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1238,
                      "src": "23504:11:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "23414:101:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "23385:130:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "baseExpression": {
                            "id": 1257,
                            "name": "users",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 164,
                            "src": "23563:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                              "typeString": "mapping(address => struct StateUtils.User storage ref)"
                            }
                          },
                          "id": 1259,
                          "indexExpression": {
                            "id": 1258,
                            "name": "_previousDelegate",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1202,
                            "src": "23569:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "23563:24:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage",
                            "typeString": "struct StateUtils.User storage ref"
                          }
                        },
                        "id": 1260,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "23588:11:0",
                        "memberName": "delegatedTo",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 85,
                        "src": "23563:36:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        }
                      },
                      {
                        "id": 1261,
                        "name": "_delegatedToUpdate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1247,
                        "src": "23614:18:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1256,
                      "name": "_updateCheckpointArray",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 462,
                      "src": "23526:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr_$_t_uint256_$returns$__$",
                        "typeString": "function (struct StateUtils.Checkpoint storage ref[] storage pointer,uint256)"
                      }
                    },
                    "id": 1262,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "23526:117:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1263,
                  "nodeType": "ExpressionStatement",
                  "src": "23526:117:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1265,
                          "name": "user",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1195,
                          "src": "23684:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                            "typeString": "struct StateUtils.User storage pointer"
                          }
                        },
                        "id": 1266,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "23689:9:0",
                        "memberName": "delegates",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 89,
                        "src": "23684:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage",
                          "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage ref"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "hexValue": "30",
                            "id": 1269,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "23708:1:0",
                            "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": 1268,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "23700:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 1267,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "23700:7:0",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 1270,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "23700:10:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage",
                          "typeString": "struct StateUtils.AddressCheckpoint storage ref[] storage ref"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 1264,
                      "name": "_updateAddressCheckpointArray",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 486,
                      "src": "23654:29:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_array$_t_struct$_AddressCheckpoint_$71_storage_$dyn_storage_ptr_$_t_address_$returns$__$",
                        "typeString": "function (struct StateUtils.AddressCheckpoint storage ref[] storage pointer,address)"
                      }
                    },
                    "id": 1271,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "23654:57:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1272,
                  "nodeType": "ExpressionStatement",
                  "src": "23654:57:0"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1274,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "23753:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1275,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "23757:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "23753:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 1276,
                        "name": "_previousDelegate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1202,
                        "src": "23778:17:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 1277,
                        "name": "_userShares",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1238,
                        "src": "23810:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 1278,
                        "name": "_delegatedToUpdate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1247,
                        "src": "23836:18:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1273,
                      "name": "Undelegated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1032,
                      "src": "23727:11:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256,uint256)"
                      }
                    },
                    "id": 1279,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "23727:138:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1280,
                  "nodeType": "EmitStatement",
                  "src": "23722:143:0"
                }
              ]
            },
            "documentation": {
              "id": 1190,
              "nodeType": "StructuredDocumentation",
              "src": "22689:63:0",
              "text": "@notice called by the user to fully undelegate voting power"
            },
            "functionSelector": "3c37d05a",
            "id": 1282,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "undelegateVotingPower",
            "nameLocation": "22767:21:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1191,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "22788:2:0"
            },
            "returnParameters": {
              "id": 1192,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "22800:0:0"
            },
            "scope": 1344,
            "src": "22758:1115:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 1342,
              "nodeType": "Block",
              "src": "24331:682:0",
              "statements": [
                {
                  "assignments": [
                    1291
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1291,
                      "mutability": "mutable",
                      "name": "_delegate",
                      "nameLocation": "24350:9:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1342,
                      "src": "24342:17:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 1290,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "24342:7:0",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1296,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1293,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "24375:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1294,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "24379:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "24375:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 1292,
                      "name": "userDelegate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 760,
                      "src": "24362:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_address_$",
                        "typeString": "function (address) view returns (address)"
                      }
                    },
                    "id": 1295,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "24362:24:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "24342:44:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 1302,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 1297,
                      "name": "_delegate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1291,
                      "src": "24401:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "arguments": [
                        {
                          "hexValue": "30",
                          "id": 1300,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "24422:1:0",
                          "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": 1299,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "24414:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 1298,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "24414:7:0",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 1301,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "24414:10:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "24401:23:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1305,
                  "nodeType": "IfStatement",
                  "src": "24397:62:0",
                  "trueBody": {
                    "id": 1304,
                    "nodeType": "Block",
                    "src": "24426:33:0",
                    "statements": [
                      {
                        "functionReturnParameters": 1289,
                        "id": 1303,
                        "nodeType": "Return",
                        "src": "24441:7:0"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    1307
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1307,
                      "mutability": "mutable",
                      "name": "_currentDelegatedTo",
                      "nameLocation": "24477:19:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1342,
                      "src": "24469:27:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1306,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "24469:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1313,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 1309,
                        "name": "_delegate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1291,
                        "src": "24531:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "expression": {
                          "id": 1310,
                          "name": "block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -4,
                          "src": "24555:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_block",
                            "typeString": "block"
                          }
                        },
                        "id": 1311,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "24561:6:0",
                        "memberName": "number",
                        "nodeType": "MemberAccess",
                        "src": "24555:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1308,
                      "name": "delegatedToUserAt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 726,
                      "src": "24499:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (address,uint256) view returns (uint256)"
                      }
                    },
                    "id": 1312,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "24499:79:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "24469:109:0"
                },
                {
                  "assignments": [
                    1315
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1315,
                      "mutability": "mutable",
                      "name": "_delegatedToUpdate",
                      "nameLocation": "24597:18:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1342,
                      "src": "24589:26:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1314,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "24589:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1324,
                  "initialValue": {
                    "condition": {
                      "id": 1316,
                      "name": "_change",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1287,
                      "src": "24618:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "falseExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 1322,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 1320,
                        "name": "_currentDelegatedTo",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1307,
                        "src": "24686:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "-",
                      "rightExpression": {
                        "id": 1321,
                        "name": "_shares",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1285,
                        "src": "24708:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "24686:29:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 1323,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "Conditional",
                    "src": "24618:97:0",
                    "trueExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 1319,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 1317,
                        "name": "_currentDelegatedTo",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1307,
                        "src": "24641:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "+",
                      "rightExpression": {
                        "id": 1318,
                        "name": "_shares",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1285,
                        "src": "24663:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "24641:29:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "24589:126:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "baseExpression": {
                            "id": 1326,
                            "name": "users",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 164,
                            "src": "24763:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                              "typeString": "mapping(address => struct StateUtils.User storage ref)"
                            }
                          },
                          "id": 1328,
                          "indexExpression": {
                            "id": 1327,
                            "name": "_delegate",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1291,
                            "src": "24769:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "24763:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage",
                            "typeString": "struct StateUtils.User storage ref"
                          }
                        },
                        "id": 1329,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "24780:11:0",
                        "memberName": "delegatedTo",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 85,
                        "src": "24763:28:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        }
                      },
                      {
                        "id": 1330,
                        "name": "_delegatedToUpdate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1315,
                        "src": "24806:18:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1325,
                      "name": "_updateCheckpointArray",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 462,
                      "src": "24726:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr_$_t_uint256_$returns$__$",
                        "typeString": "function (struct StateUtils.Checkpoint storage ref[] storage pointer,uint256)"
                      }
                    },
                    "id": 1331,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "24726:109:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1332,
                  "nodeType": "ExpressionStatement",
                  "src": "24726:109:0"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1334,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "24883:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1335,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "24887:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "24883:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 1336,
                        "name": "_delegate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1291,
                        "src": "24908:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 1337,
                        "name": "_change",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1287,
                        "src": "24932:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "id": 1338,
                        "name": "_shares",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1285,
                        "src": "24954:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 1339,
                        "name": "_delegatedToUpdate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1315,
                        "src": "24976:18:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1333,
                      "name": "UpdatedDelegation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1044,
                      "src": "24851:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_bool_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,bool,uint256,uint256)"
                      }
                    },
                    "id": 1340,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "24851:154:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1341,
                  "nodeType": "EmitStatement",
                  "src": "24846:159:0"
                }
              ]
            },
            "documentation": {
              "id": 1283,
              "nodeType": "StructuredDocumentation",
              "src": "23881:342:0",
              "text": "@notice called internally when the user shares are updated to update the delegated voting power\n @dev user shares only get updated while staking or scheduling unstaking\n @param _shares Amount of shares that will be added/removed\n @param _change Whether the shares will be added/removed (true = add, false = remove)"
            },
            "id": 1343,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_updateDelegatedVotingPower",
            "nameLocation": "24238:27:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1288,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1285,
                  "mutability": "mutable",
                  "name": "_shares",
                  "nameLocation": "24284:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1343,
                  "src": "24276:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1284,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "24276:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1287,
                  "mutability": "mutable",
                  "name": "_change",
                  "nameLocation": "24307:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1343,
                  "src": "24302:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 1286,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "24302:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "24265:56:0"
            },
            "returnParameters": {
              "id": 1289,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "24331:0:0"
            },
            "scope": 1344,
            "src": "24229:784:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 2968,
        "src": "20174:4842:0",
        "usedErrors": [
          189,
          191,
          193,
          195,
          197,
          199,
          201,
          203,
          205,
          207,
          209,
          211,
          213,
          215,
          217,
          219,
          221,
          223,
          225,
          227,
          229,
          231,
          233,
          235,
          237,
          239,
          2972
        ],
        "usedEvents": [
          1022,
          1032,
          1044
        ]
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "baseName": {
              "id": 1346,
              "name": "VotingUtils",
              "nameLocations": [
                "25125:11:0"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 1344,
              "src": "25125:11:0"
            },
            "id": 1347,
            "nodeType": "InheritanceSpecifier",
            "src": "25125:11:0"
          }
        ],
        "canonicalName": "TransferUtils",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 1345,
          "nodeType": "StructuredDocumentation",
          "src": "25020:70:0",
          "text": "@notice implements transferring (deposit/withdraw) functionality"
        },
        "fullyImplemented": true,
        "id": 1711,
        "linearizedBaseContracts": [
          1711,
          1344,
          1009,
          615,
          2995
        ],
        "name": "TransferUtils",
        "nameLocation": "25108:13:0",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "global": false,
            "id": 1350,
            "libraryName": {
              "id": 1348,
              "name": "SafeTransferLib",
              "nameLocations": [
                "25150:15:0"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 3059,
              "src": "25150:15:0"
            },
            "nodeType": "UsingForDirective",
            "src": "25144:34:0",
            "typeName": {
              "id": 1349,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "25170:7:0",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            }
          },
          {
            "anonymous": false,
            "eventSelector": "73a19dd210f1a7f902193214c0ee91dd35ee5b4d920cba8d519eca65a7b488ca",
            "id": 1358,
            "name": "Deposited",
            "nameLocation": "25192:9:0",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 1357,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1352,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "user",
                  "nameLocation": "25218:4:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1358,
                  "src": "25202:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1351,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "25202:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1354,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "25232:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1358,
                  "src": "25224:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1353,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "25224:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1356,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "userUnstaked",
                  "nameLocation": "25248:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1358,
                  "src": "25240:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1355,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "25240:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "25201:60:0"
            },
            "src": "25186:76:0"
          },
          {
            "anonymous": false,
            "eventSelector": "92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc6",
            "id": 1366,
            "name": "Withdrawn",
            "nameLocation": "25276:9:0",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 1365,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1360,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "user",
                  "nameLocation": "25302:4:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1366,
                  "src": "25286:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1359,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "25286:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1362,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "25316:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1366,
                  "src": "25308:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1361,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "25308:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1364,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "userUnstaked",
                  "nameLocation": "25332:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1366,
                  "src": "25324:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1363,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "25324:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "25285:60:0"
            },
            "src": "25270:76:0"
          },
          {
            "anonymous": false,
            "eventSelector": "48add3fec3cc312645df60c9cf2799e550f7e3d8d0436740d5b3d137046c7df3",
            "id": 1374,
            "name": "ImportFeeRevenue",
            "nameLocation": "25357:16:0",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 1373,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1368,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "chainId",
                  "nameLocation": "25382:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1374,
                  "src": "25374:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1367,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "25374:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1370,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "tokenContract",
                  "nameLocation": "25399:13:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1374,
                  "src": "25391:21:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1369,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "25391:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1372,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "25422:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1374,
                  "src": "25414:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1371,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "25414:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "25373:56:0"
            },
            "src": "25351:79:0"
          },
          {
            "body": {
              "id": 1443,
              "nodeType": "Block",
              "src": "25838:708:0",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1394,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "25900:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1395,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "25904:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "25900:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "id": 1398,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "25933:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TransferUtils_$1711",
                              "typeString": "contract TransferUtils"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_TransferUtils_$1711",
                              "typeString": "contract TransferUtils"
                            }
                          ],
                          "id": 1397,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "25925:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 1396,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "25925:7:0",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 1399,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "25925:13:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 1400,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1377,
                        "src": "25953:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 1401,
                        "name": "_deadline",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1379,
                        "src": "25975:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 1402,
                        "name": "v",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1381,
                        "src": "25999:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 1403,
                        "name": "r",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1383,
                        "src": "26015:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 1404,
                        "name": "s",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1385,
                        "src": "26031:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "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": {
                        "arguments": [
                          {
                            "id": 1391,
                            "name": "enshroudToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 146,
                            "src": "25864:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 1390,
                          "name": "IERC20_DAOPool",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 30,
                          "src": "25849:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IERC20_DAOPool_$30_$",
                            "typeString": "type(contract IERC20_DAOPool)"
                          }
                        },
                        "id": 1392,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "25849:29:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_DAOPool_$30",
                          "typeString": "contract IERC20_DAOPool"
                        }
                      },
                      "id": 1393,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "25879:6:0",
                      "memberName": "permit",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 29,
                      "src": "25849:36: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": 1405,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "25849:194:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1406,
                  "nodeType": "ExpressionStatement",
                  "src": "25849:194:0"
                },
                {
                  "id": 1419,
                  "nodeType": "UncheckedBlock",
                  "src": "26194:109:0",
                  "statements": [
                    {
                      "expression": {
                        "id": 1413,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftHandSide": {
                          "expression": {
                            "baseExpression": {
                              "id": 1407,
                              "name": "users",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 164,
                              "src": "26219:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                                "typeString": "mapping(address => struct StateUtils.User storage ref)"
                              }
                            },
                            "id": 1410,
                            "indexExpression": {
                              "expression": {
                                "id": 1408,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "26225:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 1409,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "26229:6:0",
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "src": "26225:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "26219:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_User_$100_storage",
                              "typeString": "struct StateUtils.User storage ref"
                            }
                          },
                          "id": 1411,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": true,
                          "memberLocation": "26237:9:0",
                          "memberName": "deposited",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 91,
                          "src": "26219:27:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "Assignment",
                        "operator": "+=",
                        "rightHandSide": {
                          "id": 1412,
                          "name": "_amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1377,
                          "src": "26250:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "26219:38:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 1414,
                      "nodeType": "ExpressionStatement",
                      "src": "26219:38:0"
                    },
                    {
                      "expression": {
                        "id": 1417,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftHandSide": {
                          "id": 1415,
                          "name": "depositedUnstaked",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 155,
                          "src": "26263:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "Assignment",
                        "operator": "+=",
                        "rightHandSide": {
                          "id": 1416,
                          "name": "_amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1377,
                          "src": "26284:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "26263:28:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 1418,
                      "nodeType": "ExpressionStatement",
                      "src": "26263:28:0"
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1423,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "26426:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1424,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "26430:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "26426:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "id": 1427,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "26446:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TransferUtils_$1711",
                              "typeString": "contract TransferUtils"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_TransferUtils_$1711",
                              "typeString": "contract TransferUtils"
                            }
                          ],
                          "id": 1426,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "26438:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 1425,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "26438:7:0",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 1428,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "26438:13:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 1429,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1377,
                        "src": "26453:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "id": 1420,
                        "name": "enshroudToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 146,
                        "src": "26395:13:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "id": 1422,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "26409:16:0",
                      "memberName": "safeTransferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3058,
                      "src": "26395:30:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_address_$",
                        "typeString": "function (address,address,address,uint256)"
                      }
                    },
                    "id": 1430,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "26395:66:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1431,
                  "nodeType": "ExpressionStatement",
                  "src": "26395:66:0"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1433,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "26489:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1434,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "26493:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "26489:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 1435,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1377,
                        "src": "26501:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "expression": {
                          "baseExpression": {
                            "id": 1436,
                            "name": "users",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 164,
                            "src": "26510:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                              "typeString": "mapping(address => struct StateUtils.User storage ref)"
                            }
                          },
                          "id": 1439,
                          "indexExpression": {
                            "expression": {
                              "id": 1437,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "26516:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 1438,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "26520:6:0",
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "src": "26516:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "26510:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage",
                            "typeString": "struct StateUtils.User storage ref"
                          }
                        },
                        "id": 1440,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "26528:9:0",
                        "memberName": "deposited",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 91,
                        "src": "26510:27:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1432,
                      "name": "Deposited",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1358,
                      "src": "26479:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256,uint256)"
                      }
                    },
                    "id": 1441,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "26479:59:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1442,
                  "nodeType": "EmitStatement",
                  "src": "26474:64:0"
                }
              ]
            },
            "documentation": {
              "id": 1375,
              "nodeType": "StructuredDocumentation",
              "src": "25438:226:0",
              "text": "@param _amount: amount of tokens deposited, 18 decimals\n @param _deadline: deadline for permit approval usage\n @param v: ECDSA sig param\n @param r: ECDSA sig param\n @param s: ECDSA sig param"
            },
            "functionSelector": "4a970be7",
            "id": 1444,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 1388,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 1387,
                  "name": "nonReentrant",
                  "nameLocations": [
                    "25825:12:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 2994,
                  "src": "25825:12:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "25825:12:0"
              }
            ],
            "name": "depositWithPermit",
            "nameLocation": "25679:17:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1386,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1377,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "25715:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1444,
                  "src": "25707:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1376,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "25707:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1379,
                  "mutability": "mutable",
                  "name": "_deadline",
                  "nameLocation": "25741:9:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1444,
                  "src": "25733:17:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1378,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "25733:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1381,
                  "mutability": "mutable",
                  "name": "v",
                  "nameLocation": "25767:1:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1444,
                  "src": "25761:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 1380,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "25761:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1383,
                  "mutability": "mutable",
                  "name": "r",
                  "nameLocation": "25787:1:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1444,
                  "src": "25779:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1382,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "25779:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1385,
                  "mutability": "mutable",
                  "name": "s",
                  "nameLocation": "25807:1:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1444,
                  "src": "25799:9:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1384,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "25799:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "25696:119:0"
            },
            "returnParameters": {
              "id": 1389,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "25838:0:0"
            },
            "scope": 1711,
            "src": "25670:876:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 1600,
              "nodeType": "Block",
              "src": "27245:1432:0",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 1461,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 1458,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "27290:3:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 1459,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "27294:6:0",
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "src": "27290:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "id": 1460,
                      "name": "feesBot",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 152,
                      "src": "27304:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "27290:21:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1465,
                  "nodeType": "IfStatement",
                  "src": "27286:47:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1462,
                        "name": "OnlyFeesBot",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 235,
                        "src": "27320:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 1463,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "27320:13:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 1464,
                    "nodeType": "RevertStatement",
                    "src": "27313:20:0"
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1470,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 1466,
                        "name": "_tokenContracts",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1450,
                        "src": "27342:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                          "typeString": "address[] calldata"
                        }
                      },
                      "id": 1467,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "27358:6:0",
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "27342:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "expression": {
                        "id": 1468,
                        "name": "_amounts",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1453,
                        "src": "27368:8:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[] calldata"
                        }
                      },
                      "id": 1469,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "27377:6:0",
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "27368:15:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "27342:41:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1474,
                  "nodeType": "IfStatement",
                  "src": "27338:70:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1471,
                        "name": "LengthMismatch",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 219,
                        "src": "27392:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 1472,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "27392:16:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 1473,
                    "nodeType": "RevertStatement",
                    "src": "27385:23:0"
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1478,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 1475,
                        "name": "_tokenContracts",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1450,
                        "src": "27417:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                          "typeString": "address[] calldata"
                        }
                      },
                      "id": 1476,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "27433:6:0",
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "27417:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "id": 1477,
                      "name": "ARRAY_LIMIT",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 116,
                      "src": "27442:11:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "27417:36:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1482,
                  "nodeType": "IfStatement",
                  "src": "27413:71:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1479,
                        "name": "DAOPool_ArrayTooLong",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 199,
                        "src": "27462:20:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 1480,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "27462:22:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 1481,
                    "nodeType": "RevertStatement",
                    "src": "27455:29:0"
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1486,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 1483,
                      "name": "_chainId",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1447,
                      "src": "27528:8:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "expression": {
                        "id": 1484,
                        "name": "block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -4,
                        "src": "27540:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_block",
                          "typeString": "block"
                        }
                      },
                      "id": 1485,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "27546:7:0",
                      "memberName": "chainid",
                      "nodeType": "MemberAccess",
                      "src": "27540:13:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "27528:25:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1490,
                  "nodeType": "IfStatement",
                  "src": "27524:54:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1487,
                        "name": "InvalidChainId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 215,
                        "src": "27562:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 1488,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "27562:16:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 1489,
                    "nodeType": "RevertStatement",
                    "src": "27555:23:0"
                  }
                },
                {
                  "assignments": [
                    1492
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1492,
                      "mutability": "mutable",
                      "name": "_zero",
                      "nameLocation": "27672:5:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1600,
                      "src": "27664:13:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 1491,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "27664:7:0",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1497,
                  "initialValue": {
                    "arguments": [
                      {
                        "hexValue": "30",
                        "id": 1495,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "27688:1:0",
                        "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": 1494,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "27680:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_address_$",
                        "typeString": "type(address)"
                      },
                      "typeName": {
                        "id": 1493,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "27680:7:0",
                        "typeDescriptions": {}
                      }
                    },
                    "id": 1496,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "27680:10:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "27664:26:0"
                },
                {
                  "assignments": [
                    1499
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1499,
                      "mutability": "mutable",
                      "name": "daoPool",
                      "nameLocation": "27703:7:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1600,
                      "src": "27695:15:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 1498,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "27695:7:0",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1504,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 1502,
                        "name": "this",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -28,
                        "src": "27721:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TransferUtils_$1711",
                          "typeString": "contract TransferUtils"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_TransferUtils_$1711",
                          "typeString": "contract TransferUtils"
                        }
                      ],
                      "id": 1501,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "27713:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_address_$",
                        "typeString": "type(address)"
                      },
                      "typeName": {
                        "id": 1500,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "27713:7:0",
                        "typeDescriptions": {}
                      }
                    },
                    "id": 1503,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "27713:13:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "27695:31:0"
                },
                {
                  "body": {
                    "id": 1585,
                    "nodeType": "Block",
                    "src": "27787:743:0",
                    "statements": [
                      {
                        "assignments": [
                          1514
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1514,
                            "mutability": "mutable",
                            "name": "_addr",
                            "nameLocation": "27810:5:0",
                            "nodeType": "VariableDeclaration",
                            "scope": 1585,
                            "src": "27802:13:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 1513,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "27802:7:0",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 1518,
                        "initialValue": {
                          "baseExpression": {
                            "id": 1515,
                            "name": "_tokenContracts",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1450,
                            "src": "27818:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                              "typeString": "address[] calldata"
                            }
                          },
                          "id": 1517,
                          "indexExpression": {
                            "id": 1516,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1506,
                            "src": "27834:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "27818:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "27802:34:0"
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 1521,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 1519,
                            "name": "_addr",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1514,
                            "src": "27846:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "id": 1520,
                            "name": "_zero",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1492,
                            "src": "27855:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "27846:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 1525,
                        "nodeType": "IfStatement",
                        "src": "27842:40:0",
                        "trueBody": {
                          "errorCall": {
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 1522,
                              "name": "ZeroAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 239,
                              "src": "27869:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                                "typeString": "function () pure returns (error)"
                              }
                            },
                            "id": 1523,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "27869:13:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_error",
                              "typeString": "error"
                            }
                          },
                          "id": 1524,
                          "nodeType": "RevertStatement",
                          "src": "27862:20:0"
                        }
                      },
                      {
                        "assignments": [
                          1527
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1527,
                            "mutability": "mutable",
                            "name": "_amt",
                            "nameLocation": "27896:4:0",
                            "nodeType": "VariableDeclaration",
                            "scope": 1585,
                            "src": "27888:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 1526,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "27888:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 1531,
                        "initialValue": {
                          "baseExpression": {
                            "id": 1528,
                            "name": "_amounts",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1453,
                            "src": "27903:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                              "typeString": "uint256[] calldata"
                            }
                          },
                          "id": 1530,
                          "indexExpression": {
                            "id": 1529,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1506,
                            "src": "27912:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "27903:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "27888:26:0"
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1534,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 1532,
                            "name": "_amt",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1527,
                            "src": "27924:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "hexValue": "30",
                            "id": 1533,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "27931:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "27924:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 1580,
                        "nodeType": "IfStatement",
                        "src": "27920:573:0",
                        "trueBody": {
                          "id": 1579,
                          "nodeType": "Block",
                          "src": "27934:559:0",
                          "statements": [
                            {
                              "assignments": [
                                1536
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 1536,
                                  "mutability": "mutable",
                                  "name": "_ourBalanceBefore",
                                  "nameLocation": "28012:17:0",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 1579,
                                  "src": "28004:25:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 1535,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "28004:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "visibility": "internal"
                                }
                              ],
                              "id": 1543,
                              "initialValue": {
                                "arguments": [
                                  {
                                    "id": 1541,
                                    "name": "daoPool",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1499,
                                    "src": "28064:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "arguments": [
                                      {
                                        "id": 1538,
                                        "name": "_addr",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1514,
                                        "src": "28047:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 1537,
                                      "name": "IERC20_DAOPool",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 30,
                                      "src": "28032:14:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_IERC20_DAOPool_$30_$",
                                        "typeString": "type(contract IERC20_DAOPool)"
                                      }
                                    },
                                    "id": 1539,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "nameLocations": [],
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "28032:21:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_DAOPool_$30",
                                      "typeString": "contract IERC20_DAOPool"
                                    }
                                  },
                                  "id": 1540,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "28054:9:0",
                                  "memberName": "balanceOf",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 12,
                                  "src": "28032:31:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                    "typeString": "function (address) view external returns (uint256)"
                                  }
                                },
                                "id": 1542,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "28032:40:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "28004:68:0"
                            },
                            {
                              "documentation": "@dev safeTransferFrom will revert on failure (for example if lacking proper permit or approve() from feesBot)",
                              "expression": {
                                "arguments": [
                                  {
                                    "id": 1547,
                                    "name": "feesBot",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 152,
                                    "src": "28221:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "id": 1548,
                                    "name": "daoPool",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1499,
                                    "src": "28230:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "id": 1549,
                                    "name": "_amt",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1527,
                                    "src": "28239:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "id": 1544,
                                    "name": "_addr",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1514,
                                    "src": "28198:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "id": 1546,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "28204:16:0",
                                  "memberName": "safeTransferFrom",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3058,
                                  "src": "28198:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_address_$",
                                    "typeString": "function (address,address,address,uint256)"
                                  }
                                },
                                "id": 1550,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "28198:46:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1551,
                              "nodeType": "ExpressionStatement",
                              "src": "28198:46:0"
                            },
                            {
                              "assignments": [
                                1553
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 1553,
                                  "mutability": "mutable",
                                  "name": "_ourBalanceAfter",
                                  "nameLocation": "28259:16:0",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 1579,
                                  "src": "28251:24:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 1552,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "28251:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "visibility": "internal"
                                }
                              ],
                              "id": 1560,
                              "initialValue": {
                                "arguments": [
                                  {
                                    "id": 1558,
                                    "name": "daoPool",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1499,
                                    "src": "28310:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "arguments": [
                                      {
                                        "id": 1555,
                                        "name": "_addr",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1514,
                                        "src": "28293:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 1554,
                                      "name": "IERC20_DAOPool",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 30,
                                      "src": "28278:14:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_IERC20_DAOPool_$30_$",
                                        "typeString": "type(contract IERC20_DAOPool)"
                                      }
                                    },
                                    "id": 1556,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "nameLocations": [],
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "28278:21:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_DAOPool_$30",
                                      "typeString": "contract IERC20_DAOPool"
                                    }
                                  },
                                  "id": 1557,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "28300:9:0",
                                  "memberName": "balanceOf",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 12,
                                  "src": "28278:31:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                    "typeString": "function (address) view external returns (uint256)"
                                  }
                                },
                                "id": 1559,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "28278:40:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "28251:67:0"
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 1564,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "id": 1562,
                                      "name": "_ourBalanceAfter",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1553,
                                      "src": "28333:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": ">=",
                                    "rightExpression": {
                                      "id": 1563,
                                      "name": "_ourBalanceBefore",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1536,
                                      "src": "28353:17:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "28333:37:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  ],
                                  "id": 1561,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "28325:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                                    "typeString": "function (bool) pure"
                                  }
                                },
                                "id": 1565,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "28325:46:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1566,
                              "nodeType": "ExpressionStatement",
                              "src": "28325:46:0"
                            },
                            {
                              "assignments": [
                                1568
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 1568,
                                  "mutability": "mutable",
                                  "name": "_netAmt",
                                  "nameLocation": "28386:7:0",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 1579,
                                  "src": "28378:15:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 1567,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "28378:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "visibility": "internal"
                                }
                              ],
                              "id": 1572,
                              "initialValue": {
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 1571,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "id": 1569,
                                  "name": "_ourBalanceAfter",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1553,
                                  "src": "28396:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "-",
                                "rightExpression": {
                                  "id": 1570,
                                  "name": "_ourBalanceBefore",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1536,
                                  "src": "28415:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "28396:36:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "28378:54:0"
                            },
                            {
                              "eventCall": {
                                "arguments": [
                                  {
                                    "id": 1574,
                                    "name": "_chainId",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1447,
                                    "src": "28461:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "id": 1575,
                                    "name": "_addr",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1514,
                                    "src": "28471:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "id": 1576,
                                    "name": "_netAmt",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1568,
                                    "src": "28478:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 1573,
                                  "name": "ImportFeeRevenue",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1374,
                                  "src": "28444:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (uint256,address,uint256)"
                                  }
                                },
                                "id": 1577,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "28444:42:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1578,
                              "nodeType": "EmitStatement",
                              "src": "28439:47:0"
                            }
                          ]
                        }
                      },
                      {
                        "id": 1584,
                        "nodeType": "UncheckedBlock",
                        "src": "28498:27:0",
                        "statements": [
                          {
                            "expression": {
                              "id": 1582,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "UnaryOperation",
                              "operator": "++",
                              "prefix": true,
                              "src": "28515:3:0",
                              "subExpression": {
                                "id": 1581,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1506,
                                "src": "28517:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 1583,
                            "nodeType": "ExpressionStatement",
                            "src": "28515:3:0"
                          }
                        ]
                      }
                    ]
                  },
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1512,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 1509,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1506,
                      "src": "27757:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "expression": {
                        "id": 1510,
                        "name": "_tokenContracts",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1450,
                        "src": "27761:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                          "typeString": "address[] calldata"
                        }
                      },
                      "id": 1511,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "27777:6:0",
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "27761:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "27757:26:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1586,
                  "initializationExpression": {
                    "assignments": [
                      1506
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 1506,
                        "mutability": "mutable",
                        "name": "i",
                        "nameLocation": "27750:1:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 1586,
                        "src": "27742:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1505,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "27742:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "visibility": "internal"
                      }
                    ],
                    "id": 1508,
                    "initialValue": {
                      "hexValue": "30",
                      "id": 1507,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "27754:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "27742:13:0"
                  },
                  "isSimpleCounterLoop": false,
                  "nodeType": "ForStatement",
                  "src": "27737:793:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1590,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 1587,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "28597:3:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 1588,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "28601:5:0",
                      "memberName": "value",
                      "nodeType": "MemberAccess",
                      "src": "28597:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 1589,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "28609:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "28597:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1599,
                  "nodeType": "IfStatement",
                  "src": "28593:80:0",
                  "trueBody": {
                    "id": 1598,
                    "nodeType": "Block",
                    "src": "28612:61:0",
                    "statements": [
                      {
                        "eventCall": {
                          "arguments": [
                            {
                              "id": 1592,
                              "name": "_chainId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1447,
                              "src": "28640:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "id": 1593,
                              "name": "_zero",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1492,
                              "src": "28650:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "expression": {
                                "id": 1594,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "28657:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 1595,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "28661:5:0",
                              "memberName": "value",
                              "nodeType": "MemberAccess",
                              "src": "28657:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1591,
                            "name": "ImportFeeRevenue",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1374,
                            "src": "28623:16:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (uint256,address,uint256)"
                            }
                          },
                          "id": 1596,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28623:44:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1597,
                        "nodeType": "EmitStatement",
                        "src": "28618:49:0"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 1445,
              "nodeType": "StructuredDocumentation",
              "src": "26551:539:0",
              "text": "@notice called by the feesBot to import fees earned by the DAOPool mirror contracts on other blockchains, to where they can be claimed by staking users\n @dev it is required that the feesBot execute prior approvals for xfers\n @dev ETH can be deposited by itself by passing 0-length arrays with a positive msg.value\n @param _chainId: the ID of the chain from which the fees are imported\n @param _tokenContracts: list of erc20 tokens being deposited\n @param _amounts: corresponding amounts for each token contract"
            },
            "functionSelector": "c330130d",
            "id": 1601,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 1456,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 1455,
                  "name": "nonReentrant",
                  "nameLocations": [
                    "27232:12:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 2994,
                  "src": "27232:12:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "27232:12:0"
              }
            ],
            "name": "importFees",
            "nameLocation": "27102:10:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1454,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1447,
                  "mutability": "mutable",
                  "name": "_chainId",
                  "nameLocation": "27125:8:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1601,
                  "src": "27117:16:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1446,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "27117:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1450,
                  "mutability": "mutable",
                  "name": "_tokenContracts",
                  "nameLocation": "27163:15:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1601,
                  "src": "27144:34:0",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 1448,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "27144:7:0",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 1449,
                    "nodeType": "ArrayTypeName",
                    "src": "27144:9:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1453,
                  "mutability": "mutable",
                  "name": "_amounts",
                  "nameLocation": "27202:8:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1601,
                  "src": "27183:27:0",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                    "typeString": "uint256[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 1451,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "27183:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 1452,
                    "nodeType": "ArrayTypeName",
                    "src": "27183:9:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                      "typeString": "uint256[]"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "27112:102:0"
            },
            "returnParameters": {
              "id": 1457,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "27245:0:0"
            },
            "scope": 1711,
            "src": "27093:1584:0",
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 1645,
              "nodeType": "Block",
              "src": "29068:484:0",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1612,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "29110:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1613,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "29114:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "29110:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "id": 1616,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "29130:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TransferUtils_$1711",
                              "typeString": "contract TransferUtils"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_TransferUtils_$1711",
                              "typeString": "contract TransferUtils"
                            }
                          ],
                          "id": 1615,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "29122:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 1614,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "29122:7:0",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 1617,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "29122:13:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 1618,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1604,
                        "src": "29137:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "id": 1609,
                        "name": "enshroudToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 146,
                        "src": "29079:13:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "id": 1611,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "29093:16:0",
                      "memberName": "safeTransferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3058,
                      "src": "29079:30:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_address_$",
                        "typeString": "function (address,address,address,uint256)"
                      }
                    },
                    "id": 1619,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "29079:66:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1620,
                  "nodeType": "ExpressionStatement",
                  "src": "29079:66:0"
                },
                {
                  "id": 1633,
                  "nodeType": "UncheckedBlock",
                  "src": "29361:109:0",
                  "statements": [
                    {
                      "expression": {
                        "id": 1627,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftHandSide": {
                          "expression": {
                            "baseExpression": {
                              "id": 1621,
                              "name": "users",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 164,
                              "src": "29386:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                                "typeString": "mapping(address => struct StateUtils.User storage ref)"
                              }
                            },
                            "id": 1624,
                            "indexExpression": {
                              "expression": {
                                "id": 1622,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "29392:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 1623,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "29396:6:0",
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "src": "29392:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "29386:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_User_$100_storage",
                              "typeString": "struct StateUtils.User storage ref"
                            }
                          },
                          "id": 1625,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": true,
                          "memberLocation": "29404:9:0",
                          "memberName": "deposited",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 91,
                          "src": "29386:27:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "Assignment",
                        "operator": "+=",
                        "rightHandSide": {
                          "id": 1626,
                          "name": "_amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1604,
                          "src": "29417:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "29386:38:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 1628,
                      "nodeType": "ExpressionStatement",
                      "src": "29386:38:0"
                    },
                    {
                      "expression": {
                        "id": 1631,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftHandSide": {
                          "id": 1629,
                          "name": "depositedUnstaked",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 155,
                          "src": "29430:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "Assignment",
                        "operator": "+=",
                        "rightHandSide": {
                          "id": 1630,
                          "name": "_amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1604,
                          "src": "29451:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "29430:28:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 1632,
                      "nodeType": "ExpressionStatement",
                      "src": "29430:28:0"
                    }
                  ]
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1635,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "29495:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1636,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "29499:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "29495:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 1637,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1604,
                        "src": "29507:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "expression": {
                          "baseExpression": {
                            "id": 1638,
                            "name": "users",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 164,
                            "src": "29516:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                              "typeString": "mapping(address => struct StateUtils.User storage ref)"
                            }
                          },
                          "id": 1641,
                          "indexExpression": {
                            "expression": {
                              "id": 1639,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "29522:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 1640,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "29526:6:0",
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "src": "29522:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "29516:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage",
                            "typeString": "struct StateUtils.User storage ref"
                          }
                        },
                        "id": 1642,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "29534:9:0",
                        "memberName": "deposited",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 91,
                        "src": "29516:27:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1634,
                      "name": "Deposited",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1358,
                      "src": "29485:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256,uint256)"
                      }
                    },
                    "id": 1643,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "29485:59:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1644,
                  "nodeType": "EmitStatement",
                  "src": "29480:64:0"
                }
              ]
            },
            "documentation": {
              "id": 1602,
              "nodeType": "StructuredDocumentation",
              "src": "28685:316:0",
              "text": "@notice Called by the user to deposit tokens to this contract. Will be a separate call to stake.\n @dev The user should approve the pool to spend at least `_amount` tokens before calling this.\n Public visibility as this is called by depositAndStake()\n @param _amount Amount to be deposited"
            },
            "functionSelector": "7fd75f26",
            "id": 1646,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 1607,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 1606,
                  "name": "nonReentrant",
                  "nameLocations": [
                    "29055:12:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 2994,
                  "src": "29055:12:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "29055:12:0"
              }
            ],
            "name": "depositRegular",
            "nameLocation": "29016:14:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1605,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1604,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "29039:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1646,
                  "src": "29031:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1603,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "29031:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "29030:17:0"
            },
            "returnParameters": {
              "id": 1608,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "29068:0:0"
            },
            "scope": 1711,
            "src": "29007:545:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1658,
              "nodeType": "Block",
              "src": "30086:49:0",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 1653,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1649,
                        "src": "30107:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "expression": {
                          "id": 1654,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "30116:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1655,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "30120:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "30116:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 1652,
                      "name": "_withdraw",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1710,
                      "src": "30097:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_address_$returns$__$",
                        "typeString": "function (uint256,address)"
                      }
                    },
                    "id": 1656,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "30097:30:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1657,
                  "nodeType": "ExpressionStatement",
                  "src": "30097:30:0"
                }
              ]
            },
            "documentation": {
              "id": 1647,
              "nodeType": "StructuredDocumentation",
              "src": "29560:471:0",
              "text": "@notice called by the user to withdraw tokens to their wallet\n @dev The user should ensure that they have at least `_amount` unlocked tokens to withdraw.\n @dev user can call updateTimelockStatus(msg.sender) before this to move any now-unlocked tokens into their deposited balance\n named `withdrawRegular()` to be consistent with the name 'depositRegular()`. See `depositRegular()` for more context.\n @param _amount: amount to be withdrawn"
            },
            "functionSelector": "e67729b7",
            "id": 1659,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "withdrawRegular",
            "nameLocation": "30046:15:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1650,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1649,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "30070:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1659,
                  "src": "30062:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1648,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "30062:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "30061:17:0"
            },
            "returnParameters": {
              "id": 1651,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "30086:0:0"
            },
            "scope": 1711,
            "src": "30037:98:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1709,
              "nodeType": "Block",
              "src": "30543:436:0",
              "statements": [
                {
                  "assignments": [
                    1669
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1669,
                      "mutability": "mutable",
                      "name": "user",
                      "nameLocation": "30567:4:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1709,
                      "src": "30554:17:0",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                        "typeString": "struct StateUtils.User"
                      },
                      "typeName": {
                        "id": 1668,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 1667,
                          "name": "User",
                          "nameLocations": [
                            "30554:4:0"
                          ],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 100,
                          "src": "30554:4:0"
                        },
                        "referencedDeclaration": 100,
                        "src": "30554:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                          "typeString": "struct StateUtils.User"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1673,
                  "initialValue": {
                    "baseExpression": {
                      "id": 1670,
                      "name": "users",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 164,
                      "src": "30574:5:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                        "typeString": "mapping(address => struct StateUtils.User storage ref)"
                      }
                    },
                    "id": 1672,
                    "indexExpression": {
                      "id": 1671,
                      "name": "_recipient",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1664,
                      "src": "30580:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "30574:17:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_User_$100_storage",
                      "typeString": "struct StateUtils.User storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "30554:37:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1677,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 1674,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1669,
                        "src": "30695:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                          "typeString": "struct StateUtils.User storage pointer"
                        }
                      },
                      "id": 1675,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "30700:9:0",
                      "memberName": "deposited",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 91,
                      "src": "30695:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "id": 1676,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1662,
                      "src": "30712:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "30695:24:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1681,
                  "nodeType": "IfStatement",
                  "src": "30691:61:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1678,
                        "name": "AmountExceedsDeposited",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 193,
                        "src": "30728:22:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 1679,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "30728:24:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 1680,
                    "nodeType": "RevertStatement",
                    "src": "30721:31:0"
                  }
                },
                {
                  "expression": {
                    "id": 1687,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 1682,
                          "name": "users",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 164,
                          "src": "30763:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                            "typeString": "mapping(address => struct StateUtils.User storage ref)"
                          }
                        },
                        "id": 1684,
                        "indexExpression": {
                          "id": 1683,
                          "name": "_recipient",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1664,
                          "src": "30769:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "30763:17:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage",
                          "typeString": "struct StateUtils.User storage ref"
                        }
                      },
                      "id": 1685,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "30781:9:0",
                      "memberName": "deposited",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 91,
                      "src": "30763:27:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "-=",
                    "rightHandSide": {
                      "id": 1686,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1662,
                      "src": "30794:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "30763:38:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1688,
                  "nodeType": "ExpressionStatement",
                  "src": "30763:38:0"
                },
                {
                  "expression": {
                    "id": 1691,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 1689,
                      "name": "depositedUnstaked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 155,
                      "src": "30806:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "-=",
                    "rightHandSide": {
                      "id": 1690,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1662,
                      "src": "30827:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "30806:28:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1692,
                  "nodeType": "ExpressionStatement",
                  "src": "30806:28:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 1696,
                        "name": "_recipient",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1664,
                        "src": "30874:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 1697,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1662,
                        "src": "30886:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "id": 1693,
                        "name": "enshroudToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 146,
                        "src": "30847:13:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "id": 1695,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "30861:12:0",
                      "memberName": "safeTransfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3044,
                      "src": "30847:26:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_address_$",
                        "typeString": "function (address,address,uint256)"
                      }
                    },
                    "id": 1698,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "30847:47:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1699,
                  "nodeType": "ExpressionStatement",
                  "src": "30847:47:0"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 1701,
                        "name": "_recipient",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1664,
                        "src": "30922:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 1702,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1662,
                        "src": "30934:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "expression": {
                          "baseExpression": {
                            "id": 1703,
                            "name": "users",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 164,
                            "src": "30943:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                              "typeString": "mapping(address => struct StateUtils.User storage ref)"
                            }
                          },
                          "id": 1705,
                          "indexExpression": {
                            "id": 1704,
                            "name": "_recipient",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1664,
                            "src": "30949:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "30943:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage",
                            "typeString": "struct StateUtils.User storage ref"
                          }
                        },
                        "id": 1706,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "30961:9:0",
                        "memberName": "deposited",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 91,
                        "src": "30943:27:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1700,
                      "name": "Withdrawn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1366,
                      "src": "30912:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256,uint256)"
                      }
                    },
                    "id": 1707,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "30912:59:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1708,
                  "nodeType": "EmitStatement",
                  "src": "30907:64:0"
                }
              ]
            },
            "documentation": {
              "id": 1660,
              "nodeType": "StructuredDocumentation",
              "src": "30145:328:0",
              "text": "@notice called internally after the amount of locked tokens of the user is determined\n @dev user should call updateTimelockStatus(_recipient) before this to move any now-unlocked tokens into their deposited balance\n @param _amount: amount to be withdrawn\n @param _recipient: address receiving withdrawal"
            },
            "id": 1710,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_withdraw",
            "nameLocation": "30488:9:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1665,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1662,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "30506:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1710,
                  "src": "30498:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1661,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "30498:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1664,
                  "mutability": "mutable",
                  "name": "_recipient",
                  "nameLocation": "30523:10:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1710,
                  "src": "30515:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1663,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "30515:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "30497:37:0"
            },
            "returnParameters": {
              "id": 1666,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "30543:0:0"
            },
            "scope": 1711,
            "src": "30479:500:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          }
        ],
        "scope": 2968,
        "src": "25090:5892:0",
        "usedErrors": [
          189,
          191,
          193,
          195,
          197,
          199,
          201,
          203,
          205,
          207,
          209,
          211,
          213,
          215,
          217,
          219,
          221,
          223,
          225,
          227,
          229,
          231,
          233,
          235,
          237,
          239,
          2972
        ],
        "usedEvents": [
          1022,
          1032,
          1044,
          1358,
          1366,
          1374
        ]
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "baseName": {
              "id": 1713,
              "name": "TransferUtils",
              "nameLocations": [
                "31064:13:0"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 1711,
              "src": "31064:13:0"
            },
            "id": 1714,
            "nodeType": "InheritanceSpecifier",
            "src": "31064:13:0"
          }
        ],
        "canonicalName": "StakeUtils",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 1712,
          "nodeType": "StructuredDocumentation",
          "src": "30986:46:0",
          "text": "@notice implements staking functionality"
        },
        "fullyImplemented": true,
        "id": 2141,
        "linearizedBaseContracts": [
          2141,
          1711,
          1344,
          1009,
          615,
          2995
        ],
        "name": "StakeUtils",
        "nameLocation": "31050:10:0",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "eventSelector": "c16be9a586414a157dd46b4d023aa9997a025dd1cbbaa67ac0c1b8273a5eaf55",
            "id": 1730,
            "name": "Staked",
            "nameLocation": "31091:6:0",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 1729,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1716,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "user",
                  "nameLocation": "31124:4:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1730,
                  "src": "31108:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1715,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "31108:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1718,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "31147:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1730,
                  "src": "31139:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1717,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31139:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1720,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "mintedShares",
                  "nameLocation": "31172:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1730,
                  "src": "31164:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1719,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31164:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1722,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "userUnstaked",
                  "nameLocation": "31203:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1730,
                  "src": "31195:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1721,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31195:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1724,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "userShares",
                  "nameLocation": "31234:10:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1730,
                  "src": "31226:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1723,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31226:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1726,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "totalShares",
                  "nameLocation": "31263:11:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1730,
                  "src": "31255:19:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1725,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31255:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1728,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "totalStake",
                  "nameLocation": "31293:10:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1730,
                  "src": "31285:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1727,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31285:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "31097:213:0"
            },
            "src": "31085:226:0"
          },
          {
            "anonymous": false,
            "eventSelector": "251830cd12788c7474148132132ab205112e7b9bba739f0e69c8d4a6a54e2159",
            "id": 1742,
            "name": "ScheduledUnstake",
            "nameLocation": "31325:16:0",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 1741,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1732,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "user",
                  "nameLocation": "31368:4:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1742,
                  "src": "31352:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1731,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "31352:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1734,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "31391:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1742,
                  "src": "31383:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1733,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31383:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1736,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "shares",
                  "nameLocation": "31416:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1742,
                  "src": "31408:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1735,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31408:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1738,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "scheduledFor",
                  "nameLocation": "31441:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1742,
                  "src": "31433:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1737,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31433:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1740,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "userShares",
                  "nameLocation": "31472:10:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1742,
                  "src": "31464:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1739,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31464:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "31341:148:0"
            },
            "src": "31319:171:0"
          },
          {
            "anonymous": false,
            "eventSelector": "dcfd2b4017d03f7e541021db793b2f9b31e4acdee005f789e52853c390e3e962",
            "id": 1754,
            "name": "Unstaked",
            "nameLocation": "31504:8:0",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 1753,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1744,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "user",
                  "nameLocation": "31539:4:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1754,
                  "src": "31523:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1743,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "31523:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1746,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "31562:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1754,
                  "src": "31554:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1745,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31554:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1748,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "userUnstaked",
                  "nameLocation": "31587:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1754,
                  "src": "31579:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1747,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31579:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1750,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "totalShares",
                  "nameLocation": "31618:11:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1754,
                  "src": "31610:19:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1749,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31610:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1752,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "totalStake",
                  "nameLocation": "31648:10:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1754,
                  "src": "31640:18:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1751,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31640:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "31512:153:0"
            },
            "src": "31498:168:0"
          },
          {
            "body": {
              "id": 1770,
              "nodeType": "Block",
              "src": "31865:79:0",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 1761,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1757,
                        "src": "31891:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1760,
                      "name": "depositRegular",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1646,
                      "src": "31876:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                        "typeString": "function (uint256)"
                      }
                    },
                    "id": 1762,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "31876:23:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1763,
                  "nodeType": "ExpressionStatement",
                  "src": "31876:23:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 1765,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1757,
                        "src": "31916:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "expression": {
                          "id": 1766,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "31925:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1767,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "31929:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "31925:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 1764,
                      "name": "stake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2022,
                      "src": "31910:5:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_address_$returns$__$",
                        "typeString": "function (uint256,address)"
                      }
                    },
                    "id": 1768,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "31910:26:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1769,
                  "nodeType": "ExpressionStatement",
                  "src": "31910:26:0"
                }
              ]
            },
            "documentation": {
              "id": 1755,
              "nodeType": "StructuredDocumentation",
              "src": "31674:134:0",
              "text": "@notice convenience method to deposit and stake in a single transaction\n @param _amount: amount to be deposited and staked"
            },
            "functionSelector": "59fe8539",
            "id": 1771,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "depositAndStake",
            "nameLocation": "31823:15:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1758,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1757,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "31847:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1771,
                  "src": "31839:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1756,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31839:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "31838:17:0"
            },
            "returnParameters": {
              "id": 1759,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "31865:0:0"
            },
            "scope": 2141,
            "src": "31814:130:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 1893,
              "nodeType": "Block",
              "src": "32483:1423:0",
              "statements": [
                {
                  "assignments": [
                    1778
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1778,
                      "mutability": "mutable",
                      "name": "_userSharesNow",
                      "nameLocation": "32502:14:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1893,
                      "src": "32494:22:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1777,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "32494:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1785,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1780,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "32532:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1781,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "32536:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "32532:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "expression": {
                          "id": 1782,
                          "name": "block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -4,
                          "src": "32544:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_block",
                            "typeString": "block"
                          }
                        },
                        "id": 1783,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "32550:6:0",
                        "memberName": "number",
                        "nodeType": "MemberAccess",
                        "src": "32544:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1779,
                      "name": "userSharesAt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 685,
                      "src": "32519:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (address,uint256) view returns (uint256)"
                      }
                    },
                    "id": 1784,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "32519:38:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "32494:63:0"
                },
                {
                  "assignments": [
                    1787
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1787,
                      "mutability": "mutable",
                      "name": "_totalSharesNow",
                      "nameLocation": "32576:15:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1893,
                      "src": "32568:23:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1786,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "32568:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1792,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1789,
                          "name": "block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -4,
                          "src": "32608:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_block",
                            "typeString": "block"
                          }
                        },
                        "id": 1790,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "32614:6:0",
                        "memberName": "number",
                        "nodeType": "MemberAccess",
                        "src": "32608:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1788,
                      "name": "totalSharesAt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 666,
                      "src": "32594:13:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256) view returns (uint256)"
                      }
                    },
                    "id": 1791,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "32594:27:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "32568:53:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1799,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "arguments": [
                        {
                          "id": 1794,
                          "name": "_userSharesNow",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1778,
                          "src": "32715:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "id": 1795,
                          "name": "totalStake",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 158,
                          "src": "32731:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "id": 1796,
                          "name": "_totalSharesNow",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1787,
                          "src": "32743:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "id": 1793,
                        "name": "_mulDivDown",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 614,
                        "src": "32703:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                          "typeString": "function (uint256,uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 1797,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "32703:56:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "id": 1798,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1774,
                      "src": "32762:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "32703:66:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1803,
                  "nodeType": "IfStatement",
                  "src": "32699:113:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1800,
                        "name": "AmountExceedsStaked",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 195,
                        "src": "32791:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 1801,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "32791:21:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 1802,
                    "nodeType": "RevertStatement",
                    "src": "32784:28:0"
                  }
                },
                {
                  "assignments": [
                    1806
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1806,
                      "mutability": "mutable",
                      "name": "user",
                      "nameLocation": "32838:4:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1893,
                      "src": "32825:17:0",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                        "typeString": "struct StateUtils.User"
                      },
                      "typeName": {
                        "id": 1805,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 1804,
                          "name": "User",
                          "nameLocations": [
                            "32825:4:0"
                          ],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 100,
                          "src": "32825:4:0"
                        },
                        "referencedDeclaration": 100,
                        "src": "32825:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                          "typeString": "struct StateUtils.User"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1811,
                  "initialValue": {
                    "baseExpression": {
                      "id": 1807,
                      "name": "users",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 164,
                      "src": "32845:5:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                        "typeString": "mapping(address => struct StateUtils.User storage ref)"
                      }
                    },
                    "id": 1810,
                    "indexExpression": {
                      "expression": {
                        "id": 1808,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "32851:3:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 1809,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "32855:6:0",
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "src": "32851:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "32845:17:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_User_$100_storage",
                      "typeString": "struct StateUtils.User storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "32825:37:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1815,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 1812,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1806,
                        "src": "32877:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                          "typeString": "struct StateUtils.User storage pointer"
                        }
                      },
                      "id": 1813,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "32882:19:0",
                      "memberName": "unstakeScheduledFor",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 97,
                      "src": "32877:24:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 1814,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "32905:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "32877:29:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1819,
                  "nodeType": "IfStatement",
                  "src": "32873:59:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1816,
                        "name": "ExistingUnstake",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 211,
                        "src": "32915:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 1817,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "32915:17:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 1818,
                    "nodeType": "RevertStatement",
                    "src": "32908:24:0"
                  }
                },
                {
                  "assignments": [
                    1821
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1821,
                      "mutability": "mutable",
                      "name": "_sharesToUnstake",
                      "nameLocation": "32953:16:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1893,
                      "src": "32945:24:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1820,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "32945:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1827,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 1823,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1774,
                        "src": "32998:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 1824,
                        "name": "_totalSharesNow",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1787,
                        "src": "33020:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 1825,
                        "name": "totalStake",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 158,
                        "src": "33050:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1822,
                      "name": "_mulDivDown",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 614,
                      "src": "32972:11:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256,uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 1826,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "32972:99:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "32945:126:0"
                },
                {
                  "assignments": [
                    1829
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1829,
                      "mutability": "mutable",
                      "name": "_userSharesUpdate",
                      "nameLocation": "33090:17:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 1893,
                      "src": "33082:25:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1828,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "33082:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1833,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1832,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 1830,
                      "name": "_userSharesNow",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1778,
                      "src": "33110:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "id": 1831,
                      "name": "_sharesToUnstake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1821,
                      "src": "33127:16:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "33110:33:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "33082:61:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1836,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 1834,
                      "name": "_sharesToUnstake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1821,
                      "src": "33227:16:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 1835,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "33247:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "33227:21:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1840,
                  "nodeType": "IfStatement",
                  "src": "33223:44:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1837,
                        "name": "NoShares",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 225,
                        "src": "33257:8:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 1838,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "33257:10:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 1839,
                    "nodeType": "RevertStatement",
                    "src": "33250:17:0"
                  }
                },
                {
                  "id": 1852,
                  "nodeType": "UncheckedBlock",
                  "src": "33327:124:0",
                  "statements": [
                    {
                      "expression": {
                        "id": 1850,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftHandSide": {
                          "expression": {
                            "baseExpression": {
                              "id": 1841,
                              "name": "users",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 164,
                              "src": "33352:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                                "typeString": "mapping(address => struct StateUtils.User storage ref)"
                              }
                            },
                            "id": 1844,
                            "indexExpression": {
                              "expression": {
                                "id": 1842,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "33358:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 1843,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "33362:6:0",
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "src": "33358:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "33352:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_User_$100_storage",
                              "typeString": "struct StateUtils.User storage ref"
                            }
                          },
                          "id": 1845,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": true,
                          "memberLocation": "33370:19:0",
                          "memberName": "unstakeScheduledFor",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 97,
                          "src": "33352:37:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "Assignment",
                        "operator": "=",
                        "rightHandSide": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1849,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 1846,
                              "name": "block",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -4,
                              "src": "33409:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_block",
                                "typeString": "block"
                              }
                            },
                            "id": 1847,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "33415:9:0",
                            "memberName": "timestamp",
                            "nodeType": "MemberAccess",
                            "src": "33409:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "+",
                          "rightExpression": {
                            "id": 1848,
                            "name": "EPOCH_LENGTH",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 130,
                            "src": "33427:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "33409:30:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "33352:87:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 1851,
                      "nodeType": "ExpressionStatement",
                      "src": "33352:87:0"
                    }
                  ]
                },
                {
                  "expression": {
                    "id": 1859,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 1853,
                          "name": "users",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 164,
                          "src": "33461:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                            "typeString": "mapping(address => struct StateUtils.User storage ref)"
                          }
                        },
                        "id": 1856,
                        "indexExpression": {
                          "expression": {
                            "id": 1854,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "33467:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 1855,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "33471:6:0",
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "33467:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "33461:17:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage",
                          "typeString": "struct StateUtils.User storage ref"
                        }
                      },
                      "id": 1857,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "33479:13:0",
                      "memberName": "unstakeAmount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 93,
                      "src": "33461:31:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 1858,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1774,
                      "src": "33495:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "33461:41:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1860,
                  "nodeType": "ExpressionStatement",
                  "src": "33461:41:0"
                },
                {
                  "expression": {
                    "id": 1867,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 1861,
                          "name": "users",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 164,
                          "src": "33513:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                            "typeString": "mapping(address => struct StateUtils.User storage ref)"
                          }
                        },
                        "id": 1864,
                        "indexExpression": {
                          "expression": {
                            "id": 1862,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "33519:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 1863,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "33523:6:0",
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "33519:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "33513:17:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage",
                          "typeString": "struct StateUtils.User storage ref"
                        }
                      },
                      "id": 1865,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "33531:13:0",
                      "memberName": "unstakeShares",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 95,
                      "src": "33513:31:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 1866,
                      "name": "_sharesToUnstake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1821,
                      "src": "33547:16:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "33513:50:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1868,
                  "nodeType": "ExpressionStatement",
                  "src": "33513:50:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1870,
                          "name": "user",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1806,
                          "src": "33599:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                            "typeString": "struct StateUtils.User storage pointer"
                          }
                        },
                        "id": 1871,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "33604:6:0",
                        "memberName": "shares",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 81,
                        "src": "33599:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        }
                      },
                      {
                        "id": 1872,
                        "name": "_userSharesUpdate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1829,
                        "src": "33612:17:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1869,
                      "name": "_updateCheckpointArray",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 462,
                      "src": "33576:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr_$_t_uint256_$returns$__$",
                        "typeString": "function (struct StateUtils.Checkpoint storage ref[] storage pointer,uint256)"
                      }
                    },
                    "id": 1873,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "33576:54:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1874,
                  "nodeType": "ExpressionStatement",
                  "src": "33576:54:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 1876,
                        "name": "_sharesToUnstake",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1821,
                        "src": "33669:16:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "hexValue": "66616c7365",
                        "id": 1877,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "bool",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "33687:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "value": "false"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 1875,
                      "name": "_updateDelegatedVotingPower",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1343,
                      "src": "33641:27:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_bool_$returns$__$",
                        "typeString": "function (uint256,bool)"
                      }
                    },
                    "id": 1878,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "33641:52:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1879,
                  "nodeType": "ExpressionStatement",
                  "src": "33641:52:0"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1881,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "33740:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 1882,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "33744:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "33740:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 1883,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1774,
                        "src": "33765:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 1884,
                        "name": "_sharesToUnstake",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1821,
                        "src": "33787:16:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "expression": {
                          "baseExpression": {
                            "id": 1885,
                            "name": "users",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 164,
                            "src": "33818:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                              "typeString": "mapping(address => struct StateUtils.User storage ref)"
                            }
                          },
                          "id": 1888,
                          "indexExpression": {
                            "expression": {
                              "id": 1886,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "33824:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 1887,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "33828:6:0",
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "src": "33824:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "33818:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage",
                            "typeString": "struct StateUtils.User storage ref"
                          }
                        },
                        "id": 1889,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "33836:19:0",
                        "memberName": "unstakeScheduledFor",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 97,
                        "src": "33818:37:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 1890,
                        "name": "_userSharesUpdate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1829,
                        "src": "33870:17:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1880,
                      "name": "ScheduledUnstake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1742,
                      "src": "33709:16:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256,uint256,uint256,uint256)"
                      }
                    },
                    "id": 1891,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "33709:189:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1892,
                  "nodeType": "EmitStatement",
                  "src": "33704:194:0"
                }
              ]
            },
            "documentation": {
              "id": 1772,
              "nodeType": "StructuredDocumentation",
              "src": "31952:474:0",
              "text": "@notice called by the user to schedule unstaking of their tokens\n @dev While scheduling an unstake, `shares` get deducted from the user, meaning that they will not receive voting power or yield claim for them any longer.\n At unstaking-time, the user unstakes either the amount of tokens scheduled to unstake, or the amount of tokens `shares` corresponds to at such time, whichever is smaller.\n @param _amount Amount of tokens scheduled to unstake"
            },
            "functionSelector": "106d08df",
            "id": 1894,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "scheduleUnstake",
            "nameLocation": "32441:15:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1775,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1774,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "32465:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 1894,
                  "src": "32457:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1773,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "32457:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "32456:17:0"
            },
            "returnParameters": {
              "id": 1776,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "32483:0:0"
            },
            "scope": 2141,
            "src": "32432:1474:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 1905,
              "nodeType": "Block",
              "src": "34177:55:0",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "expression": {
                              "id": 1900,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "34212:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 1901,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "34216:6:0",
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "src": "34212:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 1899,
                          "name": "unstake",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2140,
                          "src": "34204:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$_t_uint256_$",
                            "typeString": "function (address) returns (uint256)"
                          }
                        },
                        "id": 1902,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "34204:19:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1898,
                      "name": "withdrawRegular",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1659,
                      "src": "34188:15:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                        "typeString": "function (uint256)"
                      }
                    },
                    "id": 1903,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "34188:36:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1904,
                  "nodeType": "ExpressionStatement",
                  "src": "34188:36:0"
                }
              ]
            },
            "documentation": {
              "id": 1895,
              "nodeType": "StructuredDocumentation",
              "src": "33914:218:0",
              "text": "@notice convenience method to execute an unstake and withdraw to the user's wallet in a single transaction\n @dev withdrawal will revert if the user has less than `unstakeAmount` tokens that are withdrawable"
            },
            "functionSelector": "8dd04faa",
            "id": 1906,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "unstakeAndWithdraw",
            "nameLocation": "34147:18:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1896,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "34165:2:0"
            },
            "returnParameters": {
              "id": 1897,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "34177:0:0"
            },
            "scope": 2141,
            "src": "34138:94:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 2021,
              "nodeType": "Block",
              "src": "34592:1143:0",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 1919,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 1916,
                      "name": "_staker",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1911,
                      "src": "34601:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "expression": {
                        "id": 1917,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "34612:3:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 1918,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "34616:6:0",
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "src": "34612:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "34601:21:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1923,
                  "nodeType": "IfStatement",
                  "src": "34597:51:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1920,
                        "name": "NotDepositOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 227,
                        "src": "34631:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 1921,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "34631:17:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 1922,
                    "nodeType": "RevertStatement",
                    "src": "34624:24:0"
                  }
                },
                {
                  "assignments": [
                    1926
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1926,
                      "mutability": "mutable",
                      "name": "user",
                      "nameLocation": "34672:4:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2021,
                      "src": "34659:17:0",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                        "typeString": "struct StateUtils.User"
                      },
                      "typeName": {
                        "id": 1925,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 1924,
                          "name": "User",
                          "nameLocations": [
                            "34659:4:0"
                          ],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 100,
                          "src": "34659:4:0"
                        },
                        "referencedDeclaration": 100,
                        "src": "34659:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                          "typeString": "struct StateUtils.User"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1930,
                  "initialValue": {
                    "baseExpression": {
                      "id": 1927,
                      "name": "users",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 164,
                      "src": "34679:5:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                        "typeString": "mapping(address => struct StateUtils.User storage ref)"
                      }
                    },
                    "id": 1929,
                    "indexExpression": {
                      "id": 1928,
                      "name": "_staker",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1911,
                      "src": "34685:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "34679:14:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_User_$100_storage",
                      "typeString": "struct StateUtils.User storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "34659:34:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1934,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 1931,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1909,
                      "src": "34708:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "expression": {
                        "id": 1932,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1926,
                        "src": "34718:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                          "typeString": "struct StateUtils.User storage pointer"
                        }
                      },
                      "id": 1933,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "34723:9:0",
                      "memberName": "deposited",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 91,
                      "src": "34718:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "34708:24:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 1938,
                  "nodeType": "IfStatement",
                  "src": "34704:61:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 1935,
                        "name": "AmountExceedsDeposited",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 193,
                        "src": "34741:22:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 1936,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "34741:24:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 1937,
                    "nodeType": "RevertStatement",
                    "src": "34734:31:0"
                  }
                },
                {
                  "assignments": [
                    1940
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1940,
                      "mutability": "mutable",
                      "name": "_totalSharesNow",
                      "nameLocation": "34784:15:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2021,
                      "src": "34776:23:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1939,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "34776:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1945,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1942,
                          "name": "block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -4,
                          "src": "34816:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_block",
                            "typeString": "block"
                          }
                        },
                        "id": 1943,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "34822:6:0",
                        "memberName": "number",
                        "nodeType": "MemberAccess",
                        "src": "34816:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1941,
                      "name": "totalSharesAt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 666,
                      "src": "34802:13:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256) view returns (uint256)"
                      }
                    },
                    "id": 1944,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "34802:27:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "34776:53:0"
                },
                {
                  "assignments": [
                    1947
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1947,
                      "mutability": "mutable",
                      "name": "_sharesToMint",
                      "nameLocation": "34848:13:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2021,
                      "src": "34840:21:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1946,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "34840:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1953,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 1949,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1909,
                        "src": "34890:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 1950,
                        "name": "_totalSharesNow",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1940,
                        "src": "34912:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 1951,
                        "name": "totalStake",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 158,
                        "src": "34942:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1948,
                      "name": "_mulDivDown",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 614,
                      "src": "34864:11:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256,uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 1952,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "34864:99:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "34840:123:0"
                },
                {
                  "assignments": [
                    1955
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1955,
                      "mutability": "mutable",
                      "name": "_userSharesUpdate",
                      "nameLocation": "34982:17:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2021,
                      "src": "34974:25:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1954,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "34974:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1963,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1962,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "arguments": [
                        {
                          "id": 1957,
                          "name": "_staker",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1911,
                          "src": "35015:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "expression": {
                            "id": 1958,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -4,
                            "src": "35024:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 1959,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "35030:6:0",
                          "memberName": "number",
                          "nodeType": "MemberAccess",
                          "src": "35024:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "id": 1956,
                        "name": "userSharesAt",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 685,
                        "src": "35002:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                          "typeString": "function (address,uint256) view returns (uint256)"
                        }
                      },
                      "id": 1960,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "35002:35:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "id": 1961,
                      "name": "_sharesToMint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1947,
                      "src": "35053:13:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "35002:64:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "34974:92:0"
                },
                {
                  "assignments": [
                    1965
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 1965,
                      "mutability": "mutable",
                      "name": "_totalSharesUpdate",
                      "nameLocation": "35085:18:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2021,
                      "src": "35077:26:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 1964,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "35077:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 1969,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 1968,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 1966,
                      "name": "_totalSharesNow",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1940,
                      "src": "35106:15:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "id": 1967,
                      "name": "_sharesToMint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1947,
                      "src": "35124:13:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "35106:31:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "35077:60:0"
                },
                {
                  "expression": {
                    "id": 1975,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 1970,
                          "name": "users",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 164,
                          "src": "35150:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                            "typeString": "mapping(address => struct StateUtils.User storage ref)"
                          }
                        },
                        "id": 1972,
                        "indexExpression": {
                          "id": 1971,
                          "name": "_staker",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1911,
                          "src": "35156:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "35150:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage",
                          "typeString": "struct StateUtils.User storage ref"
                        }
                      },
                      "id": 1973,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "35165:9:0",
                      "memberName": "deposited",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 91,
                      "src": "35150:24:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "-=",
                    "rightHandSide": {
                      "id": 1974,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1909,
                      "src": "35178:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "35150:35:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1976,
                  "nodeType": "ExpressionStatement",
                  "src": "35150:35:0"
                },
                {
                  "expression": {
                    "id": 1979,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 1977,
                      "name": "depositedUnstaked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 155,
                      "src": "35190:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "-=",
                    "rightHandSide": {
                      "id": 1978,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1909,
                      "src": "35211:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "35190:28:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1980,
                  "nodeType": "ExpressionStatement",
                  "src": "35190:28:0"
                },
                {
                  "expression": {
                    "id": 1983,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 1981,
                      "name": "totalStake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 158,
                      "src": "35229:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "+=",
                    "rightHandSide": {
                      "id": 1982,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1909,
                      "src": "35243:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "35229:21:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1984,
                  "nodeType": "ExpressionStatement",
                  "src": "35229:21:0"
                },
                {
                  "expression": {
                    "id": 1990,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 1985,
                        "name": "mostRecentStake",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 169,
                        "src": "35261:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                          "typeString": "mapping(address => uint256)"
                        }
                      },
                      "id": 1987,
                      "indexExpression": {
                        "id": 1986,
                        "name": "_staker",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1911,
                        "src": "35277:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "35261:24:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "expression": {
                        "id": 1988,
                        "name": "block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -4,
                        "src": "35288:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_block",
                          "typeString": "block"
                        }
                      },
                      "id": 1989,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "35294:6:0",
                      "memberName": "number",
                      "nodeType": "MemberAccess",
                      "src": "35288:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "35261:39:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1991,
                  "nodeType": "ExpressionStatement",
                  "src": "35261:39:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 1993,
                          "name": "user",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1926,
                          "src": "35336:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                            "typeString": "struct StateUtils.User storage pointer"
                          }
                        },
                        "id": 1994,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "35341:6:0",
                        "memberName": "shares",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 81,
                        "src": "35336:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        }
                      },
                      {
                        "id": 1995,
                        "name": "_userSharesUpdate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1955,
                        "src": "35349:17:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1992,
                      "name": "_updateCheckpointArray",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 462,
                      "src": "35313:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr_$_t_uint256_$returns$__$",
                        "typeString": "function (struct StateUtils.Checkpoint storage ref[] storage pointer,uint256)"
                      }
                    },
                    "id": 1996,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "35313:54:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1997,
                  "nodeType": "ExpressionStatement",
                  "src": "35313:54:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 1999,
                        "name": "poolShares",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 181,
                        "src": "35401:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        }
                      },
                      {
                        "id": 2000,
                        "name": "_totalSharesUpdate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1965,
                        "src": "35413:18:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 1998,
                      "name": "_updateCheckpointArray",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 462,
                      "src": "35378:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr_$_t_uint256_$returns$__$",
                        "typeString": "function (struct StateUtils.Checkpoint storage ref[] storage pointer,uint256)"
                      }
                    },
                    "id": 2001,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "35378:54:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2002,
                  "nodeType": "ExpressionStatement",
                  "src": "35378:54:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 2004,
                        "name": "_sharesToMint",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1947,
                        "src": "35471:13:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "hexValue": "74727565",
                        "id": 2005,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "bool",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "35486:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "value": "true"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 2003,
                      "name": "_updateDelegatedVotingPower",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1343,
                      "src": "35443:27:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_bool_$returns$__$",
                        "typeString": "function (uint256,bool)"
                      }
                    },
                    "id": 2006,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "35443:48:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2007,
                  "nodeType": "ExpressionStatement",
                  "src": "35443:48:0"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 2009,
                        "name": "_staker",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1911,
                        "src": "35530:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 2010,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1909,
                        "src": "35552:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 2011,
                        "name": "_sharesToMint",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1947,
                        "src": "35574:13:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "expression": {
                          "baseExpression": {
                            "id": 2012,
                            "name": "users",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 164,
                            "src": "35602:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                              "typeString": "mapping(address => struct StateUtils.User storage ref)"
                            }
                          },
                          "id": 2014,
                          "indexExpression": {
                            "id": 2013,
                            "name": "_staker",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1911,
                            "src": "35608:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "35602:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage",
                            "typeString": "struct StateUtils.User storage ref"
                          }
                        },
                        "id": 2015,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "35617:9:0",
                        "memberName": "deposited",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 91,
                        "src": "35602:24:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 2016,
                        "name": "_userSharesUpdate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1955,
                        "src": "35641:17:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 2017,
                        "name": "_totalSharesUpdate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1965,
                        "src": "35673:18:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 2018,
                        "name": "totalStake",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 158,
                        "src": "35706:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2008,
                      "name": "Staked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1730,
                      "src": "35509:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256,uint256,uint256,uint256,uint256,uint256)"
                      }
                    },
                    "id": 2019,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "35509:218:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2020,
                  "nodeType": "EmitStatement",
                  "src": "35504:223:0"
                }
              ]
            },
            "documentation": {
              "id": 1907,
              "nodeType": "StructuredDocumentation",
              "src": "34240:277:0",
              "text": "@notice called to stake tokens (from user's deposited amount) to receive shares in the pool\n @param _amount: amount of tokens to stake\n @param _staker: address staking _amount (msg.sender if calling directly, or the address which called 'depositAndStake()')"
            },
            "functionSelector": "7acb7757",
            "id": 2022,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 1914,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 1913,
                  "name": "nonReentrant",
                  "nameLocations": [
                    "34579:12:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 2994,
                  "src": "34579:12:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "34579:12:0"
              }
            ],
            "name": "stake",
            "nameLocation": "34532:5:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1912,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1909,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "34546:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2022,
                  "src": "34538:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1908,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "34538:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1911,
                  "mutability": "mutable",
                  "name": "_staker",
                  "nameLocation": "34563:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2022,
                  "src": "34555:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1910,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "34555:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "34537:34:0"
            },
            "returnParameters": {
              "id": 1915,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "34592:0:0"
            },
            "scope": 2141,
            "src": "34523:1212:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2139,
              "nodeType": "Block",
              "src": "36146:1267:0",
              "statements": [
                {
                  "assignments": [
                    2032
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2032,
                      "mutability": "mutable",
                      "name": "user",
                      "nameLocation": "36170:4:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2139,
                      "src": "36157:17:0",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                        "typeString": "struct StateUtils.User"
                      },
                      "typeName": {
                        "id": 2031,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 2030,
                          "name": "User",
                          "nameLocations": [
                            "36157:4:0"
                          ],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 100,
                          "src": "36157:4:0"
                        },
                        "referencedDeclaration": 100,
                        "src": "36157:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                          "typeString": "struct StateUtils.User"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2036,
                  "initialValue": {
                    "baseExpression": {
                      "id": 2033,
                      "name": "users",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 164,
                      "src": "36177:5:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                        "typeString": "mapping(address => struct StateUtils.User storage ref)"
                      }
                    },
                    "id": 2035,
                    "indexExpression": {
                      "id": 2034,
                      "name": "_userAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2025,
                      "src": "36183:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "36177:19:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_User_$100_storage",
                      "typeString": "struct StateUtils.User storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "36157:39:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 2046,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 2040,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "expression": {
                          "id": 2037,
                          "name": "user",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2032,
                          "src": "36225:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                            "typeString": "struct StateUtils.User storage pointer"
                          }
                        },
                        "id": 2038,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "36230:19:0",
                        "memberName": "unstakeScheduledFor",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 97,
                        "src": "36225:24:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "hexValue": "30",
                        "id": 2039,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "36253:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_0_by_1",
                          "typeString": "int_const 0"
                        },
                        "value": "0"
                      },
                      "src": "36225:29:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "||",
                    "rightExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 2045,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "expression": {
                          "id": 2041,
                          "name": "user",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2032,
                          "src": "36271:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                            "typeString": "struct StateUtils.User storage pointer"
                          }
                        },
                        "id": 2042,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "36276:19:0",
                        "memberName": "unstakeScheduledFor",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 97,
                        "src": "36271:24:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": ">",
                      "rightExpression": {
                        "expression": {
                          "id": 2043,
                          "name": "block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -4,
                          "src": "36298:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_block",
                            "typeString": "block"
                          }
                        },
                        "id": 2044,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "36304:9:0",
                        "memberName": "timestamp",
                        "nodeType": "MemberAccess",
                        "src": "36298:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "36271:42:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "36225:88:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2050,
                  "nodeType": "IfStatement",
                  "src": "36207:146:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 2047,
                        "name": "UnstakeNotAvailable",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 237,
                        "src": "36332:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 2048,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "36332:21:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 2049,
                    "nodeType": "RevertStatement",
                    "src": "36325:28:0"
                  }
                },
                {
                  "assignments": [
                    2052
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2052,
                      "mutability": "mutable",
                      "name": "_totalShares",
                      "nameLocation": "36372:12:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2139,
                      "src": "36364:20:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2051,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "36364:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2057,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 2054,
                          "name": "block",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -4,
                          "src": "36401:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_block",
                            "typeString": "block"
                          }
                        },
                        "id": 2055,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "36407:6:0",
                        "memberName": "number",
                        "nodeType": "MemberAccess",
                        "src": "36401:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2053,
                      "name": "totalSharesAt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 666,
                      "src": "36387:13:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256) view returns (uint256)"
                      }
                    },
                    "id": 2056,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "36387:27:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "36364:50:0"
                },
                {
                  "assignments": [
                    2059
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2059,
                      "mutability": "mutable",
                      "name": "_unstakeAmount",
                      "nameLocation": "36433:14:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2139,
                      "src": "36425:22:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2058,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "36425:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2062,
                  "initialValue": {
                    "expression": {
                      "id": 2060,
                      "name": "user",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2032,
                      "src": "36450:4:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                        "typeString": "struct StateUtils.User storage pointer"
                      }
                    },
                    "id": 2061,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberLocation": "36455:13:0",
                    "memberName": "unstakeAmount",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 93,
                    "src": "36450:18:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "36425:43:0"
                },
                {
                  "assignments": [
                    2064
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2064,
                      "mutability": "mutable",
                      "name": "_unstakeAmountByShares",
                      "nameLocation": "36487:22:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2139,
                      "src": "36479:30:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2063,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "36479:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2071,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 2066,
                          "name": "user",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2032,
                          "src": "36538:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                            "typeString": "struct StateUtils.User storage pointer"
                          }
                        },
                        "id": 2067,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "36543:13:0",
                        "memberName": "unstakeShares",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 95,
                        "src": "36538:18:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 2068,
                        "name": "totalStake",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 158,
                        "src": "36571:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 2069,
                        "name": "_totalShares",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2052,
                        "src": "36596:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2065,
                      "name": "_mulDivDown",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 614,
                      "src": "36512:11:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256,uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 2070,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "36512:107:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "36479:140:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2074,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 2072,
                      "name": "_unstakeAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2059,
                      "src": "36634:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "id": 2073,
                      "name": "_unstakeAmountByShares",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2064,
                      "src": "36651:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "36634:39:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2080,
                  "nodeType": "IfStatement",
                  "src": "36630:111:0",
                  "trueBody": {
                    "id": 2079,
                    "nodeType": "Block",
                    "src": "36675:66:0",
                    "statements": [
                      {
                        "expression": {
                          "id": 2077,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "id": 2075,
                            "name": "_unstakeAmount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2059,
                            "src": "36690:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "id": 2076,
                            "name": "_unstakeAmountByShares",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2064,
                            "src": "36707:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "36690:39:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2078,
                        "nodeType": "ExpressionStatement",
                        "src": "36690:39:0"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    2082
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2082,
                      "mutability": "mutable",
                      "name": "_totalSharesUpdate",
                      "nameLocation": "36759:18:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2139,
                      "src": "36751:26:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2081,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "36751:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2087,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2086,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 2083,
                      "name": "_totalShares",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2052,
                      "src": "36780:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "expression": {
                        "id": 2084,
                        "name": "user",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2032,
                        "src": "36795:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage_ptr",
                          "typeString": "struct StateUtils.User storage pointer"
                        }
                      },
                      "id": 2085,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "36800:13:0",
                      "memberName": "unstakeShares",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 95,
                      "src": "36795:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "36780:33:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "36751:62:0"
                },
                {
                  "expression": {
                    "id": 2093,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 2088,
                          "name": "users",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 164,
                          "src": "36826:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                            "typeString": "mapping(address => struct StateUtils.User storage ref)"
                          }
                        },
                        "id": 2090,
                        "indexExpression": {
                          "id": 2089,
                          "name": "_userAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2025,
                          "src": "36832:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "36826:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage",
                          "typeString": "struct StateUtils.User storage ref"
                        }
                      },
                      "id": 2091,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "36846:9:0",
                      "memberName": "deposited",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 91,
                      "src": "36826:29:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "+=",
                    "rightHandSide": {
                      "id": 2092,
                      "name": "_unstakeAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2059,
                      "src": "36859:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "36826:47:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2094,
                  "nodeType": "ExpressionStatement",
                  "src": "36826:47:0"
                },
                {
                  "expression": {
                    "id": 2097,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 2095,
                      "name": "depositedUnstaked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 155,
                      "src": "36878:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "+=",
                    "rightHandSide": {
                      "id": 2096,
                      "name": "_unstakeAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2059,
                      "src": "36899:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "36878:35:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2098,
                  "nodeType": "ExpressionStatement",
                  "src": "36878:35:0"
                },
                {
                  "expression": {
                    "id": 2101,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 2099,
                      "name": "totalStake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 158,
                      "src": "36924:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "-=",
                    "rightHandSide": {
                      "id": 2100,
                      "name": "_unstakeAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2059,
                      "src": "36938:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "36924:28:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2102,
                  "nodeType": "ExpressionStatement",
                  "src": "36924:28:0"
                },
                {
                  "expression": {
                    "id": 2107,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "delete",
                    "prefix": true,
                    "src": "36963:40:0",
                    "subExpression": {
                      "expression": {
                        "baseExpression": {
                          "id": 2103,
                          "name": "users",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 164,
                          "src": "36970:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                            "typeString": "mapping(address => struct StateUtils.User storage ref)"
                          }
                        },
                        "id": 2105,
                        "indexExpression": {
                          "id": 2104,
                          "name": "_userAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2025,
                          "src": "36976:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "36970:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage",
                          "typeString": "struct StateUtils.User storage ref"
                        }
                      },
                      "id": 2106,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "36990:13:0",
                      "memberName": "unstakeAmount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 93,
                      "src": "36970:33:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2108,
                  "nodeType": "ExpressionStatement",
                  "src": "36963:40:0"
                },
                {
                  "expression": {
                    "id": 2113,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "delete",
                    "prefix": true,
                    "src": "37014:40:0",
                    "subExpression": {
                      "expression": {
                        "baseExpression": {
                          "id": 2109,
                          "name": "users",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 164,
                          "src": "37021:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                            "typeString": "mapping(address => struct StateUtils.User storage ref)"
                          }
                        },
                        "id": 2111,
                        "indexExpression": {
                          "id": 2110,
                          "name": "_userAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2025,
                          "src": "37027:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "37021:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage",
                          "typeString": "struct StateUtils.User storage ref"
                        }
                      },
                      "id": 2112,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "37041:13:0",
                      "memberName": "unstakeShares",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 95,
                      "src": "37021:33:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2114,
                  "nodeType": "ExpressionStatement",
                  "src": "37014:40:0"
                },
                {
                  "expression": {
                    "id": 2119,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "delete",
                    "prefix": true,
                    "src": "37065:46:0",
                    "subExpression": {
                      "expression": {
                        "baseExpression": {
                          "id": 2115,
                          "name": "users",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 164,
                          "src": "37072:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                            "typeString": "mapping(address => struct StateUtils.User storage ref)"
                          }
                        },
                        "id": 2117,
                        "indexExpression": {
                          "id": 2116,
                          "name": "_userAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2025,
                          "src": "37078:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "37072:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage",
                          "typeString": "struct StateUtils.User storage ref"
                        }
                      },
                      "id": 2118,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "37092:19:0",
                      "memberName": "unstakeScheduledFor",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 97,
                      "src": "37072:39:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2120,
                  "nodeType": "ExpressionStatement",
                  "src": "37065:46:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 2122,
                        "name": "poolShares",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 181,
                        "src": "37147:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        }
                      },
                      {
                        "id": 2123,
                        "name": "_totalSharesUpdate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2082,
                        "src": "37159:18:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage",
                          "typeString": "struct StateUtils.Checkpoint storage ref[] storage ref"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2121,
                      "name": "_updateCheckpointArray",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 462,
                      "src": "37124:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_array$_t_struct$_Checkpoint_$76_storage_$dyn_storage_ptr_$_t_uint256_$returns$__$",
                        "typeString": "function (struct StateUtils.Checkpoint storage ref[] storage pointer,uint256)"
                      }
                    },
                    "id": 2124,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "37124:54:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2125,
                  "nodeType": "ExpressionStatement",
                  "src": "37124:54:0"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 2127,
                        "name": "_userAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2025,
                        "src": "37219:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 2128,
                        "name": "_unstakeAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2059,
                        "src": "37246:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "expression": {
                          "baseExpression": {
                            "id": 2129,
                            "name": "users",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 164,
                            "src": "37275:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                              "typeString": "mapping(address => struct StateUtils.User storage ref)"
                            }
                          },
                          "id": 2131,
                          "indexExpression": {
                            "id": 2130,
                            "name": "_userAddress",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2025,
                            "src": "37281:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "37275:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_User_$100_storage",
                            "typeString": "struct StateUtils.User storage ref"
                          }
                        },
                        "id": 2132,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "37295:9:0",
                        "memberName": "deposited",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 91,
                        "src": "37275:29:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 2133,
                        "name": "_totalSharesUpdate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2082,
                        "src": "37319:18:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 2134,
                        "name": "totalStake",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 158,
                        "src": "37352:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2126,
                      "name": "Unstaked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1754,
                      "src": "37196:8:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256,uint256,uint256,uint256)"
                      }
                    },
                    "id": 2135,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "37196:177:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2136,
                  "nodeType": "EmitStatement",
                  "src": "37191:182:0"
                },
                {
                  "expression": {
                    "id": 2137,
                    "name": "_unstakeAmount",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2059,
                    "src": "37391:14:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2029,
                  "id": 2138,
                  "nodeType": "Return",
                  "src": "37384:21:0"
                }
              ]
            },
            "documentation": {
              "id": 2023,
              "nodeType": "StructuredDocumentation",
              "src": "35743:333:0",
              "text": "@notice called to execute a pre-scheduled unstake; unstaked tokens will become 'deposited'\n @dev anyone can execute a matured unstake. This is to allow the user to use bots, etc. to execute their unstaking as soon as possible.\n @param _userAddress: user address\n @return amount of tokens that are unstaked"
            },
            "functionSelector": "f2888dbb",
            "id": 2140,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "unstake",
            "nameLocation": "36091:7:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2026,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2025,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "36107:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2140,
                  "src": "36099:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2024,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "36099:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "36098:22:0"
            },
            "returnParameters": {
              "id": 2029,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2028,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 2140,
                  "src": "36137:7:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2027,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "36137:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "36136:9:0"
            },
            "scope": 2141,
            "src": "36082:1331:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 2968,
        "src": "31032:6384:0",
        "usedErrors": [
          189,
          191,
          193,
          195,
          197,
          199,
          201,
          203,
          205,
          207,
          209,
          211,
          213,
          215,
          217,
          219,
          221,
          223,
          225,
          227,
          229,
          231,
          233,
          235,
          237,
          239,
          2972
        ],
        "usedEvents": [
          1022,
          1032,
          1044,
          1358,
          1366,
          1374,
          1730,
          1742,
          1754
        ]
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "baseName": {
              "id": 2143,
              "name": "StakeUtils",
              "nameLocations": [
                "37646:10:0"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 2141,
              "src": "37646:10:0"
            },
            "id": 2144,
            "nodeType": "InheritanceSpecifier",
            "src": "37646:10:0"
          }
        ],
        "canonicalName": "TimelockUtils",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 2142,
          "nodeType": "StructuredDocumentation",
          "src": "37420:191:0",
          "text": "@notice implements unlocking functionality\n @dev The TimelockManager contract interfaces with this contract to transfer $ENSHROUD tokens that are locked under an unlocking schedule."
        },
        "fullyImplemented": true,
        "id": 2423,
        "linearizedBaseContracts": [
          2423,
          2141,
          1711,
          1344,
          1009,
          615,
          2995
        ],
        "name": "TimelockUtils",
        "nameLocation": "37629:13:0",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "global": false,
            "id": 2147,
            "libraryName": {
              "id": 2145,
              "name": "SafeTransferLib",
              "nameLocations": [
                "37670:15:0"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 3059,
              "src": "37670:15:0"
            },
            "nodeType": "UsingForDirective",
            "src": "37664:34:0",
            "typeName": {
              "id": 2146,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "37690:7:0",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            }
          },
          {
            "anonymous": false,
            "eventSelector": "d0d7fef3966369afd08c0683ee833a06f6b91787b85a26fa3ef3004ae37484c2",
            "id": 2155,
            "name": "DepositedByTimelockManager",
            "nameLocation": "37712:26:0",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 2154,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2149,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "user",
                  "nameLocation": "37765:4:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2155,
                  "src": "37749:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2148,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "37749:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2151,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "37788:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2155,
                  "src": "37780:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2150,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "37780:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2153,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "userUnstaked",
                  "nameLocation": "37813:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2155,
                  "src": "37805:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2152,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "37805:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "37738:94:0"
            },
            "src": "37706:127:0"
          },
          {
            "anonymous": false,
            "eventSelector": "b0d3f9330e2e2794afb39bfa558a5b6f1775dfb9a3abbd79baa86787cc0b5352",
            "id": 2165,
            "name": "DepositedUnlocking",
            "nameLocation": "37847:18:0",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 2164,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2157,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "user",
                  "nameLocation": "37892:4:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2165,
                  "src": "37876:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2156,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "37876:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2159,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "37915:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2165,
                  "src": "37907:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2158,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "37907:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2161,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "start",
                  "nameLocation": "37940:5:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2165,
                  "src": "37932:13:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint128",
                    "typeString": "uint128"
                  },
                  "typeName": {
                    "id": 2160,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "37932:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2163,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "end",
                  "nameLocation": "37964:3:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2165,
                  "src": "37956:11:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint128",
                    "typeString": "uint128"
                  },
                  "typeName": {
                    "id": 2162,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "37956:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "37865:109:0"
            },
            "src": "37841:134:0"
          },
          {
            "anonymous": false,
            "eventSelector": "39c46ef75850c0a26ce64be0754ad75954c96c439faa9d80198dd9145a89deea",
            "id": 2173,
            "name": "UpdatedTimelock",
            "nameLocation": "37989:15:0",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 2172,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2167,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "user",
                  "nameLocation": "38031:4:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2173,
                  "src": "38015:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2166,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "38015:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2169,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "38054:6:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2173,
                  "src": "38046:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2168,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "38046:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2171,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "userUnlocking",
                  "nameLocation": "38079:13:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2173,
                  "src": "38071:21:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2170,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "38071:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "38004:95:0"
            },
            "src": "37983:117:0"
          },
          {
            "canonicalName": "TimelockUtils.Timelock",
            "id": 2182,
            "members": [
              {
                "constant": false,
                "id": 2175,
                "mutability": "mutable",
                "name": "totalAmount",
                "nameLocation": "38194:11:0",
                "nodeType": "VariableDeclaration",
                "scope": 2182,
                "src": "38186:19:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 2174,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "38186:7:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 2177,
                "mutability": "mutable",
                "name": "remainingAmount",
                "nameLocation": "38256:15:0",
                "nodeType": "VariableDeclaration",
                "scope": 2182,
                "src": "38248:23:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 2176,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "38248:7:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 2179,
                "mutability": "mutable",
                "name": "releaseStart",
                "nameLocation": "38340:12:0",
                "nodeType": "VariableDeclaration",
                "scope": 2182,
                "src": "38332:20:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint128",
                  "typeString": "uint128"
                },
                "typeName": {
                  "id": 2178,
                  "name": "uint128",
                  "nodeType": "ElementaryTypeName",
                  "src": "38332:7:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint128",
                    "typeString": "uint128"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 2181,
                "mutability": "mutable",
                "name": "releaseEnd",
                "nameLocation": "38419:10:0",
                "nodeType": "VariableDeclaration",
                "scope": 2182,
                "src": "38411:18:0",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint128",
                  "typeString": "uint128"
                },
                "typeName": {
                  "id": 2180,
                  "name": "uint128",
                  "nodeType": "ElementaryTypeName",
                  "src": "38411:7:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint128",
                    "typeString": "uint128"
                  }
                },
                "visibility": "internal"
              }
            ],
            "name": "Timelock",
            "nameLocation": "38115:8:0",
            "nodeType": "StructDefinition",
            "scope": 2423,
            "src": "38108:329:0",
            "visibility": "public"
          },
          {
            "constant": false,
            "documentation": {
              "id": 2183,
              "nodeType": "StructuredDocumentation",
              "src": "38445:88:0",
              "text": "@notice maps user addresses to timelocks (user can only have one Timelock at a time)"
            },
            "functionSelector": "8b8e39d6",
            "id": 2188,
            "mutability": "mutable",
            "name": "userToTimelock",
            "nameLocation": "38575:14:0",
            "nodeType": "VariableDeclaration",
            "scope": 2423,
            "src": "38539:50:0",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Timelock_$2182_storage_$",
              "typeString": "mapping(address => struct TimelockUtils.Timelock)"
            },
            "typeName": {
              "id": 2187,
              "keyName": "",
              "keyNameLocation": "-1:-1:-1",
              "keyType": {
                "id": 2184,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "38547:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "38539:28:0",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Timelock_$2182_storage_$",
                "typeString": "mapping(address => struct TimelockUtils.Timelock)"
              },
              "valueName": "",
              "valueNameLocation": "-1:-1:-1",
              "valueType": {
                "id": 2186,
                "nodeType": "UserDefinedTypeName",
                "pathNode": {
                  "id": 2185,
                  "name": "Timelock",
                  "nameLocations": [
                    "38558:8:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 2182,
                  "src": "38558:8:0"
                },
                "referencedDeclaration": 2182,
                "src": "38558:8:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_Timelock_$2182_storage_ptr",
                  "typeString": "struct TimelockUtils.Timelock"
                }
              }
            },
            "visibility": "public"
          },
          {
            "body": {
              "id": 2237,
              "nodeType": "Block",
              "src": "39082:337:0",
              "statements": [
                {
                  "assignments": [
                    2201
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2201,
                      "mutability": "mutable",
                      "name": "_unstakedUpdate",
                      "nameLocation": "39101:15:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2237,
                      "src": "39093:23:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2200,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "39093:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2208,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2207,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "baseExpression": {
                          "id": 2202,
                          "name": "users",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 164,
                          "src": "39119:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                            "typeString": "mapping(address => struct StateUtils.User storage ref)"
                          }
                        },
                        "id": 2204,
                        "indexExpression": {
                          "id": 2203,
                          "name": "_userAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2193,
                          "src": "39125:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "39119:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage",
                          "typeString": "struct StateUtils.User storage ref"
                        }
                      },
                      "id": 2205,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "39139:9:0",
                      "memberName": "deposited",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 91,
                      "src": "39119:29:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "id": 2206,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2195,
                      "src": "39151:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "39119:39:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "39093:65:0"
                },
                {
                  "expression": {
                    "id": 2214,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 2209,
                          "name": "users",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 164,
                          "src": "39171:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                            "typeString": "mapping(address => struct StateUtils.User storage ref)"
                          }
                        },
                        "id": 2211,
                        "indexExpression": {
                          "id": 2210,
                          "name": "_userAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2193,
                          "src": "39177:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "39171:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage",
                          "typeString": "struct StateUtils.User storage ref"
                        }
                      },
                      "id": 2212,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "39191:9:0",
                      "memberName": "deposited",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 91,
                      "src": "39171:29:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 2213,
                      "name": "_unstakedUpdate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2201,
                      "src": "39203:15:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "39171:47:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2215,
                  "nodeType": "ExpressionStatement",
                  "src": "39171:47:0"
                },
                {
                  "expression": {
                    "id": 2218,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 2216,
                      "name": "depositedUnstaked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 155,
                      "src": "39223:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "+=",
                    "rightHandSide": {
                      "id": 2217,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2195,
                      "src": "39244:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "39223:28:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2219,
                  "nodeType": "ExpressionStatement",
                  "src": "39223:28:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 2223,
                        "name": "_source",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2191,
                        "src": "39295:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "id": 2226,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "39312:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TimelockUtils_$2423",
                              "typeString": "contract TimelockUtils"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_TimelockUtils_$2423",
                              "typeString": "contract TimelockUtils"
                            }
                          ],
                          "id": 2225,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "39304:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 2224,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "39304:7:0",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 2227,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "39304:13:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 2228,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2195,
                        "src": "39319:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "id": 2220,
                        "name": "enshroudToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 146,
                        "src": "39264:13:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "id": 2222,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "39278:16:0",
                      "memberName": "safeTransferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3058,
                      "src": "39264:30:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_address_$",
                        "typeString": "function (address,address,address,uint256)"
                      }
                    },
                    "id": 2229,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "39264:63:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2230,
                  "nodeType": "ExpressionStatement",
                  "src": "39264:63:0"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 2232,
                        "name": "_userAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2193,
                        "src": "39372:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 2233,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2195,
                        "src": "39386:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 2234,
                        "name": "_unstakedUpdate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2201,
                        "src": "39395:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2231,
                      "name": "DepositedByTimelockManager",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2155,
                      "src": "39345:26:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256,uint256)"
                      }
                    },
                    "id": 2235,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "39345:66:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2236,
                  "nodeType": "EmitStatement",
                  "src": "39340:71:0"
                }
              ]
            },
            "documentation": {
              "id": 2189,
              "nodeType": "StructuredDocumentation",
              "src": "38598:342:0",
              "text": "@notice called by the TimelockManager contract to deposit unlocked withdrawable tokens on behalf of a user\n @dev this method is only usable by `TimelockManager.sol`.\n @param _source Token transfer source\n @param _userAddress User that the tokens will be deposited for\n @param _amount Amount to be deposited"
            },
            "functionSelector": "8340f549",
            "id": 2238,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 2198,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 2197,
                  "name": "onlyTimelockManager",
                  "nameLocations": [
                    "39062:19:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 269,
                  "src": "39062:19:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "39062:19:0"
              }
            ],
            "name": "deposit",
            "nameLocation": "38955:7:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2196,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2191,
                  "mutability": "mutable",
                  "name": "_source",
                  "nameLocation": "38981:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2238,
                  "src": "38973:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2190,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "38973:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2193,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "39007:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2238,
                  "src": "38999:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2192,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "38999:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2195,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "39038:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2238,
                  "src": "39030:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2194,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "39030:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "38962:90:0"
            },
            "returnParameters": {
              "id": 2199,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "39082:0:0"
            },
            "scope": 2423,
            "src": "38946:473:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 2304,
              "nodeType": "Block",
              "src": "40314:803:0",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2259,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "baseExpression": {
                          "id": 2254,
                          "name": "userToTimelock",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2188,
                          "src": "40329:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Timelock_$2182_storage_$",
                            "typeString": "mapping(address => struct TimelockUtils.Timelock storage ref)"
                          }
                        },
                        "id": 2256,
                        "indexExpression": {
                          "id": 2255,
                          "name": "_userAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2243,
                          "src": "40344:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "40329:28:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Timelock_$2182_storage",
                          "typeString": "struct TimelockUtils.Timelock storage ref"
                        }
                      },
                      "id": 2257,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "40358:15:0",
                      "memberName": "remainingAmount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2177,
                      "src": "40329:44:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 2258,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "40377:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "40329:49:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2263,
                  "nodeType": "IfStatement",
                  "src": "40325:101:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 2260,
                        "name": "DAOPool_ExistingTimelock",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 201,
                        "src": "40400:24:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 2261,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "40400:26:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 2262,
                    "nodeType": "RevertStatement",
                    "src": "40393:33:0"
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    },
                    "id": 2266,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 2264,
                      "name": "_releaseEnd",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2249,
                      "src": "40441:11:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint128",
                        "typeString": "uint128"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<=",
                    "rightExpression": {
                      "id": 2265,
                      "name": "_releaseStart",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2247,
                      "src": "40456:13:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint128",
                        "typeString": "uint128"
                      }
                    },
                    "src": "40441:28:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2270,
                  "nodeType": "IfStatement",
                  "src": "40437:70:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 2267,
                        "name": "DAOPool_StartMustPrecedeEnd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 207,
                        "src": "40478:27:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 2268,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "40478:29:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 2269,
                    "nodeType": "RevertStatement",
                    "src": "40471:36:0"
                  }
                },
                {
                  "expression": {
                    "id": 2280,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 2271,
                        "name": "userToTimelock",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2188,
                        "src": "40569:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Timelock_$2182_storage_$",
                          "typeString": "mapping(address => struct TimelockUtils.Timelock storage ref)"
                        }
                      },
                      "id": 2273,
                      "indexExpression": {
                        "id": 2272,
                        "name": "_userAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2243,
                        "src": "40584:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "40569:28:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Timelock_$2182_storage",
                        "typeString": "struct TimelockUtils.Timelock storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "id": 2275,
                          "name": "_amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2245,
                          "src": "40637:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "id": 2276,
                          "name": "_amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2245,
                          "src": "40676:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "id": 2277,
                          "name": "_releaseStart",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2247,
                          "src": "40712:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        {
                          "id": 2278,
                          "name": "_releaseEnd",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2249,
                          "src": "40752:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          },
                          {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        ],
                        "id": 2274,
                        "name": "Timelock",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2182,
                        "src": "40600:8:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_struct$_Timelock_$2182_storage_ptr_$",
                          "typeString": "type(struct TimelockUtils.Timelock storage pointer)"
                        }
                      },
                      "id": 2279,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "structConstructorCall",
                      "lValueRequested": false,
                      "nameLocations": [
                        "40624:11:0",
                        "40659:15:0",
                        "40698:12:0",
                        "40740:10:0"
                      ],
                      "names": [
                        "totalAmount",
                        "remainingAmount",
                        "releaseStart",
                        "releaseEnd"
                      ],
                      "nodeType": "FunctionCall",
                      "src": "40600:175:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Timelock_$2182_memory_ptr",
                        "typeString": "struct TimelockUtils.Timelock memory"
                      }
                    },
                    "src": "40569:206:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Timelock_$2182_storage",
                      "typeString": "struct TimelockUtils.Timelock storage ref"
                    }
                  },
                  "id": 2281,
                  "nodeType": "ExpressionStatement",
                  "src": "40569:206:0"
                },
                {
                  "expression": {
                    "id": 2284,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 2282,
                      "name": "depositedUnstaked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 155,
                      "src": "40855:17:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "+=",
                    "rightHandSide": {
                      "id": 2283,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2245,
                      "src": "40876:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "40855:28:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2285,
                  "nodeType": "ExpressionStatement",
                  "src": "40855:28:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 2289,
                        "name": "_source",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2241,
                        "src": "40927:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "id": 2292,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "40944:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TimelockUtils_$2423",
                              "typeString": "contract TimelockUtils"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_TimelockUtils_$2423",
                              "typeString": "contract TimelockUtils"
                            }
                          ],
                          "id": 2291,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "40936:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 2290,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "40936:7:0",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 2293,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "40936:13:0",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 2294,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2245,
                        "src": "40951:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "id": 2286,
                        "name": "enshroudToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 146,
                        "src": "40896:13:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "id": 2288,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "40910:16:0",
                      "memberName": "safeTransferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3058,
                      "src": "40896:30:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_address_$",
                        "typeString": "function (address,address,address,uint256)"
                      }
                    },
                    "id": 2295,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "40896:63:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2296,
                  "nodeType": "ExpressionStatement",
                  "src": "40896:63:0"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 2298,
                        "name": "_userAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2243,
                        "src": "41010:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 2299,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2245,
                        "src": "41037:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 2300,
                        "name": "_releaseStart",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2247,
                        "src": "41059:13:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        }
                      },
                      {
                        "id": 2301,
                        "name": "_releaseEnd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2249,
                        "src": "41087:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        }
                      ],
                      "id": 2297,
                      "name": "DepositedUnlocking",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2165,
                      "src": "40977:18:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint128_$_t_uint128_$returns$__$",
                        "typeString": "function (address,uint256,uint128,uint128)"
                      }
                    },
                    "id": 2302,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "40977:132:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2303,
                  "nodeType": "EmitStatement",
                  "src": "40972:137:0"
                }
              ]
            },
            "documentation": {
              "id": 2239,
              "nodeType": "StructuredDocumentation",
              "src": "39427:672:0",
              "text": "@notice Called by the TimelockManager contract to deposit locked, non-withdrawable tokens on behalf of a user on a linear unlock schedule\n @dev to protect locked tokens from getting distributed as rewards, the depositedUnstaked total is incremented\n @dev locked tokens cannot be staked, but can be unlocked and become deposited (see updateTimelockStatus())\n @param _source token source address (Timelock Manager)\n @param _userAddress Address of the user who will receive the tokens\n @param _amount Token amount\n @param _releaseStart unlocking schedule starting block\n @param _releaseEnd unlocking schedule ending block"
            },
            "functionSelector": "29e05e3a",
            "id": 2305,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 2252,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 2251,
                  "name": "onlyTimelockManager",
                  "nameLocations": [
                    "40294:19:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 269,
                  "src": "40294:19:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "40294:19:0"
              }
            ],
            "name": "depositWithLocking",
            "nameLocation": "40114:18:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2250,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2241,
                  "mutability": "mutable",
                  "name": "_source",
                  "nameLocation": "40151:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2305,
                  "src": "40143:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2240,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "40143:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2243,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "40177:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2305,
                  "src": "40169:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2242,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "40169:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2245,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "40208:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2305,
                  "src": "40200:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2244,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "40200:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2247,
                  "mutability": "mutable",
                  "name": "_releaseStart",
                  "nameLocation": "40234:13:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2305,
                  "src": "40226:21:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint128",
                    "typeString": "uint128"
                  },
                  "typeName": {
                    "id": 2246,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "40226:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2249,
                  "mutability": "mutable",
                  "name": "_releaseEnd",
                  "nameLocation": "40266:11:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2305,
                  "src": "40258:19:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint128",
                    "typeString": "uint128"
                  },
                  "typeName": {
                    "id": 2248,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "40258:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "40132:152:0"
            },
            "returnParameters": {
              "id": 2253,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "40314:0:0"
            },
            "scope": 2423,
            "src": "40105:1012:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 2421,
              "nodeType": "Block",
              "src": "41506:1375:0",
              "statements": [
                {
                  "assignments": [
                    2313
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2313,
                      "mutability": "mutable",
                      "name": "timelock",
                      "nameLocation": "41534:8:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2421,
                      "src": "41517:25:0",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Timelock_$2182_storage_ptr",
                        "typeString": "struct TimelockUtils.Timelock"
                      },
                      "typeName": {
                        "id": 2312,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 2311,
                          "name": "Timelock",
                          "nameLocations": [
                            "41517:8:0"
                          ],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 2182,
                          "src": "41517:8:0"
                        },
                        "referencedDeclaration": 2182,
                        "src": "41517:8:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Timelock_$2182_storage_ptr",
                          "typeString": "struct TimelockUtils.Timelock"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2317,
                  "initialValue": {
                    "baseExpression": {
                      "id": 2314,
                      "name": "userToTimelock",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2188,
                      "src": "41545:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Timelock_$2182_storage_$",
                        "typeString": "mapping(address => struct TimelockUtils.Timelock storage ref)"
                      }
                    },
                    "id": 2316,
                    "indexExpression": {
                      "id": 2315,
                      "name": "_userAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2308,
                      "src": "41560:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "41545:28:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Timelock_$2182_storage",
                      "typeString": "struct TimelockUtils.Timelock storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "41517:56:0"
                },
                {
                  "assignments": [
                    2319
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2319,
                      "mutability": "mutable",
                      "name": "_start",
                      "nameLocation": "41592:6:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2421,
                      "src": "41584:14:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2318,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "41584:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2325,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 2322,
                          "name": "timelock",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2313,
                          "src": "41609:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Timelock_$2182_storage_ptr",
                            "typeString": "struct TimelockUtils.Timelock storage pointer"
                          }
                        },
                        "id": 2323,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "41618:12:0",
                        "memberName": "releaseStart",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 2179,
                        "src": "41609:21:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        }
                      ],
                      "id": 2321,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "41601:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_uint256_$",
                        "typeString": "type(uint256)"
                      },
                      "typeName": {
                        "id": 2320,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "41601:7:0",
                        "typeDescriptions": {}
                      }
                    },
                    "id": 2324,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "41601:30:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "41584:47:0"
                },
                {
                  "assignments": [
                    2327
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2327,
                      "mutability": "mutable",
                      "name": "_end",
                      "nameLocation": "41650:4:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2421,
                      "src": "41642:12:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2326,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "41642:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2333,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 2330,
                          "name": "timelock",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2313,
                          "src": "41665:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Timelock_$2182_storage_ptr",
                            "typeString": "struct TimelockUtils.Timelock storage pointer"
                          }
                        },
                        "id": 2331,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "41674:10:0",
                        "memberName": "releaseEnd",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 2181,
                        "src": "41665:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        }
                      ],
                      "id": 2329,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "41657:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_uint256_$",
                        "typeString": "type(uint256)"
                      },
                      "typeName": {
                        "id": 2328,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "41657:7:0",
                        "typeDescriptions": {}
                      }
                    },
                    "id": 2332,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "41657:28:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "41642:43:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2337,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 2334,
                        "name": "block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -4,
                        "src": "41700:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_block",
                          "typeString": "block"
                        }
                      },
                      "id": 2335,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "41706:6:0",
                      "memberName": "number",
                      "nodeType": "MemberAccess",
                      "src": "41700:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<=",
                    "rightExpression": {
                      "id": 2336,
                      "name": "_start",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2319,
                      "src": "41716:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "41700:22:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2341,
                  "nodeType": "IfStatement",
                  "src": "41696:62:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 2338,
                        "name": "DAOPool_ReleaseNotStarted",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 203,
                        "src": "41731:25:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 2339,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "41731:27:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 2340,
                    "nodeType": "RevertStatement",
                    "src": "41724:34:0"
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2345,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 2342,
                        "name": "timelock",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2313,
                        "src": "41855:8:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Timelock_$2182_storage_ptr",
                          "typeString": "struct TimelockUtils.Timelock storage pointer"
                        }
                      },
                      "id": 2343,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "41864:15:0",
                      "memberName": "remainingAmount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2177,
                      "src": "41855:24:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 2344,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "41883:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "41855:29:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2349,
                  "nodeType": "IfStatement",
                  "src": "41851:64:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 2346,
                        "name": "DAOPool_ReleaseEnded",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 205,
                        "src": "41893:20:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 2347,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "41893:22:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 2348,
                    "nodeType": "RevertStatement",
                    "src": "41886:29:0"
                  }
                },
                {
                  "assignments": [
                    2351
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2351,
                      "mutability": "mutable",
                      "name": "_totalUnlocked",
                      "nameLocation": "41936:14:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2421,
                      "src": "41928:22:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2350,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "41928:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2352,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "41928:22:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2356,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 2353,
                        "name": "block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -4,
                        "src": "41965:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_block",
                          "typeString": "block"
                        }
                      },
                      "id": 2354,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "41971:6:0",
                      "memberName": "number",
                      "nodeType": "MemberAccess",
                      "src": "41965:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">=",
                    "rightExpression": {
                      "id": 2355,
                      "name": "_end",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2327,
                      "src": "41981:4:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "41965:20:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 2385,
                    "nodeType": "Block",
                    "src": "42057:271:0",
                    "statements": [
                      {
                        "assignments": [
                          2364
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2364,
                            "mutability": "mutable",
                            "name": "passedTime",
                            "nameLocation": "42080:10:0",
                            "nodeType": "VariableDeclaration",
                            "scope": 2385,
                            "src": "42072:18:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2363,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "42072:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 2369,
                        "initialValue": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2368,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 2365,
                              "name": "block",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -4,
                              "src": "42093:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_block",
                                "typeString": "block"
                              }
                            },
                            "id": 2366,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "42099:6:0",
                            "memberName": "number",
                            "nodeType": "MemberAccess",
                            "src": "42093:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "id": 2367,
                            "name": "_start",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2319,
                            "src": "42108:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "42093:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "42072:42:0"
                      },
                      {
                        "assignments": [
                          2371
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2371,
                            "mutability": "mutable",
                            "name": "totalTime",
                            "nameLocation": "42137:9:0",
                            "nodeType": "VariableDeclaration",
                            "scope": 2385,
                            "src": "42129:17:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2370,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "42129:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 2375,
                        "initialValue": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2374,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 2372,
                            "name": "_end",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2327,
                            "src": "42149:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "id": 2373,
                            "name": "_start",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2319,
                            "src": "42156:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "42149:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "42129:33:0"
                      },
                      {
                        "expression": {
                          "id": 2383,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "id": 2376,
                            "name": "_totalUnlocked",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2351,
                            "src": "42177:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "arguments": [
                              {
                                "expression": {
                                  "id": 2378,
                                  "name": "timelock",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2313,
                                  "src": "42224:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Timelock_$2182_storage_ptr",
                                    "typeString": "struct TimelockUtils.Timelock storage pointer"
                                  }
                                },
                                "id": 2379,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberLocation": "42233:11:0",
                                "memberName": "totalAmount",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 2175,
                                "src": "42224:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "id": 2380,
                                "name": "passedTime",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2364,
                                "src": "42263:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "id": 2381,
                                "name": "totalTime",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2371,
                                "src": "42292:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 2377,
                              "name": "_mulDivDown",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 614,
                              "src": "42194:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                "typeString": "function (uint256,uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2382,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "42194:122:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "42177:139:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2384,
                        "nodeType": "ExpressionStatement",
                        "src": "42177:139:0"
                      }
                    ]
                  },
                  "id": 2386,
                  "nodeType": "IfStatement",
                  "src": "41961:367:0",
                  "trueBody": {
                    "id": 2362,
                    "nodeType": "Block",
                    "src": "41987:64:0",
                    "statements": [
                      {
                        "expression": {
                          "id": 2360,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "id": 2357,
                            "name": "_totalUnlocked",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2351,
                            "src": "42002:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "expression": {
                              "id": 2358,
                              "name": "timelock",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2313,
                              "src": "42019:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Timelock_$2182_storage_ptr",
                                "typeString": "struct TimelockUtils.Timelock storage pointer"
                              }
                            },
                            "id": 2359,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "42028:11:0",
                            "memberName": "totalAmount",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2175,
                            "src": "42019:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "42002:37:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2361,
                        "nodeType": "ExpressionStatement",
                        "src": "42002:37:0"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    2388
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2388,
                      "mutability": "mutable",
                      "name": "_newlyUnlocked",
                      "nameLocation": "42348:14:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2421,
                      "src": "42340:22:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2387,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "42340:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2397,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2396,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 2389,
                      "name": "_totalUnlocked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2351,
                      "src": "42365:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "components": [
                        {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2394,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 2390,
                              "name": "timelock",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2313,
                              "src": "42396:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Timelock_$2182_storage_ptr",
                                "typeString": "struct TimelockUtils.Timelock storage pointer"
                              }
                            },
                            "id": 2391,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "42405:11:0",
                            "memberName": "totalAmount",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2175,
                            "src": "42396:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "expression": {
                              "id": 2392,
                              "name": "timelock",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2313,
                              "src": "42419:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Timelock_$2182_storage_ptr",
                                "typeString": "struct TimelockUtils.Timelock storage pointer"
                              }
                            },
                            "id": 2393,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "42428:15:0",
                            "memberName": "remainingAmount",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2177,
                            "src": "42419:24:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "42396:47:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 2395,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "TupleExpression",
                      "src": "42395:49:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "42365:79:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "42340:104:0"
                },
                {
                  "expression": {
                    "id": 2403,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 2398,
                          "name": "users",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 164,
                          "src": "42594:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_User_$100_storage_$",
                            "typeString": "mapping(address => struct StateUtils.User storage ref)"
                          }
                        },
                        "id": 2400,
                        "indexExpression": {
                          "id": 2399,
                          "name": "_userAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2308,
                          "src": "42600:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "42594:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_User_$100_storage",
                          "typeString": "struct StateUtils.User storage ref"
                        }
                      },
                      "id": 2401,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "42614:9:0",
                      "memberName": "deposited",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 91,
                      "src": "42594:29:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "+=",
                    "rightHandSide": {
                      "id": 2402,
                      "name": "_newlyUnlocked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2388,
                      "src": "42627:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "42594:47:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2404,
                  "nodeType": "ExpressionStatement",
                  "src": "42594:47:0"
                },
                {
                  "expression": {
                    "id": 2410,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 2405,
                          "name": "userToTimelock",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2188,
                          "src": "42652:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Timelock_$2182_storage_$",
                            "typeString": "mapping(address => struct TimelockUtils.Timelock storage ref)"
                          }
                        },
                        "id": 2407,
                        "indexExpression": {
                          "id": 2406,
                          "name": "_userAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2308,
                          "src": "42667:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "42652:28:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Timelock_$2182_storage",
                          "typeString": "struct TimelockUtils.Timelock storage ref"
                        }
                      },
                      "id": 2408,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "42681:15:0",
                      "memberName": "remainingAmount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2177,
                      "src": "42652:44:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "-=",
                    "rightHandSide": {
                      "id": 2409,
                      "name": "_newlyUnlocked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2388,
                      "src": "42700:14:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "42652:62:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2411,
                  "nodeType": "ExpressionStatement",
                  "src": "42652:62:0"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 2413,
                        "name": "_userAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2308,
                        "src": "42762:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 2414,
                        "name": "_newlyUnlocked",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2388,
                        "src": "42789:14:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "expression": {
                          "baseExpression": {
                            "id": 2415,
                            "name": "userToTimelock",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2188,
                            "src": "42818:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Timelock_$2182_storage_$",
                              "typeString": "mapping(address => struct TimelockUtils.Timelock storage ref)"
                            }
                          },
                          "id": 2417,
                          "indexExpression": {
                            "id": 2416,
                            "name": "_userAddress",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2308,
                            "src": "42833:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "42818:28:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Timelock_$2182_storage",
                            "typeString": "struct TimelockUtils.Timelock storage ref"
                          }
                        },
                        "id": 2418,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "42847:15:0",
                        "memberName": "remainingAmount",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 2177,
                        "src": "42818:44:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2412,
                      "name": "UpdatedTimelock",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2173,
                      "src": "42732:15:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256,uint256)"
                      }
                    },
                    "id": 2419,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "42732:141:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2420,
                  "nodeType": "EmitStatement",
                  "src": "42727:146:0"
                }
              ]
            },
            "documentation": {
              "id": 2306,
              "nodeType": "StructuredDocumentation",
              "src": "41125:314:0",
              "text": "@notice Called to release tokens locked by the timelock and update state\n @dev must be called in order to update a timelock user's 'deposited' amount -- it initialises at 0 regardless of the timelock's _releaseStart\n @param _userAddress Address of the user whose timelock status will be updated"
            },
            "functionSelector": "2304f24a",
            "id": 2422,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "updateTimelockStatus",
            "nameLocation": "41454:20:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2309,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2308,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "41483:12:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2422,
                  "src": "41475:20:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2307,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "41475:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "41474:22:0"
            },
            "returnParameters": {
              "id": 2310,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "41506:0:0"
            },
            "scope": 2423,
            "src": "41445:1436:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 2968,
        "src": "37611:5273:0",
        "usedErrors": [
          189,
          191,
          193,
          195,
          197,
          199,
          201,
          203,
          205,
          207,
          209,
          211,
          213,
          215,
          217,
          219,
          221,
          223,
          225,
          227,
          229,
          231,
          233,
          235,
          237,
          239,
          2972
        ],
        "usedEvents": [
          1022,
          1032,
          1044,
          1358,
          1366,
          1374,
          1730,
          1742,
          1754,
          2155,
          2165,
          2173
        ]
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 2425,
              "name": "TimelockUtils",
              "nameLocations": [
                "43374:13:0"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 2423,
              "src": "43374:13:0"
            },
            "id": 2426,
            "nodeType": "InheritanceSpecifier",
            "src": "43374:13:0"
          }
        ],
        "canonicalName": "DAOPool",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 2424,
          "nodeType": "StructuredDocumentation",
          "src": "42888:466:0",
          "text": "@title DAO pool contract\n @notice Users can stake $ENSHROUD tokens at the pool contract to be granted shares. These shares give the user voting power at the DAO and ability to claim pro-rata in-kind protocol yield.\n @dev functionalities are distributed to a chain of inheritance:\n (1) DAOPool.sol\n (2) TimelockUtils.sol\n (3) StakeUtils.sol\n (4) TransferUtils.sol\n (5) VotingUtils.sol\n (6) GetterUtils.sol\n (7) StateUtils.sol"
        },
        "fullyImplemented": true,
        "id": 2967,
        "linearizedBaseContracts": [
          2967,
          2423,
          2141,
          1711,
          1344,
          1009,
          615,
          2995
        ],
        "name": "DAOPool",
        "nameLocation": "43363:7:0",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "global": false,
            "id": 2429,
            "libraryName": {
              "id": 2427,
              "name": "SafeTransferLib",
              "nameLocations": [
                "43401:15:0"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 3059,
              "src": "43401:15:0"
            },
            "nodeType": "UsingForDirective",
            "src": "43395:34:0",
            "typeName": {
              "id": 2428,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "43421:7:0",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            }
          },
          {
            "body": {
              "id": 2441,
              "nodeType": "Block",
              "src": "43735:2:0",
              "statements": []
            },
            "documentation": {
              "id": 2430,
              "nodeType": "StructuredDocumentation",
              "src": "43437:136:0",
              "text": "@param _enshroudProtocol: Enshroud protocol contract address\n @param _enshroudTokenAddress: $ENSHROUD token contract address"
            },
            "id": 2442,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [
              {
                "arguments": [
                  {
                    "id": 2437,
                    "name": "_enshroudProtocol",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2432,
                    "src": "43693:17:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  {
                    "id": 2438,
                    "name": "_enshroudTokenAddress",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2434,
                    "src": "43712:21:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  }
                ],
                "id": 2439,
                "kind": "baseConstructorSpecifier",
                "modifierName": {
                  "id": 2436,
                  "name": "StateUtils",
                  "nameLocations": [
                    "43682:10:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 615,
                  "src": "43682:10:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "43682:52:0"
              }
            ],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2435,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2432,
                  "mutability": "mutable",
                  "name": "_enshroudProtocol",
                  "nameLocation": "43609:17:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2442,
                  "src": "43601:25:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2431,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "43601:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2434,
                  "mutability": "mutable",
                  "name": "_enshroudTokenAddress",
                  "nameLocation": "43645:21:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2442,
                  "src": "43637:29:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2433,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "43637:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "43590:83:0"
            },
            "returnParameters": {
              "id": 2440,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "43735:0:0"
            },
            "scope": 2967,
            "src": "43579:158:0",
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2643,
              "nodeType": "Block",
              "src": "44643:2703:0",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2456,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 2453,
                        "name": "_tokenContracts",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2446,
                        "src": "44658:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[] memory"
                        }
                      },
                      "id": 2454,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "44674:6:0",
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "44658:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "id": 2455,
                      "name": "ARRAY_LIMIT",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 116,
                      "src": "44683:11:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "44658:36:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2460,
                  "nodeType": "IfStatement",
                  "src": "44654:71:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 2457,
                        "name": "DAOPool_ArrayTooLong",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 199,
                        "src": "44703:20:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 2458,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "44703:22:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 2459,
                    "nodeType": "RevertStatement",
                    "src": "44696:29:0"
                  }
                },
                {
                  "assignments": [
                    2462
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2462,
                      "mutability": "mutable",
                      "name": "_userStake",
                      "nameLocation": "44797:10:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2643,
                      "src": "44789:18:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2461,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "44789:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2467,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 2464,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "44820:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 2465,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "44824:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "44820:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 2463,
                      "name": "userStake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 707,
                      "src": "44810:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) view returns (uint256)"
                      }
                    },
                    "id": 2466,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "44810:21:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "44789:42:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2470,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 2468,
                      "name": "_userStake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2462,
                      "src": "44846:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 2469,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "44860:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "44846:15:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2474,
                  "nodeType": "IfStatement",
                  "src": "44842:38:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 2471,
                        "name": "NoShares",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 225,
                        "src": "44870:8:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 2472,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "44870:10:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 2473,
                    "nodeType": "RevertStatement",
                    "src": "44863:17:0"
                  }
                },
                {
                  "assignments": [
                    2476
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2476,
                      "mutability": "mutable",
                      "name": "_zero",
                      "nameLocation": "44939:5:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2643,
                      "src": "44931:13:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 2475,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "44931:7:0",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2481,
                  "initialValue": {
                    "arguments": [
                      {
                        "hexValue": "30",
                        "id": 2479,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "44955:1:0",
                        "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": 2478,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "44947:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_address_$",
                        "typeString": "type(address)"
                      },
                      "typeName": {
                        "id": 2477,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "44947:7:0",
                        "typeDescriptions": {}
                      }
                    },
                    "id": 2480,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "44947:10:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "44931:26:0"
                },
                {
                  "body": {
                    "id": 2591,
                    "nodeType": "Block",
                    "src": "45093:1482:0",
                    "statements": [
                      {
                        "assignments": [
                          2491
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2491,
                            "mutability": "mutable",
                            "name": "_addr",
                            "nameLocation": "45116:5:0",
                            "nodeType": "VariableDeclaration",
                            "scope": 2591,
                            "src": "45108:13:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 2490,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "45108:7:0",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 2495,
                        "initialValue": {
                          "baseExpression": {
                            "id": 2492,
                            "name": "_tokenContracts",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2446,
                            "src": "45124:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                              "typeString": "address[] memory"
                            }
                          },
                          "id": 2494,
                          "indexExpression": {
                            "id": 2493,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2483,
                            "src": "45140:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "45124:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "45108:34:0"
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 2498,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 2496,
                            "name": "_addr",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2491,
                            "src": "45161:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "id": 2497,
                            "name": "_zero",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2476,
                            "src": "45170:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "45161:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2502,
                        "nodeType": "IfStatement",
                        "src": "45157:40:0",
                        "trueBody": {
                          "errorCall": {
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 2499,
                              "name": "ZeroAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 239,
                              "src": "45184:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                                "typeString": "function () pure returns (error)"
                              }
                            },
                            "id": 2500,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "45184:13:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_error",
                              "typeString": "error"
                            }
                          },
                          "id": 2501,
                          "nodeType": "RevertStatement",
                          "src": "45177:20:0"
                        }
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2514,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 2503,
                            "name": "BLOCKS_PER_EPOCH",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 134,
                            "src": "45216:16:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "components": [
                              {
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2512,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "expression": {
                                    "id": 2504,
                                    "name": "block",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -4,
                                    "src": "45236:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_block",
                                      "typeString": "block"
                                    }
                                  },
                                  "id": 2505,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "45242:6:0",
                                  "memberName": "number",
                                  "nodeType": "MemberAccess",
                                  "src": "45236:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "-",
                                "rightExpression": {
                                  "baseExpression": {
                                    "baseExpression": {
                                      "id": 2506,
                                      "name": "claimed",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 176,
                                      "src": "45251:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                        "typeString": "mapping(address => mapping(address => uint256))"
                                      }
                                    },
                                    "id": 2509,
                                    "indexExpression": {
                                      "expression": {
                                        "id": 2507,
                                        "name": "msg",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -15,
                                        "src": "45259:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_message",
                                          "typeString": "msg"
                                        }
                                      },
                                      "id": 2508,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberLocation": "45263:6:0",
                                      "memberName": "sender",
                                      "nodeType": "MemberAccess",
                                      "src": "45259:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "45251:19:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 2511,
                                  "indexExpression": {
                                    "id": 2510,
                                    "name": "_addr",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2491,
                                    "src": "45271:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "45251:26:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "45236:41:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 2513,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "45235:43:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "45216:62:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2518,
                        "nodeType": "IfStatement",
                        "src": "45212:117:0",
                        "trueBody": {
                          "errorCall": {
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 2515,
                              "name": "AlreadyClaimedThisEpoch",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 189,
                              "src": "45304:23:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                                "typeString": "function () pure returns (error)"
                              }
                            },
                            "id": 2516,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "45304:25:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_error",
                              "typeString": "error"
                            }
                          },
                          "id": 2517,
                          "nodeType": "RevertStatement",
                          "src": "45297:32:0"
                        }
                      },
                      {
                        "assignments": [
                          2520
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2520,
                            "mutability": "mutable",
                            "name": "_claim",
                            "nameLocation": "45354:6:0",
                            "nodeType": "VariableDeclaration",
                            "scope": 2591,
                            "src": "45346:14:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2519,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "45346:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 2521,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "45346:14:0"
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 2524,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 2522,
                            "name": "_addr",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2491,
                            "src": "45528:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "id": 2523,
                            "name": "enshroudToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 146,
                            "src": "45537:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "45528:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 2562,
                          "nodeType": "Block",
                          "src": "45964:209:0",
                          "statements": [
                            {
                              "expression": {
                                "id": 2560,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "id": 2546,
                                  "name": "_claim",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2520,
                                  "src": "45983:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "arguments": [
                                    {
                                      "id": 2548,
                                      "name": "_userStake",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2462,
                                      "src": "46026:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "arguments": [
                                        {
                                          "arguments": [
                                            {
                                              "id": 2555,
                                              "name": "this",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": -28,
                                              "src": "46099:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_DAOPool_$2967",
                                                "typeString": "contract DAOPool"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_contract$_DAOPool_$2967",
                                                "typeString": "contract DAOPool"
                                              }
                                            ],
                                            "id": 2554,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "46091:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_address_$",
                                              "typeString": "type(address)"
                                            },
                                            "typeName": {
                                              "id": 2553,
                                              "name": "address",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "46091:7:0",
                                              "typeDescriptions": {}
                                            }
                                          },
                                          "id": 2556,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "nameLocations": [],
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "46091:13:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        ],
                                        "expression": {
                                          "arguments": [
                                            {
                                              "id": 2550,
                                              "name": "_addr",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2491,
                                              "src": "46074:5:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            ],
                                            "id": 2549,
                                            "name": "IERC20_DAOPool",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 30,
                                            "src": "46059:14:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_contract$_IERC20_DAOPool_$30_$",
                                              "typeString": "type(contract IERC20_DAOPool)"
                                            }
                                          },
                                          "id": 2551,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "nameLocations": [],
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "46059:21:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_DAOPool_$30",
                                            "typeString": "contract IERC20_DAOPool"
                                          }
                                        },
                                        "id": 2552,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberLocation": "46081:9:0",
                                        "memberName": "balanceOf",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 12,
                                        "src": "46059:31:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                          "typeString": "function (address) view external returns (uint256)"
                                        }
                                      },
                                      "id": 2557,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "nameLocations": [],
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "46059:46:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "id": 2558,
                                      "name": "totalStake",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 158,
                                      "src": "46128:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "id": 2547,
                                    "name": "_mulDivDown",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 614,
                                    "src": "45992:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                      "typeString": "function (uint256,uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2559,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "nameLocations": [],
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "45992:165:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "45983:174:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2561,
                              "nodeType": "ExpressionStatement",
                              "src": "45983:174:0"
                            }
                          ]
                        },
                        "id": 2563,
                        "nodeType": "IfStatement",
                        "src": "45524:649:0",
                        "trueBody": {
                          "id": 2545,
                          "nodeType": "Block",
                          "src": "45552:406:0",
                          "statements": [
                            {
                              "expression": {
                                "id": 2543,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "id": 2525,
                                  "name": "_claim",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2520,
                                  "src": "45728:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "arguments": [
                                    {
                                      "id": 2527,
                                      "name": "_userStake",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2462,
                                      "src": "45771:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 2540,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 2538,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "arguments": [
                                            {
                                              "arguments": [
                                                {
                                                  "id": 2534,
                                                  "name": "this",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": -28,
                                                  "src": "45844:4:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_contract$_DAOPool_$2967",
                                                    "typeString": "contract DAOPool"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_contract$_DAOPool_$2967",
                                                    "typeString": "contract DAOPool"
                                                  }
                                                ],
                                                "id": 2533,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "lValueRequested": false,
                                                "nodeType": "ElementaryTypeNameExpression",
                                                "src": "45836:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_type$_t_address_$",
                                                  "typeString": "type(address)"
                                                },
                                                "typeName": {
                                                  "id": 2532,
                                                  "name": "address",
                                                  "nodeType": "ElementaryTypeName",
                                                  "src": "45836:7:0",
                                                  "typeDescriptions": {}
                                                }
                                              },
                                              "id": 2535,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "typeConversion",
                                              "lValueRequested": false,
                                              "nameLocations": [],
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "45836:13:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            ],
                                            "expression": {
                                              "arguments": [
                                                {
                                                  "id": 2529,
                                                  "name": "_addr",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 2491,
                                                  "src": "45819:5:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                  }
                                                ],
                                                "id": 2528,
                                                "name": "IERC20_DAOPool",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 30,
                                                "src": "45804:14:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_type$_t_contract$_IERC20_DAOPool_$30_$",
                                                  "typeString": "type(contract IERC20_DAOPool)"
                                                }
                                              },
                                              "id": 2530,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "typeConversion",
                                              "lValueRequested": false,
                                              "nameLocations": [],
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "45804:21:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_IERC20_DAOPool_$30",
                                                "typeString": "contract IERC20_DAOPool"
                                              }
                                            },
                                            "id": 2531,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberLocation": "45826:9:0",
                                            "memberName": "balanceOf",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 12,
                                            "src": "45804:31:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                              "typeString": "function (address) view external returns (uint256)"
                                            }
                                          },
                                          "id": 2536,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "nameLocations": [],
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "45804:46:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "-",
                                        "rightExpression": {
                                          "id": 2537,
                                          "name": "totalStake",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 158,
                                          "src": "45860:10:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "45804:66:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "-",
                                      "rightExpression": {
                                        "id": 2539,
                                        "name": "depositedUnstaked",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 155,
                                        "src": "45873:17:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "45804:86:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "id": 2541,
                                      "name": "totalStake",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 158,
                                      "src": "45913:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "id": 2526,
                                    "name": "_mulDivDown",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 614,
                                    "src": "45737:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                      "typeString": "function (uint256,uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2542,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "nameLocations": [],
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "45737:205:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "45728:214:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2544,
                              "nodeType": "ExpressionStatement",
                              "src": "45728:214:0"
                            }
                          ]
                        }
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2566,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 2564,
                            "name": "_claim",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2520,
                            "src": "46191:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "hexValue": "30",
                            "id": 2565,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "46201:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "46191:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2586,
                        "nodeType": "IfStatement",
                        "src": "46187:255:0",
                        "trueBody": {
                          "id": 2585,
                          "nodeType": "Block",
                          "src": "46204:238:0",
                          "statements": [
                            {
                              "expression": {
                                "id": 2575,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "baseExpression": {
                                    "baseExpression": {
                                      "id": 2567,
                                      "name": "claimed",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 176,
                                      "src": "46223:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                        "typeString": "mapping(address => mapping(address => uint256))"
                                      }
                                    },
                                    "id": 2571,
                                    "indexExpression": {
                                      "expression": {
                                        "id": 2568,
                                        "name": "msg",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -15,
                                        "src": "46231:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_message",
                                          "typeString": "msg"
                                        }
                                      },
                                      "id": 2569,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberLocation": "46235:6:0",
                                      "memberName": "sender",
                                      "nodeType": "MemberAccess",
                                      "src": "46231:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "46223:19:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 2572,
                                  "indexExpression": {
                                    "id": 2570,
                                    "name": "_addr",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2491,
                                    "src": "46243:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "46223:26:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "expression": {
                                    "id": 2573,
                                    "name": "block",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -4,
                                    "src": "46252:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_block",
                                      "typeString": "block"
                                    }
                                  },
                                  "id": 2574,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "46258:6:0",
                                  "memberName": "number",
                                  "nodeType": "MemberAccess",
                                  "src": "46252:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "46223:41:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2576,
                              "nodeType": "ExpressionStatement",
                              "src": "46223:41:0"
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "expression": {
                                      "id": 2580,
                                      "name": "msg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -15,
                                      "src": "46343:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_message",
                                        "typeString": "msg"
                                      }
                                    },
                                    "id": 2581,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberLocation": "46347:6:0",
                                    "memberName": "sender",
                                    "nodeType": "MemberAccess",
                                    "src": "46343:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "id": 2582,
                                    "name": "_claim",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2520,
                                    "src": "46355:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "id": 2577,
                                    "name": "_addr",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2491,
                                    "src": "46324:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "id": 2579,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "46330:12:0",
                                  "memberName": "safeTransfer",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3044,
                                  "src": "46324:18:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_address_$",
                                    "typeString": "function (address,address,uint256)"
                                  }
                                },
                                "id": 2583,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "46324:38:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2584,
                              "nodeType": "ExpressionStatement",
                              "src": "46324:38:0"
                            }
                          ]
                        }
                      },
                      {
                        "id": 2590,
                        "nodeType": "UncheckedBlock",
                        "src": "46456:108:0",
                        "statements": [
                          {
                            "expression": {
                              "id": 2588,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "UnaryOperation",
                              "operator": "++",
                              "prefix": true,
                              "src": "46485:3:0",
                              "subExpression": {
                                "id": 2587,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2483,
                                "src": "46487:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 2589,
                            "nodeType": "ExpressionStatement",
                            "src": "46485:3:0"
                          }
                        ]
                      }
                    ]
                  },
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2489,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 2486,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2483,
                      "src": "45063:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "expression": {
                        "id": 2487,
                        "name": "_tokenContracts",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2446,
                        "src": "45067:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[] memory"
                        }
                      },
                      "id": 2488,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "45083:6:0",
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "45067:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "45063:26:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2592,
                  "initializationExpression": {
                    "assignments": [
                      2483
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 2483,
                        "mutability": "mutable",
                        "name": "i",
                        "nameLocation": "45056:1:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 2592,
                        "src": "45048:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2482,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "45048:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "visibility": "internal"
                      }
                    ],
                    "id": 2485,
                    "initialValue": {
                      "hexValue": "30",
                      "id": 2484,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "45060:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "45048:13:0"
                  },
                  "isSimpleCounterLoop": false,
                  "nodeType": "ForStatement",
                  "src": "45043:1532:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2604,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 2593,
                      "name": "BLOCKS_PER_EPOCH",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 134,
                      "src": "46879:16:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "components": [
                        {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2602,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 2594,
                              "name": "block",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -4,
                              "src": "46899:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_block",
                                "typeString": "block"
                              }
                            },
                            "id": 2595,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "46905:6:0",
                            "memberName": "number",
                            "nodeType": "MemberAccess",
                            "src": "46899:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "baseExpression": {
                              "baseExpression": {
                                "id": 2596,
                                "name": "claimed",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 176,
                                "src": "46914:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(address => mapping(address => uint256))"
                                }
                              },
                              "id": 2599,
                              "indexExpression": {
                                "expression": {
                                  "id": 2597,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "46922:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 2598,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberLocation": "46926:6:0",
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "src": "46922:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "46914:19:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2601,
                            "indexExpression": {
                              "id": 2600,
                              "name": "_zero",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2476,
                              "src": "46934:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "46914:26:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "46899:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 2603,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "TupleExpression",
                      "src": "46898:43:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "46879:62:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 2641,
                    "nodeType": "Block",
                    "src": "47337:2:0",
                    "statements": []
                  },
                  "id": 2642,
                  "nodeType": "IfStatement",
                  "src": "46875:464:0",
                  "trueBody": {
                    "id": 2640,
                    "nodeType": "Block",
                    "src": "46943:388:0",
                    "statements": [
                      {
                        "assignments": [
                          2606
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2606,
                            "mutability": "mutable",
                            "name": "_ethClaim",
                            "nameLocation": "46966:9:0",
                            "nodeType": "VariableDeclaration",
                            "scope": 2640,
                            "src": "46958:17:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2605,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "46958:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 2616,
                        "initialValue": {
                          "arguments": [
                            {
                              "id": 2608,
                              "name": "_userStake",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2462,
                              "src": "47008:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "id": 2611,
                                    "name": "this",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -28,
                                    "src": "47045:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_DAOPool_$2967",
                                      "typeString": "contract DAOPool"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_DAOPool_$2967",
                                      "typeString": "contract DAOPool"
                                    }
                                  ],
                                  "id": 2610,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "47037:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2609,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "47037:7:0",
                                    "typeDescriptions": {}
                                  }
                                },
                                "id": 2612,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "47037:13:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 2613,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "47051:7:0",
                              "memberName": "balance",
                              "nodeType": "MemberAccess",
                              "src": "47037:21:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "id": 2614,
                              "name": "totalStake",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 158,
                              "src": "47077:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2607,
                            "name": "_mulDivDown",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 614,
                            "src": "46978:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 2615,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "46978:124:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "46958:144:0"
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2619,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 2617,
                            "name": "_ethClaim",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2606,
                            "src": "47121:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "hexValue": "30",
                            "id": 2618,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "47134:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "47121:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2639,
                        "nodeType": "IfStatement",
                        "src": "47117:203:0",
                        "trueBody": {
                          "id": 2638,
                          "nodeType": "Block",
                          "src": "47137:183:0",
                          "statements": [
                            {
                              "expression": {
                                "id": 2628,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "baseExpression": {
                                    "baseExpression": {
                                      "id": 2620,
                                      "name": "claimed",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 176,
                                      "src": "47156:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                        "typeString": "mapping(address => mapping(address => uint256))"
                                      }
                                    },
                                    "id": 2624,
                                    "indexExpression": {
                                      "expression": {
                                        "id": 2621,
                                        "name": "msg",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -15,
                                        "src": "47164:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_message",
                                          "typeString": "msg"
                                        }
                                      },
                                      "id": 2622,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberLocation": "47168:6:0",
                                      "memberName": "sender",
                                      "nodeType": "MemberAccess",
                                      "src": "47164:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "47156:19:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 2625,
                                  "indexExpression": {
                                    "id": 2623,
                                    "name": "_zero",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2476,
                                    "src": "47176:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "47156:26:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "expression": {
                                    "id": 2626,
                                    "name": "block",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -4,
                                    "src": "47185:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_block",
                                      "typeString": "block"
                                    }
                                  },
                                  "id": 2627,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "47191:6:0",
                                  "memberName": "number",
                                  "nodeType": "MemberAccess",
                                  "src": "47185:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "47156:41:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2629,
                              "nodeType": "ExpressionStatement",
                              "src": "47156:41:0"
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "expression": {
                                      "id": 2633,
                                      "name": "msg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -15,
                                      "src": "47282:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_message",
                                        "typeString": "msg"
                                      }
                                    },
                                    "id": 2634,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberLocation": "47286:6:0",
                                    "memberName": "sender",
                                    "nodeType": "MemberAccess",
                                    "src": "47282:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "id": 2635,
                                    "name": "_ethClaim",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2606,
                                    "src": "47294:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "id": 2630,
                                    "name": "SafeTransferLib",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3059,
                                    "src": "47250:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_SafeTransferLib_$3059_$",
                                      "typeString": "type(library SafeTransferLib)"
                                    }
                                  },
                                  "id": 2632,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "47266:15:0",
                                  "memberName": "safeTransferETH",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3020,
                                  "src": "47250:31:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (address,uint256)"
                                  }
                                },
                                "id": 2636,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "47250:54:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2637,
                              "nodeType": "ExpressionStatement",
                              "src": "47250:54:0"
                            }
                          ]
                        }
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 2443,
              "nodeType": "StructuredDocumentation",
              "src": "43745:778:0",
              "text": "@notice for a DAO staker to claim their pro rata yields as of block.number. ETH is paid out regardless of token contracts supplied by caller once per epoch.\n smaller stakers have the option to time their claims (for epochs in which there are large amounts in this contract, or at least as much yield as the gas expenditure to claim)\n @dev claimed mapping is checked for each address and address(0) for ETH every call and userStake (as a ratio of totalStake) is calculated as of block.number; epochPassedSinceStake modifier protects against flash loan + stake + claim\n @param _tokenContracts array of token contract addresses which msg.sender seeks to claim in this epoch. Null address not permitted as an input as it used for the ETH claimed mapping."
            },
            "functionSelector": "61ca7f87",
            "id": 2644,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 2449,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 2448,
                  "name": "nonReentrant",
                  "nameLocations": [
                    "44608:12:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 2994,
                  "src": "44608:12:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "44608:12:0"
              },
              {
                "id": 2451,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 2450,
                  "name": "epochPassedSinceStake",
                  "nameLocations": [
                    "44621:21:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 257,
                  "src": "44621:21:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "44621:21:0"
              }
            ],
            "name": "claimYield",
            "nameLocation": "44538:10:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2447,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2446,
                  "mutability": "mutable",
                  "name": "_tokenContracts",
                  "nameLocation": "44576:15:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2644,
                  "src": "44559:32:0",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 2444,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "44559:7:0",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 2445,
                    "nodeType": "ArrayTypeName",
                    "src": "44559:9:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "44548:50:0"
            },
            "returnParameters": {
              "id": 2452,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "44643:0:0"
            },
            "scope": 2967,
            "src": "44529:2817:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 2884,
              "nodeType": "Block",
              "src": "48125:3319:0",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2658,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 2655,
                        "name": "_tokenContracts",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2648,
                        "src": "48140:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[] memory"
                        }
                      },
                      "id": 2656,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "48156:6:0",
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "48140:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "id": 2657,
                      "name": "ARRAY_LIMIT",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 116,
                      "src": "48165:11:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "48140:36:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2662,
                  "nodeType": "IfStatement",
                  "src": "48136:71:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 2659,
                        "name": "DAOPool_ArrayTooLong",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 199,
                        "src": "48185:20:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 2660,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "48185:22:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 2661,
                    "nodeType": "RevertStatement",
                    "src": "48178:29:0"
                  }
                },
                {
                  "assignments": [
                    2664
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2664,
                      "mutability": "mutable",
                      "name": "_userStake",
                      "nameLocation": "48279:10:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2884,
                      "src": "48271:18:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2663,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "48271:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2669,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 2666,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "48302:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 2667,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "48306:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "48302:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 2665,
                      "name": "userStake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 707,
                      "src": "48292:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) view returns (uint256)"
                      }
                    },
                    "id": 2668,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "48292:21:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "48271:42:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2672,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 2670,
                      "name": "_userStake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2664,
                      "src": "48328:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 2671,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "48342:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "48328:15:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2676,
                  "nodeType": "IfStatement",
                  "src": "48324:38:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 2673,
                        "name": "NoShares",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 225,
                        "src": "48352:8:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 2674,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "48352:10:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 2675,
                    "nodeType": "RevertStatement",
                    "src": "48345:17:0"
                  }
                },
                {
                  "assignments": [
                    2678
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2678,
                      "mutability": "mutable",
                      "name": "_zero",
                      "nameLocation": "48421:5:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2884,
                      "src": "48413:13:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 2677,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "48413:7:0",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2683,
                  "initialValue": {
                    "arguments": [
                      {
                        "hexValue": "30",
                        "id": 2681,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "48437:1:0",
                        "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": 2680,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "48429:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_address_$",
                        "typeString": "type(address)"
                      },
                      "typeName": {
                        "id": 2679,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "48429:7:0",
                        "typeDescriptions": {}
                      }
                    },
                    "id": 2682,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "48429:10:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "48413:26:0"
                },
                {
                  "body": {
                    "id": 2831,
                    "nodeType": "Block",
                    "src": "48575:2071:0",
                    "statements": [
                      {
                        "assignments": [
                          2693
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2693,
                            "mutability": "mutable",
                            "name": "_addr",
                            "nameLocation": "48598:5:0",
                            "nodeType": "VariableDeclaration",
                            "scope": 2831,
                            "src": "48590:13:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 2692,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "48590:7:0",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 2697,
                        "initialValue": {
                          "baseExpression": {
                            "id": 2694,
                            "name": "_tokenContracts",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2648,
                            "src": "48606:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                              "typeString": "address[] memory"
                            }
                          },
                          "id": 2696,
                          "indexExpression": {
                            "id": 2695,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2685,
                            "src": "48622:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "48606:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "48590:34:0"
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 2700,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 2698,
                            "name": "_addr",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2693,
                            "src": "48643:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "id": 2699,
                            "name": "_zero",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2678,
                            "src": "48652:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "48643:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2704,
                        "nodeType": "IfStatement",
                        "src": "48639:40:0",
                        "trueBody": {
                          "errorCall": {
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 2701,
                              "name": "ZeroAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 239,
                              "src": "48666:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                                "typeString": "function () pure returns (error)"
                              }
                            },
                            "id": 2702,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "48666:13:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_error",
                              "typeString": "error"
                            }
                          },
                          "id": 2703,
                          "nodeType": "RevertStatement",
                          "src": "48659:20:0"
                        }
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2716,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 2705,
                            "name": "BLOCKS_PER_EPOCH",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 134,
                            "src": "48698:16:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "components": [
                              {
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2714,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "expression": {
                                    "id": 2706,
                                    "name": "block",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -4,
                                    "src": "48718:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_block",
                                      "typeString": "block"
                                    }
                                  },
                                  "id": 2707,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "48724:6:0",
                                  "memberName": "number",
                                  "nodeType": "MemberAccess",
                                  "src": "48718:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "-",
                                "rightExpression": {
                                  "baseExpression": {
                                    "baseExpression": {
                                      "id": 2708,
                                      "name": "claimed",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 176,
                                      "src": "48733:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                        "typeString": "mapping(address => mapping(address => uint256))"
                                      }
                                    },
                                    "id": 2711,
                                    "indexExpression": {
                                      "expression": {
                                        "id": 2709,
                                        "name": "msg",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -15,
                                        "src": "48741:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_message",
                                          "typeString": "msg"
                                        }
                                      },
                                      "id": 2710,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberLocation": "48745:6:0",
                                      "memberName": "sender",
                                      "nodeType": "MemberAccess",
                                      "src": "48741:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "48733:19:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 2713,
                                  "indexExpression": {
                                    "id": 2712,
                                    "name": "_addr",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2693,
                                    "src": "48753:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "48733:26:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "48718:41:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 2715,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "48717:43:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "48698:62:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2720,
                        "nodeType": "IfStatement",
                        "src": "48694:117:0",
                        "trueBody": {
                          "errorCall": {
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 2717,
                              "name": "AlreadyClaimedThisEpoch",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 189,
                              "src": "48786:23:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                                "typeString": "function () pure returns (error)"
                              }
                            },
                            "id": 2718,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "48786:25:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_error",
                              "typeString": "error"
                            }
                          },
                          "id": 2719,
                          "nodeType": "RevertStatement",
                          "src": "48779:32:0"
                        }
                      },
                      {
                        "assignments": [
                          2722
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2722,
                            "mutability": "mutable",
                            "name": "_claim",
                            "nameLocation": "48836:6:0",
                            "nodeType": "VariableDeclaration",
                            "scope": 2831,
                            "src": "48828:14:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2721,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "48828:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 2723,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "48828:14:0"
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 2726,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 2724,
                            "name": "_addr",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2693,
                            "src": "49010:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "id": 2725,
                            "name": "enshroudToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 146,
                            "src": "49019:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "49010:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 2764,
                          "nodeType": "Block",
                          "src": "49439:209:0",
                          "statements": [
                            {
                              "expression": {
                                "id": 2762,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "id": 2748,
                                  "name": "_claim",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2722,
                                  "src": "49458:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "arguments": [
                                    {
                                      "id": 2750,
                                      "name": "_userStake",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2664,
                                      "src": "49501:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "arguments": [
                                        {
                                          "arguments": [
                                            {
                                              "id": 2757,
                                              "name": "this",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": -28,
                                              "src": "49574:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_DAOPool_$2967",
                                                "typeString": "contract DAOPool"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_contract$_DAOPool_$2967",
                                                "typeString": "contract DAOPool"
                                              }
                                            ],
                                            "id": 2756,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "49566:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_address_$",
                                              "typeString": "type(address)"
                                            },
                                            "typeName": {
                                              "id": 2755,
                                              "name": "address",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "49566:7:0",
                                              "typeDescriptions": {}
                                            }
                                          },
                                          "id": 2758,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "nameLocations": [],
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "49566:13:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        ],
                                        "expression": {
                                          "arguments": [
                                            {
                                              "id": 2752,
                                              "name": "_addr",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2693,
                                              "src": "49549:5:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            ],
                                            "id": 2751,
                                            "name": "IERC20_DAOPool",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 30,
                                            "src": "49534:14:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_contract$_IERC20_DAOPool_$30_$",
                                              "typeString": "type(contract IERC20_DAOPool)"
                                            }
                                          },
                                          "id": 2753,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "nameLocations": [],
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "49534:21:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_DAOPool_$30",
                                            "typeString": "contract IERC20_DAOPool"
                                          }
                                        },
                                        "id": 2754,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberLocation": "49556:9:0",
                                        "memberName": "balanceOf",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 12,
                                        "src": "49534:31:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                          "typeString": "function (address) view external returns (uint256)"
                                        }
                                      },
                                      "id": 2759,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "nameLocations": [],
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "49534:46:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "id": 2760,
                                      "name": "totalStake",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 158,
                                      "src": "49603:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "id": 2749,
                                    "name": "_mulDivDown",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 614,
                                    "src": "49467:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                      "typeString": "function (uint256,uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2761,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "nameLocations": [],
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "49467:165:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "49458:174:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2763,
                              "nodeType": "ExpressionStatement",
                              "src": "49458:174:0"
                            }
                          ]
                        },
                        "id": 2765,
                        "nodeType": "IfStatement",
                        "src": "49006:642:0",
                        "trueBody": {
                          "id": 2747,
                          "nodeType": "Block",
                          "src": "49034:399:0",
                          "statements": [
                            {
                              "expression": {
                                "id": 2745,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "id": 2727,
                                  "name": "_claim",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2722,
                                  "src": "49203:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "arguments": [
                                    {
                                      "id": 2729,
                                      "name": "_userStake",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2664,
                                      "src": "49246:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 2742,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 2740,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "arguments": [
                                            {
                                              "arguments": [
                                                {
                                                  "id": 2736,
                                                  "name": "this",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": -28,
                                                  "src": "49319:4:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_contract$_DAOPool_$2967",
                                                    "typeString": "contract DAOPool"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_contract$_DAOPool_$2967",
                                                    "typeString": "contract DAOPool"
                                                  }
                                                ],
                                                "id": 2735,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "lValueRequested": false,
                                                "nodeType": "ElementaryTypeNameExpression",
                                                "src": "49311:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_type$_t_address_$",
                                                  "typeString": "type(address)"
                                                },
                                                "typeName": {
                                                  "id": 2734,
                                                  "name": "address",
                                                  "nodeType": "ElementaryTypeName",
                                                  "src": "49311:7:0",
                                                  "typeDescriptions": {}
                                                }
                                              },
                                              "id": 2737,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "typeConversion",
                                              "lValueRequested": false,
                                              "nameLocations": [],
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "49311:13:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            ],
                                            "expression": {
                                              "arguments": [
                                                {
                                                  "id": 2731,
                                                  "name": "_addr",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 2693,
                                                  "src": "49294:5:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                  }
                                                ],
                                                "id": 2730,
                                                "name": "IERC20_DAOPool",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 30,
                                                "src": "49279:14:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_type$_t_contract$_IERC20_DAOPool_$30_$",
                                                  "typeString": "type(contract IERC20_DAOPool)"
                                                }
                                              },
                                              "id": 2732,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "typeConversion",
                                              "lValueRequested": false,
                                              "nameLocations": [],
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "49279:21:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_IERC20_DAOPool_$30",
                                                "typeString": "contract IERC20_DAOPool"
                                              }
                                            },
                                            "id": 2733,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberLocation": "49301:9:0",
                                            "memberName": "balanceOf",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 12,
                                            "src": "49279:31:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                              "typeString": "function (address) view external returns (uint256)"
                                            }
                                          },
                                          "id": 2738,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "nameLocations": [],
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "49279:46:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "-",
                                        "rightExpression": {
                                          "id": 2739,
                                          "name": "totalStake",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 158,
                                          "src": "49335:10:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "49279:66:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "-",
                                      "rightExpression": {
                                        "id": 2741,
                                        "name": "depositedUnstaked",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 155,
                                        "src": "49348:17:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "49279:86:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "id": 2743,
                                      "name": "totalStake",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 158,
                                      "src": "49388:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "id": 2728,
                                    "name": "_mulDivDown",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 614,
                                    "src": "49212:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                      "typeString": "function (uint256,uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2744,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "nameLocations": [],
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "49212:205:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "49203:214:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2746,
                              "nodeType": "ExpressionStatement",
                              "src": "49203:214:0"
                            }
                          ]
                        }
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2768,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 2766,
                            "name": "_claim",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2722,
                            "src": "49666:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "hexValue": "30",
                            "id": 2767,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "49676:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "49666:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2826,
                        "nodeType": "IfStatement",
                        "src": "49662:851:0",
                        "trueBody": {
                          "id": 2825,
                          "nodeType": "Block",
                          "src": "49679:834:0",
                          "statements": [
                            {
                              "expression": {
                                "id": 2777,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "baseExpression": {
                                    "baseExpression": {
                                      "id": 2769,
                                      "name": "claimed",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 176,
                                      "src": "49698:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                        "typeString": "mapping(address => mapping(address => uint256))"
                                      }
                                    },
                                    "id": 2773,
                                    "indexExpression": {
                                      "expression": {
                                        "id": 2770,
                                        "name": "msg",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -15,
                                        "src": "49706:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_message",
                                          "typeString": "msg"
                                        }
                                      },
                                      "id": 2771,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberLocation": "49710:6:0",
                                      "memberName": "sender",
                                      "nodeType": "MemberAccess",
                                      "src": "49706:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "49698:19:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 2774,
                                  "indexExpression": {
                                    "id": 2772,
                                    "name": "_addr",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2693,
                                    "src": "49718:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "49698:26:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "expression": {
                                    "id": 2775,
                                    "name": "block",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -4,
                                    "src": "49727:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_block",
                                      "typeString": "block"
                                    }
                                  },
                                  "id": 2776,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "49733:6:0",
                                  "memberName": "number",
                                  "nodeType": "MemberAccess",
                                  "src": "49727:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "49698:41:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2778,
                              "nodeType": "ExpressionStatement",
                              "src": "49698:41:0"
                            },
                            {
                              "assignments": [
                                2780
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2780,
                                  "mutability": "mutable",
                                  "name": "_epBalanceBefore",
                                  "nameLocation": "49883:16:0",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 2825,
                                  "src": "49875:24:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2779,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "49875:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2787,
                              "initialValue": {
                                "arguments": [
                                  {
                                    "id": 2785,
                                    "name": "enshroudProtocol",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 140,
                                    "src": "49934:16:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "arguments": [
                                      {
                                        "id": 2782,
                                        "name": "_addr",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2693,
                                        "src": "49917:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 2781,
                                      "name": "IERC20_DAOPool",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 30,
                                      "src": "49902:14:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_IERC20_DAOPool_$30_$",
                                        "typeString": "type(contract IERC20_DAOPool)"
                                      }
                                    },
                                    "id": 2783,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "nameLocations": [],
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "49902:21:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_DAOPool_$30",
                                      "typeString": "contract IERC20_DAOPool"
                                    }
                                  },
                                  "id": 2784,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "49924:9:0",
                                  "memberName": "balanceOf",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 12,
                                  "src": "49902:31:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                    "typeString": "function (address) view external returns (uint256)"
                                  }
                                },
                                "id": 2786,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "49902:49:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "49875:76:0"
                            },
                            {
                              "documentation": "@dev because SafeTransferLib.safeTransfer() will revert if we attempt to call it as msg.sender in iProtocol._depositTokens(), we do it here",
                              "expression": {
                                "arguments": [
                                  {
                                    "id": 2791,
                                    "name": "enshroudProtocol",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 140,
                                    "src": "50138:16:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "id": 2792,
                                    "name": "_claim",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2722,
                                    "src": "50156:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "id": 2788,
                                    "name": "_addr",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2693,
                                    "src": "50119:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "id": 2790,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "50125:12:0",
                                  "memberName": "safeTransfer",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3044,
                                  "src": "50119:18:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_address_$",
                                    "typeString": "function (address,address,uint256)"
                                  }
                                },
                                "id": 2793,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "50119:44:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2794,
                              "nodeType": "ExpressionStatement",
                              "src": "50119:44:0"
                            },
                            {
                              "assignments": [
                                2796
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2796,
                                  "mutability": "mutable",
                                  "name": "_epBalanceAfter",
                                  "nameLocation": "50178:15:0",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 2825,
                                  "src": "50170:23:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2795,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "50170:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2803,
                              "initialValue": {
                                "arguments": [
                                  {
                                    "id": 2801,
                                    "name": "enshroudProtocol",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 140,
                                    "src": "50228:16:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "arguments": [
                                      {
                                        "id": 2798,
                                        "name": "_addr",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2693,
                                        "src": "50211:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 2797,
                                      "name": "IERC20_DAOPool",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 30,
                                      "src": "50196:14:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_IERC20_DAOPool_$30_$",
                                        "typeString": "type(contract IERC20_DAOPool)"
                                      }
                                    },
                                    "id": 2799,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "nameLocations": [],
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "50196:21:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_DAOPool_$30",
                                      "typeString": "contract IERC20_DAOPool"
                                    }
                                  },
                                  "id": 2800,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "50218:9:0",
                                  "memberName": "balanceOf",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 12,
                                  "src": "50196:31:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                    "typeString": "function (address) view external returns (uint256)"
                                  }
                                },
                                "id": 2802,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "50196:49:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "50170:75:0"
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 2807,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "id": 2805,
                                      "name": "_epBalanceAfter",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2796,
                                      "src": "50260:15:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": ">=",
                                    "rightExpression": {
                                      "id": 2806,
                                      "name": "_epBalanceBefore",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2780,
                                      "src": "50279:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "50260:35:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  ],
                                  "id": 2804,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "50252:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                                    "typeString": "function (bool) pure"
                                  }
                                },
                                "id": 2808,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "50252:44:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2809,
                              "nodeType": "ExpressionStatement",
                              "src": "50252:44:0"
                            },
                            {
                              "assignments": [
                                2811
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2811,
                                  "mutability": "mutable",
                                  "name": "_netClaim",
                                  "nameLocation": "50311:9:0",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 2825,
                                  "src": "50303:17:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2810,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "50303:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2815,
                              "initialValue": {
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2814,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "id": 2812,
                                  "name": "_epBalanceAfter",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2796,
                                  "src": "50323:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "-",
                                "rightExpression": {
                                  "id": 2813,
                                  "name": "_epBalanceBefore",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2780,
                                  "src": "50341:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "50323:34:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "50303:54:0"
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "expression": {
                                      "id": 2819,
                                      "name": "msg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -15,
                                      "src": "50468:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_message",
                                        "typeString": "msg"
                                      }
                                    },
                                    "id": 2820,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberLocation": "50472:6:0",
                                    "memberName": "sender",
                                    "nodeType": "MemberAccess",
                                    "src": "50468:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "id": 2821,
                                    "name": "_addr",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2693,
                                    "src": "50480:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "id": 2822,
                                    "name": "_netClaim",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2811,
                                    "src": "50487:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "id": 2816,
                                    "name": "iProtocol",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 143,
                                    "src": "50444:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IEnshroudProtocol_DAOPool_$60",
                                      "typeString": "contract IEnshroudProtocol_DAOPool"
                                    }
                                  },
                                  "id": 2818,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "50454:13:0",
                                  "memberName": "depositTokens",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 52,
                                  "src": "50444:23:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (address,address,uint256) external"
                                  }
                                },
                                "id": 2823,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "50444:53:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2824,
                              "nodeType": "ExpressionStatement",
                              "src": "50444:53:0"
                            }
                          ]
                        }
                      },
                      {
                        "id": 2830,
                        "nodeType": "UncheckedBlock",
                        "src": "50527:108:0",
                        "statements": [
                          {
                            "expression": {
                              "id": 2828,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "UnaryOperation",
                              "operator": "++",
                              "prefix": true,
                              "src": "50556:3:0",
                              "subExpression": {
                                "id": 2827,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2685,
                                "src": "50558:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 2829,
                            "nodeType": "ExpressionStatement",
                            "src": "50556:3:0"
                          }
                        ]
                      }
                    ]
                  },
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2691,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 2688,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2685,
                      "src": "48545:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "expression": {
                        "id": 2689,
                        "name": "_tokenContracts",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2648,
                        "src": "48549:15:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[] memory"
                        }
                      },
                      "id": 2690,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "48565:6:0",
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "48549:22:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "48545:26:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2832,
                  "initializationExpression": {
                    "assignments": [
                      2685
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 2685,
                        "mutability": "mutable",
                        "name": "i",
                        "nameLocation": "48538:1:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 2832,
                        "src": "48530:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2684,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "48530:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "visibility": "internal"
                      }
                    ],
                    "id": 2687,
                    "initialValue": {
                      "hexValue": "30",
                      "id": 2686,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "48542:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "48530:13:0"
                  },
                  "isSimpleCounterLoop": false,
                  "nodeType": "ForStatement",
                  "src": "48525:2121:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2844,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 2833,
                      "name": "BLOCKS_PER_EPOCH",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 134,
                      "src": "50920:16:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "components": [
                        {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2842,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 2834,
                              "name": "block",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -4,
                              "src": "50940:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_block",
                                "typeString": "block"
                              }
                            },
                            "id": 2835,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "50946:6:0",
                            "memberName": "number",
                            "nodeType": "MemberAccess",
                            "src": "50940:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "baseExpression": {
                              "baseExpression": {
                                "id": 2836,
                                "name": "claimed",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 176,
                                "src": "50955:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(address => mapping(address => uint256))"
                                }
                              },
                              "id": 2839,
                              "indexExpression": {
                                "expression": {
                                  "id": 2837,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "50963:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 2838,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberLocation": "50967:6:0",
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "src": "50963:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "50955:19:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2841,
                            "indexExpression": {
                              "id": 2840,
                              "name": "_zero",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2678,
                              "src": "50975:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "50955:26:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "50940:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 2843,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "TupleExpression",
                      "src": "50939:43:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "50920:62:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 2882,
                    "nodeType": "Block",
                    "src": "51435:2:0",
                    "statements": []
                  },
                  "id": 2883,
                  "nodeType": "IfStatement",
                  "src": "50916:521:0",
                  "trueBody": {
                    "id": 2881,
                    "nodeType": "Block",
                    "src": "50984:445:0",
                    "statements": [
                      {
                        "assignments": [
                          2846
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2846,
                            "mutability": "mutable",
                            "name": "_ethClaim",
                            "nameLocation": "51007:9:0",
                            "nodeType": "VariableDeclaration",
                            "scope": 2881,
                            "src": "50999:17:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2845,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "50999:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 2856,
                        "initialValue": {
                          "arguments": [
                            {
                              "id": 2848,
                              "name": "_userStake",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2664,
                              "src": "51049:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "id": 2851,
                                    "name": "this",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -28,
                                    "src": "51086:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_DAOPool_$2967",
                                      "typeString": "contract DAOPool"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_DAOPool_$2967",
                                      "typeString": "contract DAOPool"
                                    }
                                  ],
                                  "id": 2850,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "51078:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2849,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "51078:7:0",
                                    "typeDescriptions": {}
                                  }
                                },
                                "id": 2852,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "51078:13:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 2853,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "51092:7:0",
                              "memberName": "balance",
                              "nodeType": "MemberAccess",
                              "src": "51078:21:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "id": 2854,
                              "name": "totalStake",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 158,
                              "src": "51118:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2847,
                            "name": "_mulDivDown",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 614,
                            "src": "51019:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 2855,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "51019:124:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "50999:144:0"
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2859,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 2857,
                            "name": "_ethClaim",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2846,
                            "src": "51162:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "hexValue": "30",
                            "id": 2858,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "51175:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "51162:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2880,
                        "nodeType": "IfStatement",
                        "src": "51158:260:0",
                        "trueBody": {
                          "id": 2879,
                          "nodeType": "Block",
                          "src": "51178:240:0",
                          "statements": [
                            {
                              "expression": {
                                "id": 2868,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "baseExpression": {
                                    "baseExpression": {
                                      "id": 2860,
                                      "name": "claimed",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 176,
                                      "src": "51197:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                        "typeString": "mapping(address => mapping(address => uint256))"
                                      }
                                    },
                                    "id": 2864,
                                    "indexExpression": {
                                      "expression": {
                                        "id": 2861,
                                        "name": "msg",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -15,
                                        "src": "51205:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_message",
                                          "typeString": "msg"
                                        }
                                      },
                                      "id": 2862,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberLocation": "51209:6:0",
                                      "memberName": "sender",
                                      "nodeType": "MemberAccess",
                                      "src": "51205:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "51197:19:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 2865,
                                  "indexExpression": {
                                    "id": 2863,
                                    "name": "_zero",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2678,
                                    "src": "51217:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "51197:26:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "expression": {
                                    "id": 2866,
                                    "name": "block",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -4,
                                    "src": "51226:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_block",
                                      "typeString": "block"
                                    }
                                  },
                                  "id": 2867,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "51232:6:0",
                                  "memberName": "number",
                                  "nodeType": "MemberAccess",
                                  "src": "51226:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "51197:41:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2869,
                              "nodeType": "ExpressionStatement",
                              "src": "51197:41:0"
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "expression": {
                                      "id": 2875,
                                      "name": "msg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -15,
                                      "src": "51391:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_message",
                                        "typeString": "msg"
                                      }
                                    },
                                    "id": 2876,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberLocation": "51395:6:0",
                                    "memberName": "sender",
                                    "nodeType": "MemberAccess",
                                    "src": "51391:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "expression": {
                                      "id": 2870,
                                      "name": "iProtocol",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 143,
                                      "src": "51352:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IEnshroudProtocol_DAOPool_$60",
                                        "typeString": "contract IEnshroudProtocol_DAOPool"
                                      }
                                    },
                                    "id": 2872,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberLocation": "51362:10:0",
                                    "memberName": "depositEth",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 43,
                                    "src": "51352:20:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_payable$_t_address_$returns$__$",
                                      "typeString": "function (address) payable external"
                                    }
                                  },
                                  "id": 2874,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "names": [
                                    "value"
                                  ],
                                  "nodeType": "FunctionCallOptions",
                                  "options": [
                                    {
                                      "id": 2873,
                                      "name": "_ethClaim",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2846,
                                      "src": "51380:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "src": "51352:38:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_payable$_t_address_$returns$__$value",
                                    "typeString": "function (address) payable external"
                                  }
                                },
                                "id": 2877,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "51352:50:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2878,
                              "nodeType": "ExpressionStatement",
                              "src": "51352:50:0"
                            }
                          ]
                        }
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 2645,
              "nodeType": "StructuredDocumentation",
              "src": "47354:639:0",
              "text": "@notice for a staker to claim their pro rata token and ETH yields as deposits to the Enshroud Protocol contract\n @dev epoch is checked/updated every call and userStake (as a ratio of totalStake) is calculated as of block.number; epochPassedSinceStake modifier protects against flash loan + stake + claim\n msg.sender MUST APPROVE() THE ENSHROUD PROTOCOL CONTRACT ADDRESS IN EACH '_tokenContract' FOR THE APPLICABLE CLAIM AMOUNTS\n @param _tokenContracts array of token contract addresses which msg.sender seeks to claim in this epoch. Null address not permitted as an input as it used for the ETH claimed mapping."
            },
            "functionSelector": "13ce7bd0",
            "id": 2885,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 2651,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 2650,
                  "name": "nonReentrant",
                  "nameLocations": [
                    "48090:12:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 2994,
                  "src": "48090:12:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "48090:12:0"
              },
              {
                "id": 2653,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 2652,
                  "name": "epochPassedSinceStake",
                  "nameLocations": [
                    "48103:21:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 257,
                  "src": "48103:21:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "48103:21:0"
              }
            ],
            "name": "claimTokenYieldAsENFTs",
            "nameLocation": "48008:22:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2649,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2648,
                  "mutability": "mutable",
                  "name": "_tokenContracts",
                  "nameLocation": "48058:15:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 2885,
                  "src": "48041:32:0",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 2646,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "48041:7:0",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 2647,
                    "nodeType": "ArrayTypeName",
                    "src": "48041:9:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "48030:50:0"
            },
            "returnParameters": {
              "id": 2654,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "48125:0:0"
            },
            "scope": 2967,
            "src": "47999:3445:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 2965,
              "nodeType": "Block",
              "src": "51967:962:0",
              "statements": [
                {
                  "assignments": [
                    2894
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2894,
                      "mutability": "mutable",
                      "name": "_userStake",
                      "nameLocation": "52031:10:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2965,
                      "src": "52023:18:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2893,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "52023:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2899,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 2896,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "52054:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 2897,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "52058:6:0",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "52054:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 2895,
                      "name": "userStake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 707,
                      "src": "52044:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) view returns (uint256)"
                      }
                    },
                    "id": 2898,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "52044:21:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "52023:42:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2902,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 2900,
                      "name": "_userStake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2894,
                      "src": "52080:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 2901,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "52094:1:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "52080:15:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2906,
                  "nodeType": "IfStatement",
                  "src": "52076:38:0",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 2903,
                        "name": "NoShares",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 225,
                        "src": "52104:8:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$",
                          "typeString": "function () pure returns (error)"
                        }
                      },
                      "id": 2904,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "52104:10:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_error",
                        "typeString": "error"
                      }
                    },
                    "id": 2905,
                    "nodeType": "RevertStatement",
                    "src": "52097:17:0"
                  }
                },
                {
                  "assignments": [
                    2908
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2908,
                      "mutability": "mutable",
                      "name": "_zero",
                      "nameLocation": "52173:5:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 2965,
                      "src": "52165:13:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 2907,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "52165:7:0",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2913,
                  "initialValue": {
                    "arguments": [
                      {
                        "hexValue": "30",
                        "id": 2911,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "52189:1:0",
                        "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": 2910,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "52181:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_address_$",
                        "typeString": "type(address)"
                      },
                      "typeName": {
                        "id": 2909,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "52181:7:0",
                        "typeDescriptions": {}
                      }
                    },
                    "id": 2912,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "52181:10:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "52165:26:0"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2925,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 2914,
                      "name": "BLOCKS_PER_EPOCH",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 134,
                      "src": "52466:16:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "components": [
                        {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2923,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 2915,
                              "name": "block",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -4,
                              "src": "52486:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_block",
                                "typeString": "block"
                              }
                            },
                            "id": 2916,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "52492:6:0",
                            "memberName": "number",
                            "nodeType": "MemberAccess",
                            "src": "52486:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "baseExpression": {
                              "baseExpression": {
                                "id": 2917,
                                "name": "claimed",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 176,
                                "src": "52501:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(address => mapping(address => uint256))"
                                }
                              },
                              "id": 2920,
                              "indexExpression": {
                                "expression": {
                                  "id": 2918,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "52509:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 2919,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberLocation": "52513:6:0",
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "src": "52509:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "52501:19:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2922,
                            "indexExpression": {
                              "id": 2921,
                              "name": "_zero",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2908,
                              "src": "52521:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "52501:26:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "52486:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 2924,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "TupleExpression",
                      "src": "52485:43:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "52466:62:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 2963,
                    "nodeType": "Block",
                    "src": "52920:2:0",
                    "statements": []
                  },
                  "id": 2964,
                  "nodeType": "IfStatement",
                  "src": "52462:460:0",
                  "trueBody": {
                    "id": 2962,
                    "nodeType": "Block",
                    "src": "52530:384:0",
                    "statements": [
                      {
                        "assignments": [
                          2927
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2927,
                            "mutability": "mutable",
                            "name": "_ethClaim",
                            "nameLocation": "52553:9:0",
                            "nodeType": "VariableDeclaration",
                            "scope": 2962,
                            "src": "52545:17:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2926,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "52545:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 2937,
                        "initialValue": {
                          "arguments": [
                            {
                              "id": 2929,
                              "name": "_userStake",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2894,
                              "src": "52595:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "id": 2932,
                                    "name": "this",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -28,
                                    "src": "52632:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_DAOPool_$2967",
                                      "typeString": "contract DAOPool"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_DAOPool_$2967",
                                      "typeString": "contract DAOPool"
                                    }
                                  ],
                                  "id": 2931,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "52624:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2930,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "52624:7:0",
                                    "typeDescriptions": {}
                                  }
                                },
                                "id": 2933,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "52624:13:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 2934,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "52638:7:0",
                              "memberName": "balance",
                              "nodeType": "MemberAccess",
                              "src": "52624:21:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "id": 2935,
                              "name": "totalStake",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 158,
                              "src": "52664:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2928,
                            "name": "_mulDivDown",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 614,
                            "src": "52565:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 2936,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "52565:124:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "52545:144:0"
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2940,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 2938,
                            "name": "_ethClaim",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2927,
                            "src": "52708:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "hexValue": "30",
                            "id": 2939,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "52721:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "52708:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2961,
                        "nodeType": "IfStatement",
                        "src": "52704:199:0",
                        "trueBody": {
                          "id": 2960,
                          "nodeType": "Block",
                          "src": "52724:179:0",
                          "statements": [
                            {
                              "expression": {
                                "id": 2949,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "baseExpression": {
                                    "baseExpression": {
                                      "id": 2941,
                                      "name": "claimed",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 176,
                                      "src": "52743:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                        "typeString": "mapping(address => mapping(address => uint256))"
                                      }
                                    },
                                    "id": 2945,
                                    "indexExpression": {
                                      "expression": {
                                        "id": 2942,
                                        "name": "msg",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -15,
                                        "src": "52751:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_message",
                                          "typeString": "msg"
                                        }
                                      },
                                      "id": 2943,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberLocation": "52755:6:0",
                                      "memberName": "sender",
                                      "nodeType": "MemberAccess",
                                      "src": "52751:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "52743:19:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 2946,
                                  "indexExpression": {
                                    "id": 2944,
                                    "name": "_zero",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2908,
                                    "src": "52763:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "52743:26:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "expression": {
                                    "id": 2947,
                                    "name": "block",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -4,
                                    "src": "52772:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_block",
                                      "typeString": "block"
                                    }
                                  },
                                  "id": 2948,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "52778:6:0",
                                  "memberName": "number",
                                  "nodeType": "MemberAccess",
                                  "src": "52772:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "52743:41:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2950,
                              "nodeType": "ExpressionStatement",
                              "src": "52743:41:0"
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "expression": {
                                      "id": 2956,
                                      "name": "msg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -15,
                                      "src": "52876:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_message",
                                        "typeString": "msg"
                                      }
                                    },
                                    "id": 2957,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberLocation": "52880:6:0",
                                    "memberName": "sender",
                                    "nodeType": "MemberAccess",
                                    "src": "52876:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "expression": {
                                      "id": 2951,
                                      "name": "iProtocol",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 143,
                                      "src": "52837:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IEnshroudProtocol_DAOPool_$60",
                                        "typeString": "contract IEnshroudProtocol_DAOPool"
                                      }
                                    },
                                    "id": 2953,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberLocation": "52847:10:0",
                                    "memberName": "depositEth",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 43,
                                    "src": "52837:20:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_payable$_t_address_$returns$__$",
                                      "typeString": "function (address) payable external"
                                    }
                                  },
                                  "id": 2955,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "names": [
                                    "value"
                                  ],
                                  "nodeType": "FunctionCallOptions",
                                  "options": [
                                    {
                                      "id": 2954,
                                      "name": "_ethClaim",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2927,
                                      "src": "52865:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "src": "52837:38:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_payable$_t_address_$returns$__$value",
                                    "typeString": "function (address) payable external"
                                  }
                                },
                                "id": 2958,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "52837:50:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2959,
                              "nodeType": "ExpressionStatement",
                              "src": "52837:50:0"
                            }
                          ]
                        }
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 2886,
              "nodeType": "StructuredDocumentation",
              "src": "51452:428:0",
              "text": "@notice for a staker to claim their pro rata ETH yield separately as a deposit to the Enshroud Protocol contract\n @notice claimTokenYieldAsENFTs() above also claims ETH after claiming yields on the passed list of tokens\n @dev epoch is checked/updated every call and userStake (as a ratio of totalStake) is calculated as of block.number; epochPassedSinceStake modifier protects against flash loan + stake + claim"
            },
            "functionSelector": "d13a266a",
            "id": 2966,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 2889,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 2888,
                  "name": "nonReentrant",
                  "nameLocations": [
                    "51927:12:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 2994,
                  "src": "51927:12:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "51927:12:0"
              },
              {
                "id": 2891,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 2890,
                  "name": "epochPassedSinceStake",
                  "nameLocations": [
                    "51940:21:0"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 257,
                  "src": "51940:21:0"
                },
                "nodeType": "ModifierInvocation",
                "src": "51940:21:0"
              }
            ],
            "name": "claimETHYieldAsENFTs",
            "nameLocation": "51895:20:0",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2887,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "51915:2:0"
            },
            "returnParameters": {
              "id": 2892,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "51967:0:0"
            },
            "scope": 2967,
            "src": "51886:1043:0",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 2968,
        "src": "43354:9578:0",
        "usedErrors": [
          189,
          191,
          193,
          195,
          197,
          199,
          201,
          203,
          205,
          207,
          209,
          211,
          213,
          215,
          217,
          219,
          221,
          223,
          225,
          227,
          229,
          231,
          233,
          235,
          237,
          239,
          2972
        ],
        "usedEvents": [
          1022,
          1032,
          1044,
          1358,
          1366,
          1374,
          1730,
          1742,
          1754,
          2155,
          2165,
          2173
        ]
      }
    ],
    "src": "33:52901:0"
  },
  "compiler": {
    "name": "solc",
    "version": "0.8.28+commit.7893614a.Linux.g++"
  },
  "networks": {},
  "schemaVersion": "3.4.16",
  "updatedAt": "2025-05-09T04:36:44.226Z",
  "devdoc": {
    "kind": "dev",
    "methods": {},
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  }
}