Пример #1
0
    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));
            }
        }
    }
Пример #3
0
    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));
                }
            }
        }
    }