function doSellerCancel(
        bytes32 _tradeId,
        DSToken _token,
        address _buyer,
        address _seller,
        uint256 _value,
        uint16 _fee,
        address _caller,
        uint128 _additionalGas
    ) private returns (bool) {
        Escrow memory escrow = getEscrow(_tradeId, _token, _buyer, _seller, _value, _fee);
        require(escrow.exists, "Escrow does not exists");

        if(block.timestamp < escrow.sellerCanCancelAfter){
            return false;
        }

        uint128 _gasFees = escrow.totalGasFeesSpentByRelayer;
        if(_caller == relayer){
            if(_token == ETH_TOKEN_ADDRESS){
                _gasFees += (GAS_doSellerCancel + _additionalGas) * uint128(tx.gasprice);
            }else{
                uint256 relayGas = (GAS_doSellerCancel + _additionalGas) * tx.gasprice;
                _gasFees += uint128(getTokenAmount(_token, relayGas));
            }
        }else{
            require(_caller == _seller, "Must be buyer");
        }
        
        escrowData.removeEscrow(escrow.tradeHash);
        emit CancelledBySeller(_buyer, _seller, escrow.tradeHash, _token);
        transferMinusFees(_token, _seller, _value, _gasFees, 0);
        return true;
    }