TGViewer
Из Solidity в AI и дальше Из Solidity в AI и дальше @solidityset · 2.48K subscribers
Post #1035 900
Foundry: организация prank вызовов в функции

В протоколе PoolTogather заметил простой и удобный способ переключения prank вызовов внутри одной функции.

К примеру, у нас есть такая функция:

solidity
function someTestCall() public {

   // действия от пользователя_1

   // переключение на пользователя_2
   // выполнение некоторых действий

   // обратное переключение на пользователя_1
   // продолжение действий

}


Да, можно все это сделать с обычными prank, stop/startPrank, hoax, но в итоге может получиться ситуация, когда в тесте будет слишком много этих не нужных читкодов.

Вот как сделала команда PoolTogather.

Они создали модификатор:


solidity
    modifier prankception(address prankee) {
        address prankBefore = currentPrankee;
        vm.stopPrank();
        vm.startPrank(prankee);
        _;
        vm.stopPrank();
        if (prankBefore != address(0)) {
            vm.startPrank(prankBefore);
        }
    }


а затем поместили его в нужные служебные функции, например, в такую:

solidity
    function _accrueYield() internal virtual override prankception(_aTokenWhale) {
        IERC20(_aToken).transfer(_yieldVault, 10 ** assetDecimals);
        vm.warp(block.timestamp + 1 days);
    }


и теперь ее можно вызывать внутри других функций, с изменение роли вызывающего:

solidity
    function accrueYield() public returns (uint256) {
        uint256 assetsBefore = prizeVault.totalAssets();

@>        _accrueYield();

        uint256 assetsAfter = prizeVault.totalAssets();
        if (yieldVault.balanceOf(address(prizeVault)) > 0) {
            require(assetsAfter > assetsBefore, "yield did not accrue");
        } else {
            if (underlyingAsset.balanceOf(address(prizeVault)) > 0) {
               ...
            } else {
                ...
            }
        }
        return assetsAfter - assetsBefore;
    }


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

На мой взгляд достаточно чистый и красивый код теста.

#foundry #prank
  • 👍 5
  • 🔥 1
More from @solidityset
  1. Oct 2, 2026Вторая сложность — как доказать, что установилось именно опубликованное. В первом варианте…
  2. Oct 2, 2026Задача с полуоткрытым кодом На днях, в процессе создания одного приложения, столкнулся с и…
  3. Sep 22, 2026Какой язык программирования учить сейчас? На днях в Твиттере увидел небольшой пост о разви…
  4. Sep 18, 2026Интересная модель Jev Буквально пару дней назад в Твиттере многие начали обсуждение новой…
  5. Sep 14, 2026Графы повсюду Если вы также следите за новостями в мире ИИ, то наверняка уже все чаще встр…
  6. Sep 10, 2026GTA6, Cyberleek, блокчейн и безопасность Увидел несколько постов (тут и тут) про Cyberleek…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →