我正在关注 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();
}
为了转移所有权,您必须模拟实际所有者的调用。 (如果您不是所有者,那么将所有权转让给某人是没有意义的)
vm.prank(address) 使您能够从指定地址(在您的情况下为所有者)拨打下一个电话。
请记住,当您从 Foundry 调用进行测试时,您使用的地址是 address(this),而不是 msg.sender。