private async Task UpdateSwapBalanceAsync()
        {
            queryingNotify = "Querying balance ...";
            await InvokeAsync(() =>
            {
                StateHasChanged();
            });

            lyrReserveBalance = await SwapUtils.GetLyraBalanceAsync(Configuration["network"], swapOptions.CurrentValue.lyrPvk);

            tlyrReserveBalance = await SwapUtils.GetEthContractBalanceAsync(swapOptions.CurrentValue.ethUrl,
                                                                            swapOptions.CurrentValue.ethContract, swapOptions.CurrentValue.ethPub);

            //         var ethGas = await SwapUtils.EstimateEthTransferFeeAsync(swapOptions.CurrentValue.ethUrl,
            //                 swapOptions.CurrentValue.ethContract, swapOptions.CurrentValue.ethPub);

            //         ICoinGeckoClient _client;
            //         _client = CoinGeckoClient.Instance;
            //         const string vsCurrencies = "usd";
            //         var prices = await _client.SimpleClient.GetSimplePrice(new[] { "ethereum", "lyra" }, new[] { vsCurrencies });

            //ethGasFee = (decimal)((double)(ethGas / 10000000000) * prices["ethereum"]["usd"].GetValueOrDefault());
            //lyraPrice = (decimal) prices["lyra"]["usd"].Value;

            queryingNotify = "";
            await InvokeAsync(() =>
            {
                StateHasChanged();
            });
        }
        private async Task UpdateSwapFromBalanceAsync()
        {
            if (string.IsNullOrEmpty(_swapFromTokenName))
            {
                _swapFromTokenName = "LYR";
            }

            if (_swapFromTokenName == "LYR")
            {
                // get lyr balance
                fromTokenBalance = walletState.Value.wallet.BaseBalance;
            }
            else if (_swapFromTokenName == "TLYR")
            {
                fromTokenBalance = 0;
                fromTokenBalance = await SwapUtils.GetEthContractBalanceAsync(swapOptions.CurrentValue.ethUrl,
                                                                              swapOptions.CurrentValue.ethContract, SelectedAccount);
            }

            await InvokeAsync(() =>
            {
                StateHasChanged();
            });
        }
        private async Task BeginSwapTLYR(MouseEventArgs e)
        {
            IsDisabled        = true;
            swapResultMessage = "Checking for configurations...";
            await InvokeAsync(() =>
            {
                StateHasChanged();
            });

            // do check
            swapResultMessage = "";

            // check network id
            CurrentChainName = await metamaskService.GetChainName();

            if (Configuration["network"] == "testnet" && CurrentChainName != "Rinkeby Test Network")
            {
                swapResultMessage = "Only Rinkeby Test Network is supported for testnet.";
            }
            else if (Configuration["network"] == "mainnet" && CurrentChainName != "Ethereum Main Network")
            {
                swapResultMessage = "Only Ethereum Main Network is supported for mainnet.";
            }
            else if (!EthereumEnabled || !walletState.Value.IsOpening)
            {
                swapResultMessage = "Wallet(s) not opening or connected.";
            }
            else if (swapFromToken == swapToToken)
            {
                swapResultMessage = "No need to swap.";
            }
            else if (!((swapFromToken == "LYR" && swapToToken == "TLYR") || (swapFromToken == "TLYR" && swapToToken == "LYR")))
            {
                swapResultMessage = "Unknown token pair";
            }
            else if (swapFromCount < 10)
            {
                swapResultMessage = "Swap amount too small. (< 10)";
            }
            else if (swapFromCount > 1000000)
            {
                swapResultMessage = "Swap amount too large. (> 1M)";
            }
            else if (swapFromToken == "LYR" && swapFromCount > walletState.Value.wallet.BaseBalance)
            {
                swapResultMessage = "Not enough LYR in Lyra Wallet.";
            }
            else if (string.IsNullOrWhiteSpace(swapToAddress))
            {
                swapResultMessage = "Not valid swap to address.";
            }
            else if (swapToToken == "TLYR" && swapToCount > 0.8m * tlyrReserveBalance)
            {
                swapResultMessage = "Reserve account of TLYR is running low. Please contact support.";
            }
            else if (swapToToken == "LYR" && swapToCount > 0.8m * lyrReserveBalance)
            {
                swapResultMessage = "Reserve account of LYR is running low. Please contact support.";
            }
            else if (swapToCount < 1)
            {
                swapResultMessage = "Swap to amount too small.";
            }
            else if (swapFromToken == "TLYR")
            {
                try
                {
                    var tlyrBalance = await SwapUtils.GetEthContractBalanceAsync(swapOptions.CurrentValue.ethUrl,
                                                                                 swapOptions.CurrentValue.ethContract, SelectedAccount);

                    if (tlyrBalance < swapFromCount)
                    {
                        swapResultMessage = "Not enough TLYR in Ethereum Wallet.";
                    }
                }
                catch (Exception)
                {
                    swapResultMessage = "Unable to get TLYR balance.";
                }
            }

            if (!string.IsNullOrEmpty(swapResultMessage))
            {
                IsDisabled = false;
                await InvokeAsync(() =>
                {
                    StateHasChanged();
                });

                return;
            }

            var mmmsg = swapFromToken == "TLYR" ? "Please open Matamask and confirm transaction." : "";

            swapResultMessage         = $"Do swapping... {mmmsg} Please wait for a moment... ";
            walletState.Value.Message = "";
            await InvokeAsync(() =>
            {
                StateHasChanged();
            });

            var arg = new WebWalletBeginSwapTLYRAction
            {
                wallet = walletState.Value.wallet,

                fromToken   = swapFromToken,
                fromAddress = swapFromToken == "LYR" ? walletState.Value.wallet.AccountId : SelectedAccount,
                fromAmount  = swapFromCount,

                toToken   = swapToToken,
                toAddress = swapToAddress,
                toAmount  = swapToCount,

                gasPrice = EthGasPrice,
                gasLimit = EthGasLimit,

                options  = swapOptions.CurrentValue,
                metamask = metamaskInterceptor
            };

            logger.LogInformation($"TokenSwap: Begin  {arg.fromAmount} from {arg.fromAddress} to {arg.toAddress} amount {arg.toAmount}");
            Dispatcher.Dispatch(arg);
            IsDisabled = true;
        }