code: func buildTxData(txe *exec.TxExecution) (types.EventDataRow, error) {
  	// transaction raw data
  	envelope, err := json.Marshal(txe.Envelope)
  	if err != nil {
  		return types.EventDataRow{}, fmt.Errorf("couldn't marshal envelope in tx %v", txe)
  	}
  
  	events, err := json.Marshal(txe.Events)
  	if err != nil {
  		return types.EventDataRow{}, fmt.Errorf("couldn't marshal events in tx %v", txe)
  	}
  
  	result, err := json.Marshal(txe.Result)
  	if err != nil {
  		return types.EventDataRow{}, fmt.Errorf("couldn't marshal result in tx %v", txe)
  	}
  
  	receipt, err := json.Marshal(txe.Receipt)
  	if err != nil {
  		return types.EventDataRow{}, fmt.Errorf("couldn't marshal receipt in tx %v", txe)
  	}
  
  	exception, err := json.Marshal(txe.Exception)
  	if err != nil {
  		return types.EventDataRow{}, fmt.Errorf("couldn't marshal exception in tx %v", txe)
  	}
  	return types.EventDataRow{
  		Action: types.ActionUpsert,
  		RowData: map[string]interface{}{
  			types.SQLColumnLabelHeight:    txe.Height,
  			types.SQLColumnLabelTxHash:    txe.TxHash.String(),
  			types.SQLColumnLabelIndex:     txe.Index,
  			types.SQLColumnLabelTxType:    txe.TxType.String(),
  			types.SQLColumnLabelEnvelope:  string(envelope),
  			types.SQLColumnLabelEvents:    string(events),
  			types.SQLColumnLabelResult:    string(result),
  			types.SQLColumnLabelReceipt:   string(receipt),
  			types.SQLColumnLabelException: string(exception),
  		},
  	}, nil
  }
docs: // buildTxData builds transaction data from tx stream