На днях выпустили отчет по аудиту Mia DAO, где был один примечательный med issue, о котором хочется рассказать.
Посмотрите на код ниже и подумайте, в чем тут может быть проблема:
function _normalizeDecimalsMultiple(uint256[] memory _deposits, address[] memory _tokens) internal view
returns (uint256[] memory deposits)
{
for (uint256 i = 0; i < _deposits.length; i++) {
deposits[i] = _normalizeDecimals(_deposits[i], ERC20(_tokens[i]).decimals());
}
}
Более опытные разработчки, вероятно, сразу поймут, в чем дело. Хотя этот баг был найден всего лишь одним аудитором.Ответ:
Функция не будет работать, так как deposits никогда не были сохранены в памяти.
Вот как правильно нужно было сделать:
{
uint len = _deposits.length;
deposits = new uint256[](len);
for (uint256 i = 0; i < len; i++) {
deposits[i] = _normalizeDecimals(_deposits[i], ERC20(_tokens[i]).decimals());
}
}
Интересный пример, не так ли?
#bug