我在智能合约的一个测试用例中遇到此错误:
│ └─ ← ()
├─ [2562] AutoChain::balanceOf(owner: [0x7c8999dC9a822c1f0Df42023113EDB4FDd543266]) [staticcall]
│ └─ ← 0
├─ [0] console::log(0) [staticcall]
│ └─ ← ()
├─ [0] VM::prank(user: [0x6CA6d1e2D5347Bfab1d91e883F1915560e09129D])
│ └─ ← ()
├─ [34790] AutoChainRental::rent(0)
│ ├─ [0] owner::fallback{value: 10000000000000000000}()
│ │ └─ ← EvmError: OutOfFund
│ ├─ emit RentTransferFailedDebug(currentCarOwner: owner: [0x7c8999dC9a822c1f0Df42023113EDB4FDd543266], rentPrice: 10000000000000000000 [1e19], sender: user: [0x6CA6d1e2D5347Bfab1d91e883F1915560e09129D], senderBalance: 15000000000000000000 [1.5e19])
│ └─ ← RentTransferFailed()
└─ ← RentTransferFailed()
Test result: FAILED. 0 passed; 1 failed; 0 skipped; finished in 4.67ms
这是我正在测试的功能,它负责向用户出租特定的代币。
function rent(uint256 _tokenId) external payable {
uint256 rentPrice = tokenIdToRentalDetails[_tokenId].price;
if (rentPrice == 0) revert NotForRent();
address currentCarOwner = _requireOwned(_tokenId);
(bool success, ) = currentCarOwner.call{value: rentPrice}("");
if (!success) {
emit RentTransferFailedDebug(
currentCarOwner,
rentPrice,
msg.sender,
msg.sender.balance
);
revert RentTransferFailed();
}
uint256 rewardAmount = (rewardPercentage * rentPrice) / 100;
// autoChainERC20.transferFrom(owner(), msg.sender, rewardAmount);
delete vehiclesForRent[_tokenId];
addressToRentedTokenIds[msg.sender].push(_tokenId);
emit CarRented(_tokenId, msg.sender, rentPrice, rewardAmount);
}
测试用例负责检查交易是否正确进行
function test_ShouldTransferRightAmount() public listVehicle {
uint256 rentPrice = autoChainRental.carRentalDetails(tokenIdMinted).price;
vm.deal(user, rentPrice+5e18); // additional for gas.
uint256 beforeOwnerBalance = owner.balance;
console.log(rentPrice, user.balance);
console.log(autoChainERC20.balanceOf(owner));
// vm.expectEmit();
// emit AutoChainRental.CarRented(tokenIdMinted, user, rentPrice, 1e19);
vm.prank(user);
autoChainRental.rent(tokenIdMinted);
uint256 expectedOwnerBalance = beforeOwnerBalance + rentPrice;
assertEq(owner.balance, expectedOwnerBalance);
}
(bool success, ) = currentCarOwner.call{value: rentPrice}("");
这行代码要求调用其他合约时需要进行原生代币转账,
OutOfFund
表示你发送的原生代币不够。由于您的错误,您需要转移10000000000000000000
。你可以查看一下你的合约余额,应该小于这个数字,所以报错。
修复方法:转账到合约,通过
payable
方法获取余额,或者添加receive
功能支持接受原生代币转账,或者通过value
参数附加一定数量的原生代币正在部署。