Для того, чтобы атакующий не мог размыть долю вкладчика, используются так называемые dead shares, т.е. мертвые доли
Например, при инициализации пула мы можем сминтить 1000 shares и отправить их на нулевой адрес
function initialize() public {
uint256 deadAmount = 1000; // Или 1e6, в зависимости от decimals
_mint(address(0), deadAmount); // Минтим и "сжигаем" на нулевом адресе
}Размыть 1000 долей намного сложнее, чем манипулировать отправной точкой 0, то есть мы не закрываем уязвимость, но делаем эксплуатацию сильно дороже, потому что в
sharesAmount = totalShares * assetAmount / asset.balanceOf(address(this))totalShares теперь равен 1000, а не 1, как было показано в примере атакиUPD. Мне попалась классная атака с обходом deadshares, так что этот пост нужен для контекста разбора
https://t.me/web3securityresearch