Patric Collins 的稳定币项目 testRevertsIfTransferFromFails 调用 vm.prank(msg.sender)

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

我正在关注 Patric Collin 的稳定币课程。 testRevertsIfTransferFromFails

        address owner = msg.sender;
        vm.prank(owner);

该行将

msg.sender
设置为
msg.sender
vm.prank
对我来说没有任何意义。但是,如果我删除该行,测试将失败并显示以下错误消息。

谁能解释一下 vm.prank(owner) 叫什么?

谢谢

➜  foundry-defi-stablecoin-f23-tt git:(main) ✗ forge test --match-test testRevertsIfTransferFromFails -vvvv
[⠒] Compiling...
[⠃] Compiling 1 files with 0.8.21
[⠊] Solc 0.8.21 finished in 1.78s
Compiler run successful with warnings:
Warning (2072): Unused local variable.
  --> test/unit/DscEngineTest.t.sol:77:9:
   |
77 |         DscEngine _dscEngine = new DscEngine(tokens, priceFeeds, address(dsc));
   |         ^^^^^^^^^^^^^^^^^^^^

Warning (2072): Unused local variable.
   --> test/unit/DscEngineTest.t.sol:106:9:
    |
106 |         address owner = msg.sender;
    |         ^^^^^^^^^^^^^


Ran 1 test for test/unit/DscEngineTest.t.sol:DscEngineTest
[FAIL. Reason: OwnableUnauthorizedAccount(0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496)] testRevertsIfTransferFromFails() (gas: 1600030)
Logs:
  Transferring ownership of DSC to DSC Engine
  DSC Engine deployed

Traces:
  [8972774] DscEngineTest::setUp()
    ├─ [4061538] → new DeployDsc@0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f
    │   └─ ← 20174 bytes of code
    ├─ [4704498] DeployDsc::run()
    │   ├─ [3001246] → new HelperConfig@0x104fBc016F4bb334D775a19E8A6510109AC63E00
    │   │   ├─ [0] VM::startBroadcast()
    │   │   │   └─ ← ()
    │   │   ├─ [372255] → new MockV3Aggregator@0x90193C961A926261B756D1E5bb255e67ff9498A1
    │   │   │   └─ ← 1082 bytes of code
    │   │   ├─ [372255] → new MockV3Aggregator@0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496
    │   │   │   └─ ← 1082 bytes of code
    │   │   ├─ [449186] → new ERC20Mock@0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3
    │   │   │   └─ ← 2018 bytes of code
    │   │   ├─ [449186] → new ERC20Mock@0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76
    │   │   │   └─ ← 2018 bytes of code
    │   │   ├─ [0] VM::stopBroadcast()
    │   │   │   └─ ← ()
    │   │   └─ ← 5457 bytes of code
    │   ├─ [956] HelperConfig::activeNetworkConfig() [staticcall]
    │   │   └─ ← MockV3Aggregator: [0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496], MockV3Aggregator: [0x90193C961A926261B756D1E5bb255e67ff9498A1], ERC20Mock: [0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76], ERC20Mock: [0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3], 77814517325470205911140941194401928579557062014761831930645393041380819009408 [7.781e76]
    │   ├─ [0] VM::startBroadcast(<pk>)
    │   │   └─ ← ()
    │   ├─ [591266] → new DecentralizedStableCoin@0x5FbDB2315678afecb367f032d93F642f64180aa3
    │   │   ├─ emit OwnershipTransferred(previousOwner: 0x0000000000000000000000000000000000000000, newOwner: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266)
    │   │   └─ ← 2609 bytes of code
    │   ├─ [868180] → new DscEngine@0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512
    │   │   └─ ← 3658 bytes of code
    │   ├─ [0] console::log("Transferring ownership of DSC to DSC Engine") [staticcall]
    │   │   └─ ← ()
    │   ├─ [2424] DecentralizedStableCoin::transferOwnership(DscEngine: [0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512])
    │   │   ├─ emit OwnershipTransferred(previousOwner: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266, newOwner: DscEngine: [0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512])
    │   │   └─ ← ()
    │   ├─ [0] VM::stopBroadcast()
    │   │   └─ ← ()
    │   ├─ [0] console::log("DSC Engine deployed") [staticcall]
    │   │   └─ ← ()
    │   └─ ← DecentralizedStableCoin: [0x5FbDB2315678afecb367f032d93F642f64180aa3], DscEngine: [0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512], HelperConfig: [0x104fBc016F4bb334D775a19E8A6510109AC63E00]
    ├─ [956] HelperConfig::activeNetworkConfig() [staticcall]
    │   └─ ← MockV3Aggregator: [0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496], MockV3Aggregator: [0x90193C961A926261B756D1E5bb255e67ff9498A1], ERC20Mock: [0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76], ERC20Mock: [0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3], 77814517325470205911140941194401928579557062014761831930645393041380819009408 [7.781e76]
    ├─ [46789] ERC20Mock::mint(USER: [0xF921F4FA82620d8D2589971798c51aeD0C02c81a], 100000000000000000000 [1e20])
    │   ├─ emit Transfer(from: 0x0000000000000000000000000000000000000000, to: USER: [0xF921F4FA82620d8D2589971798c51aeD0C02c81a], value: 100000000000000000000 [1e20])
    │   └─ ← ()
    └─ ← ()

  [1600030] DscEngineTest::testRevertsIfTransferFromFails()
    ├─ [566640] → new MockFailedTransferFromErc20@0x2e234DAe75C793f67A35089C9d99245E1C58470b
    │   ├─ emit OwnershipTransferred(previousOwner: 0x0000000000000000000000000000000000000000, newOwner: DefaultSender: [0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38])
    │   └─ ← 2486 bytes of code
    ├─ [822851] → new DscEngine@0xF62849F9A0B5Bf2913b396098F7c7019b51A820a
    │   └─ ← 3658 bytes of code
    ├─ [46856] MockFailedTransferFromErc20::mint(USER: [0xF921F4FA82620d8D2589971798c51aeD0C02c81a], 10000000000000000000 [1e19])
    │   ├─ emit Transfer(from: 0x0000000000000000000000000000000000000000, to: USER: [0xF921F4FA82620d8D2589971798c51aeD0C02c81a], value: 10000000000000000000 [1e19])
    │   └─ ← ()
    ├─ [615] MockFailedTransferFromErc20::transferOwnership(DscEngine: [0xF62849F9A0B5Bf2913b396098F7c7019b51A820a])
    │   └─ ← OwnableUnauthorizedAccount(0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496)
    └─ ← OwnableUnauthorizedAccount(0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496)

