Solidity 调用转账失败原因:EvmError: OutOfFund

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

我在智能合约的一个测试用例中遇到此错误:

 │   └─ ← ()
    ├─ [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);
    }
blockchain solidity smartcontracts
1个回答
0
投票
(bool success, ) = currentCarOwner.call{value: rentPrice}("");

这行代码要求调用其他合约时需要进行原生代币转账,

OutOfFund
表示你发送的原生代币不够。由于您的错误,您需要转移
10000000000000000000
。你可以查看一下你的合约余额,应该小于这个数字,所以报错。

修复方法:转账到合约,通过

payable
方法获取余额,或者添加
receive
功能支持接受原生代币转账,或者通过
value
参数附加一定数量的原生代币正在部署。

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