function duel(address opp) public returns (uint, uint) {
        require(block.number >= blockDuelBegin);
        require(block.number >= fatigueBlock + player[msg.sender].lastDuel);
        require(block.number >= safeBlock + player[opp].lastJoin);
        require(!isContract(msg.sender));

        player[msg.sender].lastDuel = block.number;
        
        uint ethPlayer = player[msg.sender].wad;
        uint ethOpp = player[opp].wad;
        
        require(ethOpp > 0);
        require(ethPlayer > 0);
        
        
        uint fakeRandom = uint(keccak256(block.blockhash(block.number-1), opp, divAmt, block.timestamp));
        
        bool isWin = (fakeRandom % (ethPlayer.add(ethOpp))) < ethPlayer;
        
        
        address winner = msg.sender;
        address loser = opp;
        uint amt = ethOpp;
        if (!isWin) {
            winner = opp;
            loser = msg.sender;
            amt = ethPlayer;
        }

        uint cut = amt.mul(divCut) / 1000;
        uint realAmt = amt.sub(cut);
        divAmt = divAmt.add(cut);
        
        player[winner].wad = player[winner].wad.add(realAmt);    
        player[loser].wad = 0;
        
        
        playerList[player[loser].listPosition] = playerList[playerList.length - 1];
        player[playerList[playerList.length - 1]].listPosition = player[loser].listPosition;
        playerList.length--;
        
        DUEL(msg.sender, opp, isWin, amt);
    }