Solidity. Смарт контракты и аудит
2.62K subscribers
246 photos
7 videos
18 files
555 links
Обучение Solidity. Уроки, аудит, разбор кода и популярных сервисов
Download Telegram
Работа с процентами

В завершении второго модуля курса был большой практикум, где в одном из заданий требовалось понимание работы с процентами при математических операциях. И поступило несколько вопросов про то, как это лучше реализовать. Я посмотрел на канале и понял, что также не поднимал этот вопрос тут. Поэтому по возвращению из поездки на выходных, решил написать этот пост с небольшим разбором.

Как мы знаем, в Solidity вообще большие проблемы с математикой, в частности, с делением. А для того, чтобы посчитать 10% от какого-либо числа нужна именно эта операция.

Из школьных лет мы можем вспомнить, чтобы получить процент от числа нужно:

100 шариков - 100 %
——————- ———-
? шариков - 10 %


100 * 10 / 100 = 10 шариков

вроде как, перемножаем крест-накрест.

В Solidity, в самой популярной реализации, примерно также, с одним уточнением.

Я часто в аудитах видел, что вводится некое понятие BasisPoints и приравнивается к 10 000.

uint256 constant public BASIS_POINTS = 10000;

Также можно встретить названия bps или просто bp.

Вот эти 10000, по своей сути, равны 100,00%. Два нуля после запятой сделаны для работы с более мелкими процентами, типа 1,85%.

И для того, чтобы получить 2,75% от общего количества токенов делают примерно так:

(tokenAmount * 275) / BASIS_POINTS;

При этом для дополнительной точности вычисления значений порой допускают другие операции, типа округление вверх или вниз.

Я встречал еще не очень популярные библиотеки (часто написанные разработчиками для какого-то конкретного протокола), но вариант с bps, наверное, самый популярный.

А вы знаете еще какие-нибудь варианты работы с процентами?

#math #percentage
👍12