为什么我不能使用这个转移以太币功能将以太币发送到智能合约?



我在Remix IDE中输入了这段代码,作为ReceivedEther.sol,一个独立的智能合约。

我已经使用MetaMask将0.02以太币转移到智能合约中。

当我检查智能合约的余额时,它会像预期的那样返回200000000000000000。

然而,如果我尝试使用transferEther函数,并输入一个小于这个数字的数字,比如0.005 ETH或500000000000000作为金额,那么使用MetaMask是不起作用的。

当MetaMask提示我时,它永远不会达到这个数量。这是0 ETH和0.00322天然气费(或任何天然气(。基本上,它总是将ETH的金额设置为0,并且只收取费用。

为什么我不能在带有MetaMask的Remix IDE中使用此功能转移一定数量的ETH?

pragma solidity ^0.8.0;

contract ReceivedEther {
function transferEther(address payable _recipient, uint _amount) external returns (bool) {
require(address(this).balance >= _amount, 'Not enough Ether in contract!');
_recipient.transfer(_amount);
return true;
}

/**
* @return contract balance
*/
function contractBalance() external view returns (uint) {
return address(this).balance;
}
}

您的代码将ETH(在_amount变量中声明(从智能合约发送到_recipient。因此,它不需要发送任何ETH来执行transferEther()功能。


如果您希望您的合同接受ETH,则接受它的函数(或一般的fallback()receive()函数(需要标记为payable

示例:

pragma solidity ^0.8.0;
contract ReceivedEther {
receive() external payable {} // note the `payable` keyword
// rest of your implementation
}

然后,您可以将任意数量的ETH发送到智能合约地址(无需指定任何要执行的功能(。

更多信息,请访问https://docs.soliditylang.org/en/v0.8.5/contracts.html#receive-醚函数


如果您想从Remix IDE在MetaMask中预先填充金额,您可以使用";值";在";部署&运行事务";选项卡