Suite result: FAILED. 0 passed; 1 failed; 0 skipped; finished in 2.00ms (164.96µs CPU time)

Ran 1 test suite in 792.85ms (2.00ms CPU time): 0 tests passed, 1 failed, 0 skipped (1 total tests)

Failing tests:
Encountered 1 failing test in test/unit/DscEngineTest.t.sol:DscEngineTest
[FAIL. Reason: OwnableUnauthorizedAccount(0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496)] testRevertsIfTransferFromFails() (gas: 1600030)

Encountered a total of 1 failing tests, 0 tests succeeded
        vm.prank(owner);
        mockDsc.transferOwnership(address(mockDsce));
    function testRevertsIfTransferFromFails() public {
        // Arrange - Setup
        address owner = msg.sender;
        vm.prank(owner);
        MockFailedTransferFromErc20 mockDsc = new MockFailedTransferFromErc20();
        tokenAddresses = [address(mockDsc)];
        feedAddresses = [ethUsdPriceFeed];
        vm.prank(owner);
        DscEngine mockDsce = new DscEngine(tokenAddresses, feedAddresses, address(mockDsc));
        mockDsc.mint(USER, AMOUNT_COLLATERAL);

        vm.prank(owner);
        mockDsc.transferOwnership(address(mockDsce));
        // Arrange - User
        vm.startPrank(USER);
        ERC20Mock(address(mockDsc)).approve(address(mockDsce), AMOUNT_COLLATERAL);
        // Act / Assert
        vm.expectRevert(DscEngine.DscEngine_CollateralTransferFailed.selector);
        mockDsce.depositCollateral(address(mockDsc), AMOUNT_COLLATERAL);
        vm.stopPrank();
    }

testing solidity
1个回答
0
投票

为了转移所有权,您必须模拟实际所有者的调用。 (如果您不是所有者,那么将所有权转让给某人是没有意义的)

vm.prank(address) 使您能够从指定地址(在您的情况下为所有者)拨打下一个电话。

请记住,当您从 Foundry 调用进行测试时,您使用的地址是 address(this),而不是 msg.sender。

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