public void AddCoins(bool feeCoin = false, params ICoin[] coins)
 {
     Coins.AddRange(coins);
     if (feeCoin)
     {
         FeeCoins.AddRange(coins);
     }
 }
 public async Task <T> Build <T>(Func <Task <T> > buildAction)
 {
     try
     {
         return(await buildAction());
     }
     catch (Exception)
     {
         if (FeeCoins.Count > 0)
         {
             var queue = _pregeneratedOutputsQueueFactory.CreateFeeQueue();
             await queue.EnqueueOutputs(FeeCoins.OfType <Coin>().ToArray());
         }
         throw;
     }
 }
 public async Task <T> Build <T>(Func <Task <T> > buildAction)
 {
     try
     {
         return(await buildAction());
     }
     catch (Exception)
     {
         if (FeeCoins.Count > 0)
         {
             var queue = _pregeneratedOutputsQueueFactory.CreateFeeQueue();
             await queue.EnqueueOutputs(FeeCoins.OfType <Coin>().ToArray());
         }
         foreach (var extraAmount in _extraAmounts)
         {
             await _extraAmountRepository.Decrease(extraAmount);
         }
         throw;
     }
 }