Необычный require и работа с ошибками
Иногда я писал про интересные моменты в коде, которые встречаю в процессе аудита. Вот и сейчас хочу поделиться одной очень занимательной реализацией кода.
В протоколе Unitas сформирована не совсем стандартная работа с отслеживанием возникающих ошибок в функциях по типу тех, что мы обычно пишем в require. Напомню, что условия для проверки пишутся так:
require(condition, "Error message...");
Можно создавать свои кастомные ошибки, типа "error Unauthorized();", но тогда нам придется использовать if/else вместо require.
В данном протоколе команда пошла дальше. Они создали отдельную библиотеку, где обозначили все возможные ошибки для своего проекта, и записали из в простые uint, например:
uint256 internal constant ADDRESS_ZERO = 1000;
1000 - это код ошибки, а само ее описание сделано комментарием выше.
Далее они написали свою реализацию функции require:
function _require(bool condition, uint256 errorCode) pure {
if (!condition) {
_revert(errorCode);
}
}
И свою реализацию функции revert. Она достаточно длинная, поэтому ее можно будет посмотреть по ссылке ниже на файл протокола.
Теперь в рабочих контрактах протокола можно использовать свой require для вывода ошибок:
_require(amount <= portfolio, Errors.AMOUNT_INVALID);
На самом деле, очень удобная система, когда все ошибки находятся в одном файле под своим кодом.
Саму реализацию файла можно посмотреть тут.
Надеюсь и вам понравится эта система так же, как и мне.
#error #require
Post #791
1.07K
- 👍 22