строчка 11 - uint256 payout = invests[sender] / 100 * (now - dates[sender]) / 1 days
расчитывает по дням а не по блокам ... если в не точное время запрашивать вывод то теряешь %% ...а по блокам уже не привязан к времени . По блокам лучше !
Вы глубоко ошибаетесь.
Использование временных меток позволяет расчитать сумму выплаты с точностью до секунды, поскольку опирается на значение 1 days - количество секунд в сутках, а их всегда ровно 86400, это незыблемая константа.
Расчёт же по номерам блоков, как правило, основывается на числе 5900, это
среднее количество блоков за сутки и оно может варьироваться от случая к случаю, вызывая неточности вычислений. Более того, в любой момент это значение может существенно измениться, что приведёт к весьма серьёзным последствиям.
Вычисления на базе временных меток гораздо точнее и надёжнее.
Если вы умеете пользоваться калькулятором, вы легко сможете это проверить - запросите выплату через несколько секунд/минут/часов после вклада и вы будете приятно удивлены точности пришедшей вам суммы.