我在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中预先填充金额,您可以使用";值";在";部署&运行事务";选项卡