function transfer(address _to, uint256 _tokenId) requireDataContract isActive external {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        
        require(obj.monsterId == uint64(_tokenId));
        require(obj.trainer == msg.sender);
        require(msg.sender != _to);
        require(_to != address(0));
        
        
        EtheremonBattle battle = EtheremonBattle(battleContract);
        EtheremonTradeInterface trade = EtheremonTradeInterface(tradeContract);
        if (battle.isOnBattle(obj.monsterId) || trade.isOnTrading(obj.monsterId))
            revert();
        
        
        allowed[obj.trainer][_tokenId] = address(0);
        
        
        data.removeMonsterIdMapping(obj.trainer, obj.monsterId);
        data.addMonsterIdMapping(msg.sender, obj.monsterId);
        
        Transfer(obj.trainer, _to, _tokenId);
    }