Я хочу равномерно распределить комиссию с каждой транзакции на сопоставление (адрес => uint) 3000 адресов.
Теперь это проблема, потому что функция исчерпает газ, поэтому я слышал, что вместо метода push ее должен выполнять метод pull.
Поэтому вместо этого объедините все сборы вместе под одним uint, а затем позвольте каждому из каждых 3k адресов получить свою долю.
Теперь это приносит новые проблемы, потому что uint пула постоянно увеличивается и уменьшается (когда люди забирают свою долю и новые входящие комиссии от транзакций), и как я могу контролировать того, кто может получить свою долю только один раз, но при этом постоянно и равномерно распределяется?
Буду очень признателен за некоторые указания о том, как решить эти проблемы с распределением, потому что моя математика далеко не самый сильный актив, которым я обладаю.
Решил эту проблему, создав сопоставление для хранения для каждого пользователя общей суммы входящих депозитов в последний раз, когда они требовали свою долю, и вычесть это из текущей общей суммы входящих депозитов и указать процент сокращения на основе разницы, если таковая имеется.
Psuedo Solidity (за исключением надлежащих проверок и взаимодействий):
uint256 totalRevShare = onDeposit() pub payable {...+=msg.value}
//..in Withdraw Function
...
uint256 unclaimedScope = totalRevShare - LastTotalRevShare[user];
LastTotalRevShare[user] = totalRevShare;
uint256 _userUnclaimedCut = unclaimedScope / totalReceivers;
...
msg.sender.call{value:_userUnclaimedCut}("");
Надеюсь, это поможет вам перейти от функции push к функции pull.