测试 isContract 和 tx.origin 在代工厂

问题描述 投票:0回答:1

有一个可靠的代码:

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"

如何在没有错误的情况下通过这个?

我在铸造手册中没有找到任何解决方案

solidity
1个回答
0
投票

我也遇到了同样的问题。我发现您可以覆盖

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

© www.soinside.com 2019 - 2024. All rights reserved.