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