Lack of child rewarder reserves could lead to freeze of funds
In ComplexRewarder.sol, `onReward()` is used to distribute rewards for previous time period, using the complex rewarder and any child rewarders. If the complex rewarder does not have enough tokens to hand out the reward, it correctly stores the rewards owed in storage. However, child rewarded will attempt to hand out the reward and may revert:\\n```\\n   function onReward(uint _pid, address _user, address _to, uint, uint _amt) external override onlyParent nonReentrant {\\n      PoolInfo memory pool = updatePool(_pid);\\n         if (pool.lastRewardTime == 0) return;\\n            UserInfo storage user = userInfo[_pid][_user];\\n            uint pending;\\n         if (user.amount > 0) {\\n              pending = ((user.amount * pool.accRewardPerShare) / ACC_TOKEN_PRECISION) - user.rewardDebt;\\n      rewardToken.safeTransfer(_to, pending);\\n         }\\n         user.amount = _amt;\\n         user.rewardDebt = (_amt * pool.accRewardPerShare) / \\n            ACC_TOKEN_PRECISION;\\n      emit LogOnReward(_user, _pid, pending, _to);\\n      }\\n```\\n\\nImportantly, if the child rewarder fails, the parent's `onReward()` reverts too:\\n```\\n      uint len = childrenRewarders.length();\\n         for (uint i = 0; i < len; ) {\\n      IRewarder(childrenRewarders.at(i)).onReward(_pid, _user, _to, 0, \\n         _amt);\\n      unchecked {\\n         ++i;\\n         }\\n      }\\n```\\n\\nIn the worst-case scenario, this will lead the user's `withdraw()` call to V3 Vault, to revert.
Introduce sufficient exception handling in the CompexRewarder.sol contract, so that `onReward()` would never fail.
```\\n   function onReward(uint _pid, address _user, address _to, uint, uint _amt) external override onlyParent nonReentrant {\\n      PoolInfo memory pool = updatePool(_pid);\\n         if (pool.lastRewardTime == 0) return;\\n            UserInfo storage user = userInfo[_pid][_user];\\n            uint pending;\\n         if (user.amount > 0) {\\n              pending = ((user.amount * pool.accRewardPerShare) / ACC_TOKEN_PRECISION) - user.rewardDebt;\\n      rewardToken.safeTransfer(_to, pending);\\n         }\\n         user.amount = _amt;\\n         user.rewardDebt = (_amt * pool.accRewardPerShare) / \\n            ACC_TOKEN_PRECISION;\\n      emit LogOnReward(_user, _pid, pending, _to);\\n      }\\n```\\n