public async Task BroadcastTxAsync(Guid operationId, string xdrBase64) { try { var hash = await _horizonService.SubmitTransactionAsync(xdrBase64); var broadcast = new TxBroadcast { OperationId = operationId, State = TxBroadcastState.InProgress, Hash = hash }; await _broadcastRepository.InsertOrReplaceAsync(broadcast); var observation = new BroadcastObservation { OperationId = operationId }; await _observationRepository.InsertOrReplaceAsync(observation); } catch (Exception ex) { var broadcast = new TxBroadcast { OperationId = operationId, State = TxBroadcastState.Failed, Error = GetErrorMessage(ex), ErrorCode = GetErrorCode(ex) }; await _broadcastRepository.InsertOrReplaceAsync(broadcast); var be = new BusinessException($"Broadcasting transaction failed. operationId={operationId}, message={broadcast.Error}", ex); be.Data.Add("ErrorCode", broadcast.ErrorCode); throw be; } }
public async Task BroadcastTxAsync(Guid operationId, string xdrBase64) { long amount = 0; var xdr = Convert.FromBase64String(xdrBase64); var reader = new XdrDataInputStream(xdr); var txEnvelope = TransactionEnvelope.Decode(reader); if (!await ProcessDwToHwTransaction(operationId, txEnvelope.V1.Tx)) { var operation = _horizonService.GetFirstOperationFromTxEnvelope(txEnvelope); var operationType = operation.Discriminant.InnerValue; // ReSharper disable once SwitchStatementMissingSomeCases switch (operationType) { case OperationType.OperationTypeEnum.CREATE_ACCOUNT: { amount = operation.CreateAccountOp.StartingBalance.InnerValue; break; } case OperationType.OperationTypeEnum.PAYMENT: { amount = operation.PaymentOp.Amount.InnerValue; break; } case OperationType.OperationTypeEnum.ACCOUNT_MERGE: { // amount not yet known break; } default: throw new BusinessException($"Unsupported operation type. type={operationType}"); } string hash; try { hash = await _horizonService.SubmitTransactionAsync(xdrBase64); } catch (BadRequestHorizonApiException ex) { _log.Error(ex, message: "Broadcasting has failed!", context: new { OperationId = operationId }); throw new BusinessException($"Broadcasting transaction failed. operationId={operationId}, message={GetErrorMessage(ex)}", ex, GetErrorCode(ex).ToString()); } _chaos.Meow(nameof(BroadcastTxAsync)); var observation = new BroadcastObservation { OperationId = operationId }; await _observationRepository.InsertOrReplaceAsync(observation); _chaos.Meow(nameof(BroadcastTxAsync)); await _broadcastRepository.InsertOrReplaceAsync(new TxBroadcast { OperationId = operationId, State = TxBroadcastState.InProgress, Amount = amount, Hash = hash, CreatedAt = DateTime.UtcNow }); } }