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 }); } }