public static async IAsyncEnumerable <ChangeAvoidanceSuggestionViewModel> GenerateSuggestionsAsync( TransactionInfo transactionInfo, BitcoinAddress destination, Wallet wallet, [EnumeratorCancellation] CancellationToken cancellationToken) { Task <ChangeAvoidanceSuggestionViewModel?> bnbSuggestionTask = Task.Run(() => { if (ChangelessTransactionCoinSelector.TryGetCoins(transactionInfo.Coins, transactionInfo.FeeRate, new TxOut(transactionInfo.Amount, destination), out IEnumerable <SmartCoin>?selection, cancellationToken)) { BuildTransactionResult transaction = TransactionHelpers.BuildChangelessTransaction( wallet, destination, transactionInfo.UserLabels, transactionInfo.FeeRate, selection, tryToSign: false); return(new ChangeAvoidanceSuggestionViewModel( transactionInfo.Amount.ToDecimal(MoneyUnit.BTC), transaction, wallet.Synchronizer.UsdExchangeRate, isOriginal: false)); } return(null); }); ChangeAvoidanceSuggestionViewModel?bnbSuggestion = await bnbSuggestionTask; if (bnbSuggestion is not null) { yield return(bnbSuggestion); } }
public static async IAsyncEnumerable <ChangeAvoidanceSuggestionViewModel> GenerateSuggestionsAsync( TransactionInfo transactionInfo, BitcoinAddress destination, Wallet wallet, [EnumeratorCancellation] CancellationToken cancellationToken) { var selections = ChangelessTransactionCoinSelector.GetAllStrategyResultsAsync( transactionInfo.Coins, transactionInfo.FeeRate, new TxOut(transactionInfo.Amount, destination), cancellationToken).ConfigureAwait(false); await foreach (var selection in selections) { if (selection.Any()) { BuildTransactionResult transaction = TransactionHelpers.BuildChangelessTransaction( wallet, destination, transactionInfo.UserLabels, transactionInfo.FeeRate, selection, tryToSign: false); yield return(new ChangeAvoidanceSuggestionViewModel( transactionInfo.Amount.ToDecimal(MoneyUnit.BTC), transaction, wallet.Synchronizer.UsdExchangeRate)); } } }
public static async IAsyncEnumerable <ChangeAvoidanceSuggestionViewModel> GenerateSuggestionsAsync( TransactionInfo transactionInfo, BitcoinAddress destination, Wallet wallet, ImmutableArray <SmartCoin> coinsToUse, int maxInputCount, decimal usdExchangeRate, [EnumeratorCancellation] CancellationToken cancellationToken) { var selections = ChangelessTransactionCoinSelector.GetAllStrategyResultsAsync( coinsToUse, transactionInfo.FeeRate, new TxOut(transactionInfo.Amount, destination), maxInputCount, cancellationToken).ConfigureAwait(false); HashSet <Money> foundSolutionsByAmount = new(); await foreach (var selection in selections) { if (selection.Any()) { BuildTransactionResult transaction = TransactionHelpers.BuildChangelessTransaction( wallet, destination, transactionInfo.UserLabels, transactionInfo.FeeRate, selection, tryToSign: false); var destinationAmount = transaction.CalculateDestinationAmount(); // If BnB solutions become the same transaction somehow, do not show the same suggestion twice. if (!foundSolutionsByAmount.Contains(destinationAmount)) { foundSolutionsByAmount.Add(destinationAmount); yield return(new ChangeAvoidanceSuggestionViewModel( transactionInfo.Amount.ToDecimal(MoneyUnit.BTC), transaction, usdExchangeRate)); } } } }