Undelegating 0 votes from an address who is not a delegate of a user will fail an assert.
Similar scenario with issue 5.5. `ERC20MultiVotes._undelegate` has an edge case scenario where a user can attempt to undelegate from a `delegatee` that is not in the user delegates list by 0 `amount`, which would trigger a failure in an assert.\\n```\\nfunction \\_undelegate(\\n    address delegator,\\n    address delegatee,\\n    uint256 amount\\n) internal virtual {\\n    uint256 newDelegates = \\_delegatesVotesCount[delegator][delegatee] - amount;\\n\\n    if (newDelegates == 0) {\\n        assert(\\_delegates[delegator].remove(delegatee)); // Should never fail.\\n    }\\n```\\n\\nAs `_undelegate`, or `undelegate` don't explicitly check that a `delegatee` belongs to the user, the contract logic continues with its operations in `_undelegate` for the `delegatee` passed to it. In general this is fine because if a user tries to `undelegate` non-zero `amount` from a `delegatee` they have no votes delegated to, thus getting `_delegatesVotesCount[delegator][delegatee]=0`, there would be a revert due to a negative value being passed to `uint256 newDelegates`\\n```\\nuint256 newDelegates = \\_delegatesVotesCount[delegator][delegatee] - amount;\\n```\\n\\nHowever, passing a `amount=0` parameter with a `delegatee` that doesn't belong to the user, would successfully process that line. This would then be followed by an evaluation `if (newDelegates == 0)`, which would succeed, to finally reach an assert that will verify a remove of that `delegatee` from the user delegates list. However, it will fail since it was never there in the first place.\\n```\\nassert(\\_delegates[delegator].remove(delegatee)); // Should never fail.\\n```\\n\\nAlthough an edge case with no effect on contract state's health, it may happen with front end bugs or incorrect user transactions, and it is best not to have asserts fail, as per the dev comment in that line “// Should never fail”.
Replace `assert()` with a `require()` or verify that the delegatee belongs to the user prior to performing any operations.
```\\nfunction \\_undelegate(\\n    address delegator,\\n    address delegatee,\\n    uint256 amount\\n) internal virtual {\\n    uint256 newDelegates = \\_delegatesVotesCount[delegator][delegatee] - amount;\\n\\n    if (newDelegates == 0) {\\n        assert(\\_delegates[delegator].remove(delegatee)); // Should never fail.\\n    }\\n```\\n