首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行可能引发的无效操作代码

执行可能引发的无效操作代码
EN

Ethereum用户
提问于 2020-11-05 07:20:48
回答 1查看 121关注 0票数 0

我不能调用settoken函数

处理TRUST.settoken错误: VM错误:无效操作码。执行可能已抛出的无效操作码。调试事务以获得更多信息。

代码语言:javascript
复制
pragma solidity ^0.6.0;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol";
import"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol";

contract TRUST is Ownable{
    using SafeMath for uint;
    uint public free; 
    

    mapping (address => mapping(address => data[])) public _data;
    mapping (address => address[]) public fromaddr ;

    struct data{
        uint64 startTime;
        uint64 intervals;
        uint256 onceamount;
        uint256 alltoken;
        address ercaddr;
    }
    
    
    
    function _FREE (uint _free)public onlyOwner{
        free = _free;
    }
    
   function tokennum(address _from, address _to, address _tokenaddress)private view returns(uint e, uint ee){
      if(_data[_from][_to].length != 0){
        for(uint8 i; i <= _data[_from][_to].length; i++){
           if (_data[_from][_to][i].ercaddr == _tokenaddress){
               e++;
               ee = i;
           }
        }
      }
   }
    
    function settoken (address token ,address to ,uint64 startTime ,uint64 intervals ,uint256 onceamount ,uint256 alltoken)public payable{
        require (msg.value == free ,"free err");
        require(IERC20(token).transferFrom(msg.sender ,address(this) ,alltoken),"etc");
        require (uint(to) *uint(token) *startTime *onceamount *alltoken != 0 ,"input");
        uint e;
        uint ee;
        (e,ee) = tokennum(msg.sender , to , token);
        require(_data[msg.sender][to][ee].alltoken == 0);
        if (ee == 0){
            _data[msg.sender][to].push(data(startTime ,intervals ,onceamount ,alltoken ,token));
        }else {
            _data[msg.sender][to][ee] = data(startTime ,intervals ,onceamount ,alltoken ,token);
        }
        IERC20(token).transferFrom(msg.sender ,address(this) ,alltoken);
    }
 
    
}
EN

回答 1

Ethereum用户

发布于 2020-11-05 07:51:00

改变这一点:

代码语言:javascript
复制
for (uint8 i; i <= _data[_from][_to].length; i++)

对此:

代码语言:javascript
复制
for (uint8 i; i < _data[_from][_to].length; i++)

否则,您将尝试在非法索引处访问数组_data[_from][_to]

代码语言:javascript
复制
if (_data[_from][_to][i].ercaddr == _tokenaddress) ...

附带注意:您可能希望在这里将uint8更改为uint256,以避免环绕。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/89927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档