public Task AddTransactionFeeReserve(Guid transactionId, List <ICoin> feeCoins) { var message = new FeeReserveMonitoringMessage { PutDateTime = DateTime.UtcNow, TransactionId = transactionId, FeeCoins = feeCoins.OfType <Coin>().Select(x => new SerializableCoin(x)).ToList() }; return(_queue.PutRawMessageAsync(message.ToJson())); }
public async Task Monitor(FeeReserveMonitoringMessage message, QueueTriggeringContext context) { if (await _broadcastedTransactionBlob.IsBroadcasted(message.TransactionId)) { return; } if (DateTime.UtcNow - message.PutDateTime > TimeSpan.FromSeconds(_settings.FeeReservePeriodSeconds)) { await _logger.WriteInfoAsync("FeeReserveMonitoringFunction", "Monitor", message.ToJson(), "Free reserved fee"); await _transactionSignRequestRepository.InvalidateTransactionId(message.TransactionId); await Task.Delay(3000); if (await _broadcastedTransactionBlob.IsBroadcasted(message.TransactionId)) { return; } var transaction = await _transactionBlobStorage.GetTransaction(message.TransactionId, TransactionBlobType.Initial); var tr = new Transaction(transaction); await _spentOutputService.RemoveSpentOutputs(tr); var queue = _pregeneratedOutputsQueueFactory.CreateFeeQueue(); await queue.EnqueueOutputs(message.FeeCoins.Select(x => x.ToCoin()).ToArray()); } else { context.MoveMessageToEnd(); context.SetCountQueueBasedDelay(5000, 100); } }