code: func (w *Worker) AgentPreOfferingDelete(job *data.Job) error {
  	logger := w.logger.Add("method", "AgentPreOfferingDelete", "job", job)
  
  	offering, err := w.relatedOffering(logger,
  		job, data.JobAgentPreOfferingDelete)
  	if err != nil {
  		return err
  	}
  
  	if offering.Status != data.OfferRegistered &&
  		offering.Status != data.OfferPoppedUp {
  		return ErrOfferNotRegistered
  	}
  
  	jobDate, err := w.publishData(logger, job)
  	if err != nil {
  		return err
  	}
  
  	key, err := w.accountKey(logger, offering.Agent)
  	if err != nil {
  		return err
  	}
  
  	offeringHash, err := data.HexToHash(offering.Hash)
  	if err != nil {
  		logger.Error(err.Error())
  		return err
  	}
  
  	err = w.checkInPeriod(logger, offeringHash, data.SettingsPeriodRemove,
  		ErrOfferingDeletePeriodIsNotOver)
  	if err != nil {
  		return err
  	}
  
  	auth := bind.NewKeyedTransactor(key)
  	auth.GasLimit = w.gasConf.PSC.RemoveServiceOffering
  	auth.GasPrice = new(big.Int).SetUint64(jobDate.GasPrice)
  
  	tx, err := w.ethBack.PSCRemoveServiceOffering(auth, offeringHash)
  	if err != nil {
  		logger.Add("GasLimit", auth.GasLimit,
  			"GasPrice", auth.GasPrice).Error(err.Error())
  		return ErrPSCRemoveOffering
  	}
  
  	offering.Status = data.OfferRemoving
  	if err := w.saveRecord(logger, w.db.Querier,
  		offering); err != nil {
  		return err
  	}
  
  	return w.saveEthTX(logger, job, tx, "RemoveServiceOffering",
  		job.RelatedType, job.RelatedID, offering.Agent,
  		data.HexFromBytes(w.pscAddr.Bytes()))
  }
docs: // AgentPreOfferingDelete calls psc remove an offering.