Sushi: balanceOfToken underestimates balance
The `balanceOfToken` computation is too pessimistic, i.e., it can underestimate the current balance slightly.\\n```\\n/// @notice Returns the total balance (in asset tokens). This includes the deposits and interest.\\n/// @return The underlying balance of asset tokens\\nfunction balanceOfToken(address addr) public override returns (uint256) {\\n    if (balances[addr] == 0) return 0;\\n    ISushiBar bar = ISushiBar(sushiBar);\\n\\n    uint256 shares = bar.balanceOf(address(this));\\n    uint256 totalShares = bar.totalSupply();\\n\\n    uint256 sushiBalance =\\n        shares.mul(ISushi(sushiAddr).balanceOf(address(sushiBar))).div(\\n            totalShares\\n        );\\n    uint256 sourceShares = bar.balanceOf(address(this));\\n\\n    return (balances[addr].mul(sushiBalance).div(sourceShares));\\n}\\n```\\n\\nFirst, it calculates the amount of SUSHI that “belongs to” the yield source contract (sushiBalance), and then it determines the fraction of that amount that would be owed to the address in question. However, the “belongs to” above is a purely theoretical concept; it never happens that the yield source contract as a whole redeems and then distributes that amount among its shareholders; instead, if a shareholder redeems tokens, their request is passed through to the `SushiBar`. So in reality, there's no reason for this two-step process, and the holder's balance of SUSHI is more accurately computed as `balances[addr].mul(ISushi(sushiAddr).balanceOf(address(sushiBar))).div(totalShares)`, which can be greater than what `balanceOfToken` currently returns. Note that this is the amount of SUSHI that `addr` could withdraw directly from the `SushiBar`, based on their amount of shares. Observe also that if we sum these numbers up over all holders in the yield source contract, the result is smaller than or equal to `sushiBalance`. So the sum still doesn't exceed what “belongs to” the yield source contract.
The `balanceOfToken` function should use the formula above.
```\\n/// @notice Returns the total balance (in asset tokens). This includes the deposits and interest.\\n/// @return The underlying balance of asset tokens\\nfunction balanceOfToken(address addr) public override returns (uint256) {\\n    if (balances[addr] == 0) return 0;\\n    ISushiBar bar = ISushiBar(sushiBar);\\n\\n    uint256 shares = bar.balanceOf(address(this));\\n    uint256 totalShares = bar.totalSupply();\\n\\n    uint256 sushiBalance =\\n        shares.mul(ISushi(sushiAddr).balanceOf(address(sushiBar))).div(\\n            totalShares\\n        );\\n    uint256 sourceShares = bar.balanceOf(address(this));\\n\\n    return (balances[addr].mul(sushiBalance).div(sourceShares));\\n}\\n```\\n