コード例 #1
0
        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
                });
            }
        }