Итак, в функцию setUp(), перед созданием контракта Counter, помещаем следующую строку:
vm.prank(ADMIN);
И наш контракт Counter теперь будет иметь владельцем адрес ADMIN. Проверим это в тестах. Напишем простой тест:
function test_SetNumberOwner () public {
vm.startPrank(ADMIN);
counter.setNumberOwner(45);
vm.stopPrank();
}Здесь мы определяем в тесте, что последующие вызовы будут идти от имени адреса админа и делаем вызов на изменение числа.
Если вместо ADMIN мы подставим адрес HACKER, то тест провалится, что обозначает правильную работу доступа к функции.
Кстати, вот небольшой лайфхак по работе со startPrank и stopPrank, который я подсмотрел в одном из конкурсных протоколов.
Обычно мы пишем тест и уже перед тем, как вызвать необходимую функции из под нужного аккаунта (владельца, пользователя, хакера), мы пишем:
vm.startPrank(user);
и в завершении:
vm.stopPrank();
Порой для тестов это приходится прописывать довольно часто. Так вот, в этом контракте придумали поместить это все в модификатор:
modifier prank(address from) {
vm.startPrank(from);
_;
vm.stopPrank();
}А потом использовать его, как обычно, в функциях:
function test_addLiquidity() public prank(user) {}На мой взгляд достаточно элегантное решение.
Завтра мы поговорим о простой организации файлов в папке тестов, а сейчас вы можете скачать файлы контракта и тестов к нему, чтобы попрактиковаться самим.
#foundry #lesson14