Skip to content
This repository has been archived by the owner on Apr 12, 2022. It is now read-only.

Commit

Permalink
FA12/FA2 tokens UI changes
Browse files Browse the repository at this point in the history
  • Loading branch information
matsakiv committed Aug 13, 2021
1 parent 41ab002 commit fb5675c
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 103 deletions.
15 changes: 6 additions & 9 deletions Atomex.Client.Wpf/ViewModels/SendConfirmationViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public class SendConfirmationViewModel : BaseViewModel
public string FeeCurrencyFormat { get; set; }
public string TokenContract { get; set; }
public decimal TokenId { get; set; }
public string TokenType { get; set; }

private ICommand _backCommand;
public ICommand BackCommand => _backCommand ??= new Command(() =>
Expand All @@ -63,8 +64,6 @@ public SendConfirmationViewModel(IDialogViewer dialogViewer, int dialogId)

private async void Send()
{


try
{
_dialogViewer.PushPage(_dialogId, Pages.Sending);
Expand All @@ -73,14 +72,12 @@ private async void Send()

if (From != null && TokenContract != null) // tezos token sending
{
var tezosAccount = App.AtomexApp.Account
.GetCurrencyAccount<TezosAccount>(TezosConfig.Xtz);

var tokenAddress = await TezosTokensSendViewModel.GetTokenAddressAsync(
App.AtomexApp.Account,
From,
TokenContract,
TokenId);
account: App.AtomexApp.Account,
address: From,
tokenContract: TokenContract,
tokenId: TokenId,
tokenType: TokenType);

if (tokenAddress.Currency == "FA12")
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,13 @@

using Atomex.Client.Wpf.Common;
using Atomex.Client.Wpf.Controls;
using Atomex.Client.Wpf.ViewModels.WalletViewModels;
using Atomex.Client.Wpf.Properties;
using Atomex.Core;
using Atomex.Common;
using Atomex.MarketData.Abstract;
using Atomex.TezosTokens;
using Atomex.Wallet.Tezos;
using Atomex.Wallet.Abstract;
using Atomex.TezosTokens;

namespace Atomex.Client.Wpf.ViewModels.SendViewModels
{
Expand All @@ -29,9 +28,6 @@ public class TezosTokensSendViewModel : BaseViewModel
private readonly IAtomexApp _app;
private readonly IDialogViewer _dialogViewer;

public ObservableCollection<TezosTokenViewModel> Tokens { get; set; }
public TezosTokenViewModel Token { get; set; }

private ObservableCollection<WalletAddressViewModel> _fromAddresses;
public ObservableCollection<WalletAddressViewModel> FromAddresses
{
Expand Down Expand Up @@ -70,13 +66,6 @@ public string TokenContract
{
_tokenContract = value;
OnPropertyChanged(nameof(TokenContract));

Warning = string.Empty;
Amount = _amount;
Fee = _fee;

UpdateFromAddressList(_from, _tokenContract, _tokenId);
UpdateCurrencyCode();
}
}

Expand All @@ -88,16 +77,13 @@ public decimal TokenId
{
_tokenId = value;
OnPropertyChanged(nameof(TokenId));

Warning = string.Empty;
Amount = _amount;
Fee = _fee;

UpdateFromAddressList(_from, _tokenContract, _tokenId);
UpdateCurrencyCode();
}
}

private readonly string _tokenType;

public bool IsFa2 => _tokenType == "FA2";

protected string _to;
public virtual string To
{
Expand Down Expand Up @@ -240,9 +226,10 @@ public TezosTokensSendViewModel()
public TezosTokensSendViewModel(
IAtomexApp app,
IDialogViewer dialogViewer,
string from = null,
string tokenContract = null,
decimal tokenId = 0)
string tokenContract,
decimal tokenId,
string tokenType,
string from = null)
{
_app = app ?? throw new ArgumentNullException(nameof(app));
_dialogViewer = dialogViewer ?? throw new ArgumentNullException(nameof(dialogViewer));
Expand All @@ -261,6 +248,7 @@ public TezosTokensSendViewModel(

_tokenContract = tokenContract;
_tokenId = tokenId;
_tokenType = tokenType;

UpdateFromAddressList(from, tokenContract, tokenId);
UpdateCurrencyCode();
Expand Down Expand Up @@ -294,31 +282,31 @@ protected async virtual void OnNextCommand()
.Currencies
.Get<TezosConfig>(TezosConfig.Xtz);

if (string.IsNullOrEmpty(To))
if (string.IsNullOrEmpty(_to))
{
Warning = Resources.SvEmptyAddressError;
return;
}

if (!tezosConfig.IsValidAddress(To))
if (!tezosConfig.IsValidAddress(_to))
{
Warning = Resources.SvInvalidAddressError;
return;
}

if (Amount <= 0)
if (_amount <= 0)
{
Warning = Resources.SvAmountLessThanZeroError;
return;
}

if (Fee <= 0)
if (_fee <= 0)
{
Warning = Resources.SvCommissionLessThanZeroError;
return;
}

if (TokenContract == null || From == null)
if (_tokenContract == null || _from == null)
{
Warning = "Invalid 'From' address or token contract address!";
return;
Expand All @@ -330,11 +318,16 @@ protected async virtual void OnNextCommand()
return;
}

var fromTokenAddress = await GetTokenAddressAsync(_app.Account, From, TokenContract, TokenId);
var fromTokenAddress = await GetTokenAddressAsync(
account: _app.Account,
address: _from,
tokenContract: _tokenContract,
tokenId: _tokenId,
tokenType: _tokenType);

if (fromTokenAddress == null)
{
Warning = $"Insufficient token funds on address {From}! Please update your balance!";
Warning = $"Insufficient token funds on address {_from}! Please update your balance!";
return;
}

Expand All @@ -345,11 +338,11 @@ protected async virtual void OnNextCommand()
}

var xtzAddress = await _app.Account
.GetAddressAsync(TezosConfig.Xtz, From);
.GetAddressAsync(TezosConfig.Xtz, _from);

if (xtzAddress == null)
{
Warning = $"Insufficient funds for fee. Please update your balance for address {From}!";
Warning = $"Insufficient funds for fee. Please update your balance for address {_from}!";
return;
}

Expand All @@ -362,23 +355,24 @@ protected async virtual void OnNextCommand()
var confirmationViewModel = new SendConfirmationViewModel(_dialogViewer, Dialogs.Send)
{
Currency = tezosConfig,
From = From,
To = To,
Amount = Amount,
AmountInBase = AmountInBase,
BaseCurrencyCode = BaseCurrencyCode,
BaseCurrencyFormat = BaseCurrencyFormat,
Fee = Fee,
UseDeafultFee = UseDefaultFee,
FeeInBase = FeeInBase,
CurrencyCode = CurrencyCode,
From = _from,
To = _to,
Amount = _amount,
AmountInBase = _amountInBase,
BaseCurrencyCode = _baseCurrencyCode,
BaseCurrencyFormat = _baseCurrencyFormat,
Fee = _fee,
UseDeafultFee = _useDefaultFee,
FeeInBase = _feeInBase,
CurrencyCode = _currencyCode,
CurrencyFormat = CurrencyFormat,

FeeCurrencyCode = FeeCurrencyCode,
FeeCurrencyCode = _feeCurrencyCode,
FeeCurrencyFormat = FeeCurrencyFormat,

TokenContract = TokenContract,
TokenId = TokenId
TokenContract = _tokenContract,
TokenId = _tokenId,
TokenType = _tokenType
};

_dialogViewer.PushPage(Dialogs.Send, Pages.SendConfirmation, confirmationViewModel);
Expand Down Expand Up @@ -413,7 +407,12 @@ protected virtual async void UpdateAmount(decimal amount)
return;
}

var fromTokenAddress = await GetTokenAddressAsync(_app.Account, From, TokenContract, TokenId);
var fromTokenAddress = await GetTokenAddressAsync(
account: _app.Account,
address: _from,
tokenContract: _tokenContract,
tokenId: _tokenId,
tokenType: _tokenType);

if (fromTokenAddress == null)
{
Expand Down Expand Up @@ -462,7 +461,12 @@ protected virtual async void UpdateFee(decimal fee)

if (UseDefaultFee)
{
var fromTokenAddress = await GetTokenAddressAsync(_app.Account, From, TokenContract, TokenId);
var fromTokenAddress = await GetTokenAddressAsync(
account: _app.Account,
address: _from,
tokenContract: _tokenContract,
tokenId: _tokenId,
tokenType: _tokenType);

if (fromTokenAddress == null)
{
Expand Down Expand Up @@ -546,7 +550,12 @@ protected virtual async void OnMaxClick()
return;
}

var fromTokenAddress = await GetTokenAddressAsync(_app.Account, From, TokenContract, TokenId);
var fromTokenAddress = await GetTokenAddressAsync(
account: _app.Account,
address: _from,
tokenContract: _tokenContract,
tokenId: _tokenId,
tokenType: _tokenType);

if (fromTokenAddress == null)
{
Expand Down Expand Up @@ -586,23 +595,15 @@ public static async Task<WalletAddress> GetTokenAddressAsync(
IAccount account,
string address,
string tokenContract,
decimal tokenId)
decimal tokenId,
string tokenType)
{
var tezosAccount = account
.GetCurrencyAccount<TezosAccount>(TezosConfig.Xtz);

var fa12Address = await tezosAccount
.DataRepository
.GetTezosTokenAddressAsync("FA12", tokenContract, tokenId, address);

if (fa12Address != null)
return fa12Address;

var fa2Address = await tezosAccount
return await tezosAccount
.DataRepository
.GetTezosTokenAddressAsync("FA2", tokenContract, tokenId, address);

return fa2Address;
.GetTezosTokenAddressAsync(tokenType, tokenContract, tokenId, address);
}

private void UpdateFromAddressList(string from, string tokenContract, decimal tokenId)
Expand Down Expand Up @@ -630,7 +631,12 @@ private async void UpdateCurrencyCode()
if (TokenContract == null || From == null)
return;

var tokenAddress = await GetTokenAddressAsync(_app.Account, From, TokenContract, TokenId);
var tokenAddress = await GetTokenAddressAsync(
account: _app.Account,
address: _from,
tokenContract: _tokenContract,
tokenId: _tokenId,
tokenType: _tokenType);

if (tokenAddress?.TokenBalance?.Symbol != null)
{
Expand All @@ -650,6 +656,9 @@ private async void UpdateCurrencyCode()

private IEnumerable<WalletAddressViewModel> GetFromAddressList(string tokenContract, decimal tokenId)
{
if (tokenContract == null)
return Enumerable.Empty<WalletAddressViewModel>();

var tezosConfig = _app.Account
.Currencies
.Get<TezosConfig>(TezosConfig.Xtz);
Expand All @@ -658,35 +667,32 @@ private IEnumerable<WalletAddressViewModel> GetFromAddressList(string tokenContr
.GetCurrencyAccount<TezosAccount>(TezosConfig.Xtz);

var tezosAddresses = tezosAccount
.GetAddressesAsync()
.WaitForResult();
.GetUnspentAddressesAsync()
.WaitForResult()
.ToDictionary(w => w.Address, w => w);

var tokenAddresses = tokenContract != null
? tezosAccount.DataRepository
.GetTezosTokenAddressesByContractAsync(tokenContract)
.WaitForResult()
: new List<WalletAddress>();
var tokenAddresses = tezosAccount.DataRepository
.GetTezosTokenAddressesByContractAsync(tokenContract)
.WaitForResult();

return tezosAddresses
.Concat(tokenAddresses)
.GroupBy(w => w.Address)
.Select(g =>
return tokenAddresses
.Where(w => w.Balance != 0)
.Select(w =>
{
// main address
var address = g.FirstOrDefault(w => w.Currency == tezosConfig.Name);
var tokenAddress = g.FirstOrDefault(w => w.Currency != tezosConfig.Name && w.TokenBalance?.TokenId == TokenId);
var tokenBalance = tokenAddress?.Balance ?? 0m;
var tokenBalance = w.Balance;
var showTokenBalance = tokenBalance != 0;
var tokenCode = tokenAddress?.TokenBalance?.Symbol ?? "TOKENS";
var tokenCode = w.TokenBalance?.Symbol ?? "TOKENS";
var tezosBalance = tezosAddresses.TryGetValue(w.Address, out var tezosAddress)
? tezosAddress.AvailableBalance()
: 0m;
return new WalletAddressViewModel
{
Address = g.Key,
AvailableBalance = address?.AvailableBalance() ?? 0m,
Address = w.Address,
AvailableBalance = tezosBalance,
CurrencyFormat = tezosConfig.Format,
CurrencyCode = tezosConfig.Name,
IsFreeAddress = false,
Expand Down
Loading

0 comments on commit fb5675c

Please sign in to comment.