proc/worker/client.go
func (w *Worker) ClientAfterUncooperativeCloseRequest(job *data.Job) error {
	logger := w.logger.Add("method", "ClientAfterUncooperativeCloseRequest",
		"job", job)

	ch, err := w.relatedChannel(logger, job,
		data.JobClientAfterUncooperativeCloseRequest)
	if err != nil {
		return err
	}

	ch.ChannelStatus = data.ChannelInChallenge
	if err = w.db.Update(ch); err != nil {
		logger.Error(err.Error())
		return ErrInternal
	}

	challengePeriod, err := data.ReadUintSetting(w.db.Querier,
		data.SettingsPeriodChallange)
	if err != nil {
		return err
	}

	return w.addJobWithDelay(logger, nil,
		data.JobClientPreUncooperativeClose, data.JobChannel,
		ch.ID, time.Duration(challengePeriod)*eth.BlockDuration)
}
func (w *Worker) ClientAfterUncooperativeCloseRequest(job *data.Job) error {
	logger := w.logger.Add("method", "ClientAfterUncooperativeCloseRequest",
		"job", job)

	ch, err := w.relatedChannel(logger, job,
		data.JobClientAfterUncooperativeCloseRequest)
	if err != nil {
		return err
	}

	ch.ChannelStatus = data.ChannelInChallenge
	if err = w.db.Update(ch); err != nil {
		logger.Error(err.Error())
		return ErrInternal
	}

	challengePeriod, err := data.ReadUintSetting(w.db.Querier,
		data.SettingsPeriodChallange)
	if err != nil {
		return err
	}

	return w.addJobWithDelay(logger, nil,
		data.JobClientPreUncooperativeClose, data.JobChannel,
		ch.ID, time.Duration(challengePeriod)*eth.BlockDuration)
}
// ClientAfterUncooperativeCloseRequest waits for the channel
// to uncooperative close, starts the service termination process.