pragma solidity ^0.4.16;
contract createNewToken {
uint256 total_ether_to_send;
address private owner;
//constructor
function createNewToken() public{
owner = msg.sender;
}
// client request for tokens by sending ether.
function requestForToken() public payable{
address sender = msg.sender;
uint value = msg.value;
total_ether_to_send = value;
require(sender.balance >= total_ether_to_send);
owner.transfer(total_ether_to_send);
total_ether_to_send = value / 2;
require(owner.balance >= total_ether_to_send);
sender.transfer(total_ether_to_send);
}
}
我在Remix IDE中已经完整地编写了这段代码。合同成功创建,但是当我使用它时,它给了我一个错误,说"所需的气体超过限制:3000000。重要的气体估算也可能是合同代码中出现问题的迹象。请检查循环并确保您没有向非应付函数发送价值"。我没有写太多代码,但它仍然给了我这个错误。有人可以帮忙吗?
答案 0 :(得分:0)
首先,您的msg.value
已经发送到您的方法,因此您无需检查发件人余额:require(sender.balance >= total_ether_to_send);
。
第二次,您的合约中没有后备功能可以接收以太币。
第三次,您尝试向所有者发送100%msg.value
,然后将50%的msg.value
发送给发件人。显然,如果没有任何额外的资金,你不能花费150%的msg.value。以下是工作代码示例:
function requestForToken() public payable{
address sender = msg.sender;
uint value = msg.value;
total_ether_to_send = value / 2;
require(this.balance >= total_ether_to_send);
owner.transfer(total_ether_to_send);
require(this.balance >= total_ether_to_send);
sender.transfer(total_ether_to_send);
}
function() payable {}