public InOutTransactionViewModel( IInOutTransaction tx, IDictionary <string, ITxOutput> indexedOutputs) { var currencyViewModel = CurrencyViewModelCreator.CreateViewModel(tx.Currency, false); var txInputs = tx.Inputs; var txOutputs = tx.Outputs; var ownInputs = txInputs .Where(i => indexedOutputs.ContainsKey($"{i.Hash}:{i.Index}")) .Select(i => indexedOutputs[$"{i.Hash}:{i.Index}"]) .ToList(); var ownOutputs = txOutputs .Where(o => indexedOutputs.ContainsKey($"{o.TxId}:{o.Index}")) .ToList(); Id = tx.Id; AmountFormat = currencyViewModel.CurrencyFormat; CurrencyCode = currencyViewModel.CurrencyCode; State = tx.IsConfirmed() ? TransactionState.Confirmed : TransactionState.Unconfirmed; Time = tx.BlockInfo.FirstSeen; Fee = tx.BlockInfo.Fees / (decimal)tx.Currency.DigitsMultiplier; if (ownInputs.Count == 0 && ownOutputs.Count > 0) // receive coins or swap refund or swap redeem { var receivedAmount = ownOutputs.Sum(o => o.Value) / (decimal)tx.Currency.DigitsMultiplier; if (txInputs.Length == 1) // try to resolve one input { // todo: try to resolve by swaps data firstly } Amount = receivedAmount; Type = TransactionType.Received; Description = $"Received {receivedAmount.ToString(CultureInfo.InvariantCulture)} {tx.Currency.Name}"; } if (ownInputs.Count > 0 && ownOutputs.Count >= 0) // send coins or swap payment { var usedAmount = ownInputs.Sum(i => i.Value) / (decimal)tx.Currency.DigitsMultiplier; var receivedAmount = ownOutputs.Sum(o => o.Value) / (decimal)tx.Currency.DigitsMultiplier; var sentAmount = receivedAmount - usedAmount; // todo: try to resolve by swaps data firstly Amount = sentAmount; Type = TransactionType.Sent; Description = $"Sent {Math.Abs(sentAmount).ToString(CultureInfo.InvariantCulture)} {tx.Currency.Name}"; } if (ownInputs.Count == 0 && ownOutputs.Count == 0) // unknown { Type = TransactionType.Unknown; Description = "Unknown transaction"; } }
// private void BackToConfirmation() // { // DialogViewer.Back(Dialogs.Convert); // to sending view // DialogViewer.Back(Dialogs.Convert); // to confirmation view // } private void DesignerMode() { var currencies = DesignTime.Currencies.ToList(); FromCurrency = currencies[0]; ToCurrency = currencies[1]; FromCurrencyViewModel = CurrencyViewModelCreator.CreateViewModel(FromCurrency, false); ToCurrencyViewModel = CurrencyViewModelCreator.CreateViewModel(ToCurrency, false); PriceFormat = $"F{FromCurrency.Digits}"; CurrencyCode = FromCurrencyViewModel.CurrencyCode; CurrencyFormat = FromCurrencyViewModel.CurrencyFormat; TargetCurrencyCode = ToCurrencyViewModel.CurrencyCode; TargetCurrencyFormat = ToCurrencyViewModel.CurrencyFormat; BaseCurrencyCode = FromCurrencyViewModel.BaseCurrencyCode; BaseCurrencyFormat = FromCurrencyViewModel.BaseCurrencyFormat; EstimatedPrice = 0.003m; Amount = 0.00001234m; AmountInBase = 10.23m; TargetAmount = Amount / EstimatedPrice; TargetAmountInBase = AmountInBase; EstimatedPaymentFee = 0.0001904m; EstimatedPaymentFeeInBase = 0.22m; EstimatedRedeemFee = 0.001m; EstimatedRedeemFeeInBase = 0.11m; }
public static SwapViewModel CreateSwapViewModel(Swap swap, ICurrencies currencies) { try { var soldCurrency = currencies.GetByName(swap.SoldCurrency); var purchasedCurrency = currencies.GetByName(swap.PurchasedCurrency); var fromCurrencyViewModel = CurrencyViewModelCreator.CreateViewModel( currencyConfig: soldCurrency, subscribeToUpdates: false); var toCurrencyViewModel = CurrencyViewModelCreator.CreateViewModel( currencyConfig: purchasedCurrency, subscribeToUpdates: false); var fromAmount = AmountHelper.QtyToAmount(swap.Side, swap.Qty, swap.Price, soldCurrency.DigitsMultiplier); var toAmount = AmountHelper.QtyToAmount(swap.Side.Opposite(), swap.Qty, swap.Price, purchasedCurrency.DigitsMultiplier); var quoteCurrency = swap.Symbol.QuoteCurrency() == swap.SoldCurrency ? soldCurrency : purchasedCurrency; return(new SwapViewModel { Id = swap.Id.ToString(), CompactState = CompactStateBySwap(swap), Mode = ModeBySwap(swap), Time = swap.TimeStamp, FromBrush = new SolidColorBrush(fromCurrencyViewModel.AmountColor), FromAmount = fromAmount, FromAmountFormat = fromCurrencyViewModel.CurrencyFormat, FromCurrencyCode = fromCurrencyViewModel.CurrencyCode, ToBrush = new SolidColorBrush(toCurrencyViewModel.AmountColor), ToAmount = toAmount, ToAmountFormat = toCurrencyViewModel.CurrencyFormat, ToCurrencyCode = toCurrencyViewModel.CurrencyCode, Price = swap.Price, PriceFormat = $"F{quoteCurrency.Digits}" }); } catch (Exception e) { Log.Error(e, $"Error while create SwapViewModel for {swap.Symbol} swap with id {swap.Id}"); return(null); } }
public AddressBasedTransactionViewModel( IAddressBasedTransaction tx) { var currencyViewModel = CurrencyViewModelCreator.CreateViewModel(tx.Currency, false); var amount = GetAmount(tx); var type = GetType(tx); string description; switch (type) { case TransactionType.Unknown: description = "Unknown transaction"; break; case TransactionType.Sent: description = $"Sent {amount.ToString(CultureInfo.InvariantCulture)} {tx.Currency.Name}"; break; case TransactionType.Received: description = $"Received {amount.ToString(CultureInfo.InvariantCulture)} {tx.Currency.Name}"; break; case TransactionType.Self: description = $"Self transfer {amount.ToString(CultureInfo.InvariantCulture)} {tx.Currency.Name}"; break; default: throw new ArgumentOutOfRangeException(); } Id = tx.Id; Amount = amount; AmountFormat = currencyViewModel.CurrencyFormat; CurrencyCode = currencyViewModel.CurrencyCode; Type = type; Description = description; State = tx.IsConfirmed() ? TransactionState.Confirmed : TransactionState.Unconfirmed; Time = tx.BlockInfo.FirstSeen; Fee = tx.BlockInfo.Fees; }
private void DesignerMode() { CurrencyViewModel = CurrencyViewModelCreator.CreateViewModel( currency: DesignTime.Currencies.Get <Bitcoin>(), subscribeToUpdates: false); }