Solidity

Remix 中的氣體估算失敗

  • January 13, 2022

不能像寫的那樣真正使用傳遞函式。它假定所有者使用它。所以為水龍頭使用的“鑄幣”功能做了一個新的功能。不知道為什麼編譯器消息如此神秘。

totalSupply_ = totalSupply_.add(_amount);
balances[_to] = balances[_to].add(_amount);
emit Mint(_to, _amount);
emit Transfer(address(0), _to, _amount);

嘗試為我的 ERC-20 代幣創建水龍頭,並在執行我的dripToken函式時得到“氣體估計失敗”,如下所示(更新):

function dripToken() public {
 require(faucetStatus);
 if(!checkStatus(msg.sender)) revert();
 tokenInstance.updateSupply(oneToken);
 updateStatus(msg.sender, oneMinute);
 tokenInstance.transfer(msg.sender, oneToken);
}

我已將其範圍縮小到導致錯誤的轉移呼叫行。我現在部署我的 ERC-20 代幣並通過以下方式將其傳遞到水龍頭合約中:

constructor(string _fname, address _tokenInstance) public {
 tokenInstance = MyToken(_tokenInstance);
 faucetName = _fname;
 faucetStatus = true;

 emit FaucetOn(faucetStatus);
}

我的令牌轉移函式來自https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC20/StandardToken.sol 我剛剛注意到我收到關於轉移函式的編譯器警告,提示問題,但我不明白為什麼(還)。這是警告:

函式 StandardToken.transfer(address,uint256) 的 gas 需求 high:無限。如果一個函式的gas需求高於block gas limit,它就不能被執行。請避免在修改大面積儲存的函式或操作中出現循環(這包括清除或複制儲存中的數組)

function transfer(address _to, uint256 _value) public returns (bool) {
 require(_value <= balances[msg.sender]);
 require(_to != address(0));

 balances[msg.sender] = balances[msg.sender].sub(_value);
 balances[_to] = balances[_to].add(_value);
 emit Transfer(msg.sender, _to, _value);
 return true;
}

我通過以下方式創建我的令牌。我現在用少量供應初始化它。

contract MyToken is StandardToken {
 string public name;                   
 uint8 public decimals;                
 string public symbol;  

 constructor() public {  
   StandardToken.balances[msg.sender] = 1000000000000000000;
   StandardToken.totalSupply_ = 1000000000000000000;                        
   name = "My Token";                             
   decimals = 18; 
   symbol = "MY";      
 }
}

在Google驅動器上發布我的程式碼: https ://drive.google.com/open?id=1EvKEVhD8bR2oKS2W1XNRQpTqVbieUcmC

您必須指定呼叫轉移的地址。例如,如果您嘗試轉移 ERC20 代幣,程式碼如下:

ERC20TokenAddress.transfer(msg.sender, oneToken);

沒有前導地址,EVM 不知道正在傳輸什麼。

請參閱 OP 頂部的答案。我認為這是失敗的要求塊。不知道為什麼編譯器對此如此神秘。

引用自:https://ethereum.stackexchange.com/questions/56784