An internal function at the very bottom of HOGE's contract is called every time a transfer is performed, to find the correct denominator:
function _getCurrentSupply() private view returns(uint256, uint256) {
uint256 rSupply = _rTotal;
uint256 tSupply = _tTotal;
for (uint256 i = 0; i < _excluded.length; i++) {
if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
rSupply = rSupply.sub(_rOwned[_excluded[i]]);
tSupply = tSupply.sub(_tOwned[_excluded[i]]);
}
if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
return (rSupply, tSupply);
}
The iteration in the middle of the function is a glaring red flag.
The contract's author attempted to establish a parallel bookkeeping system exempt from receiving reflections. In doing so, they introduced linear complexity growth.