有一个可靠的代码:
modifier notContract() {
require(!_isContract(msg.sender), "Contract not allowed");
require(msg.sender == tx.origin, "Proxy contract not allowed");
_;
}
有一个测试:
function testStartRound() public {
vm.startPrank(owner);
head_or_tail.startRound(0);
vm.stopPrank();
}
代工厂测试通过,但有错误:
[10569] CounterTest::testStartRound()
├─ [0] VM::startPrank(0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045)
│ └─ ← ()
├─ [513] HeadOrTail::startRound(0)
│ └─ ← "Proxy contract not allowed"
└─ ← "Proxy contract not allowed"
如何在没有错误的情况下通过这个?
我在铸造手册中没有找到任何解决方案
我也遇到了同样的问题。我发现您可以覆盖
tx.origin
文件中的 sender
和 foundry.toml
地址。我不知道为什么这不适用于 vm.prank()
或 vm.startPrank()
。
我覆盖这两个变量以在测试中将所需的地址分配给
tx.origin
。
[profile.default]
src = "src"
out = "out"
libs = ["lib"]
// added lines
sender = '0x9dF0C6b0066D5317aA5b38B36850548DaCCa6B4e'
tx_origin = '0x9dF0C6b0066D5317aA5b38B36850548DaCCa6B4e'
有带有默认值的完整默认 Foundry.toml 文件:
https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options