Skip to content

vm.prank() cannot be wrapped #40

@forkforkdog

Description

@forkforkdog

Seems like fl.prank doesn't work as expected

under direct vm.prank it resets sender after each call and prank itsefl has prank (return) -> increment (stop) opcodes

├─ [0] VM::prank(0x0000000000000000000000000000000000000004)
│ └─ ← [Return]
├─ [22340] Counter::increment()
│ └─ ← [Stop]

but when wrapping in fl.prank it does
prank (return) + (STOP) -> increment (stop).

As a result it doesn't reset the sender and throws an error

├─ [902] Fuzzlib::prank(0x0000000000000000000000000000000000000004)
│   ├─ [0] VM::prank(0x0000000000000000000000000000000000000004)
│   │   └─ ← [Return] 
│   └─ ← [Stop] 
├─ [22340] Counter::increment()
│   └─ ← [Stop] 

logs for pure prank

[41862] CounterTest::test_Increment()
    ├─ [0] VM::readCallers()
    │   └─ ← [Return] 0, DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38], DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38]
    ├─ [0] console::log("sender", DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38]) [staticcall]
    │   └─ ← [Stop] 
    ├─ [0] console::log("origin", DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38]) [staticcall]
    │   └─ ← [Stop] 
    ├─ [0] VM::prank(0x0000000000000000000000000000000000000004)
    │   └─ ← [Return] 
    ├─ [22340] Counter::increment()
    │   └─ ← [Stop] 
    ├─ [0] VM::readCallers()
    │   └─ ← [Return] 0, DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38], DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38]
    ├─ [0] console::log("sender2", DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38]) [staticcall]
    │   └─ ← [Stop] 
    ├─ [0] console::log("origin2", DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38]) [staticcall]
    │   └─ ← [Stop] 
    ├─ [0] VM::prank(0x0000000000000000000000000000000000000004)
    │   └─ ← [Return] 
    ├─ [440] Counter::increment()
    │   └─ ← [Stop] 
    ├─ [283] Counter::number() [staticcall]
    │   └─ ← [Return] 2

for fl.prank

[50693] CounterTest::test_Increment()
    ├─ [5617] Fuzzlib::readCallers()
    │   ├─ [0] VM::readCallers()
    │   │   └─ ← [Return] 0, DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38], DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38]
    │   └─ ← [Return] DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38], DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38]
    ├─ [0] console::log("sender", DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38]) [staticcall]
    │   └─ ← [Stop] 
    ├─ [0] console::log("origin", DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38]) [staticcall]
    │   └─ ← [Stop] 
    ├─ [902] Fuzzlib::prank(0x0000000000000000000000000000000000000004)
    │   ├─ [0] VM::prank(0x0000000000000000000000000000000000000004)
    │   │   └─ ← [Return] 
    │   └─ ← [Stop] 
    ├─ [22340] Counter::increment()
    │   └─ ← [Stop] 
    ├─ [1117] Fuzzlib::readCallers()
    │   ├─ [0] VM::readCallers()
    │   │   └─ ← [Return] 3, 0x0000000000000000000000000000000000000004, DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38]
    │   └─ ← [Return] 0x0000000000000000000000000000000000000004, DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38]
    ├─ [0] console::log("sender2", 0x0000000000000000000000000000000000000004) [staticcall]
    │   └─ ← [Stop] 
    ├─ [0] console::log("origin2", DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38]) [staticcall]
    │   └─ ← [Stop] 
    ├─ [913] Fuzzlib::prank(0x0000000000000000000000000000000000000004)
    │   ├─ [0] VM::prank(0x0000000000000000000000000000000000000004)
    │   │   └─ ← [Revert] cannot overwrite a prank until it is applied at least once
    │   └─ ← [Revert] cannot overwrite a prank until it is applied at least once
    └─ ← [Revert] cannot overwrite a prank until it is applied at least once

In my maybe incorrect understanding, when funciton execution stops without usage like

prank(...) ... {
vm.prank..
   }

it thinks that that prank was not used and pranked sender doesn't resets

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions