code: func ReadTxSignAndBroadcast(txe *exec.TxExecution, err error, logger *logging.Logger) error {
  	// if there's an error just return.
  	if err != nil {
  		return err
  	}
  
  	// if there is nothing to unpack then just return.
  	if txe == nil {
  		return nil
  	}
  
  	// Unpack and display for the user.
  	height := fmt.Sprintf("%d", txe.Height)
  
  	if txe.Receipt.CreatesContract {
  		logger.InfoMsg("Tx Return",
  			"addr", txe.Receipt.ContractAddress.String(),
  			"Transaction Hash", hex.EncodeToString(txe.TxHash))
  	} else {
  		logger.InfoMsg("Tx Return",
  			"Transaction Hash", hex.EncodeToString(txe.TxHash),
  			"Block Height", height)
  
  		ret := txe.GetResult().GetReturn()
  		if len(ret) != 0 {
  			logger.InfoMsg("Return",
  				"Return Value", hex.EncodeUpperToString(ret),
  				"Exception", txe.Exception)
  		}
  	}
  
  	return nil
  }
docs: // This is a closer function which is called by most of the tx_run functions