private static void Main()
        {
            CultureInfo.DefaultThreadCurrentCulture   = GlobalCultureInfo;
            CultureInfo.DefaultThreadCurrentUICulture = GlobalCultureInfo;
            Thread.CurrentThread.Name = Path.GetFileName(Environment.GetCommandLineArgs()[0]);
            ServicePointManager.DefaultConnectionLimit = 65535;


            ThreadPool.SetMinThreads(65535, 100);
            ThreadPool.SetMaxThreads(65535, 100);


#if DEBUG
            Log.InitializeLog(); // Initialization of log system.
            Log.AutoWriteLog();  // Start the automatic write of log lines.
#endif
            AppDomain.CurrentDomain.UnhandledException += Application_ThreadException;

            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

#if WINDOWS
            ClassMemory.CleanMemory();
#endif

            ClassTranslation.InitializationLanguage(); // Initialization of language system.
            ClassContact.InitializationContactList();  // Initialization of contact system.
            ClassPeerList.LoadPeerList();
#if WINDOWS
            Application.EnableVisualStyles();
#endif
            Application.SetCompatibleTextRenderingDefault(false);
            WalletXiropht = new WalletXiropht();
            Application.Run(WalletXiropht); // Start the main interface.
        }
        /// <summary>
        ///     Add transaction to the list.
        /// </summary>
        /// <param name="transaction"></param>
        /// <param name="node"></param>
        public static async Task AddWalletTransactionAsync(string transaction, string node)
        {
#if DEBUG
            Log.WriteLine("Wallet transaction history received: " + transaction
                          .Replace(
                              ClassRemoteNodeCommandForWallet.RemoteNodeRecvPacketEnumeration
                              .WalletTransactionPerId, ""));
#endif
            bool errorSyncTransaction = false;

            if (!OnLoad)
            {
                var splitTransaction = transaction
                                       .Replace(ClassRemoteNodeCommandForWallet.RemoteNodeRecvPacketEnumeration.WalletTransactionPerId,
                                                string.Empty).Split(new[] { "#" }, StringSplitOptions.None);
                var hashTransaction = splitTransaction[4]; // Transaction Hash.
                if (!ListTransaction.ContainsKey(hashTransaction))
                {
                    var type              = splitTransaction[0];
                    var timestamp         = splitTransaction[3]; // Timestamp Send CEST.
                    var realFeeAmountSend = splitTransaction[7]; // Real fee and amount crypted for sender.
                    var realFeeAmountRecv = splitTransaction[8]; // Real fee and amount crypted for sender.

                    var amountAndFeeDecrypted = ClassAlgoErrorEnumeration.AlgoError;
                    if (type == "SEND")
                    {
                        amountAndFeeDecrypted = ClassAlgo.GetDecryptedResultManual(ClassAlgoEnumeration.Rijndael,
                                                                                   realFeeAmountSend,
                                                                                   Program.WalletXiropht.ClassWalletObject.WalletConnect.WalletAddress +
                                                                                   Program.WalletXiropht.ClassWalletObject.WalletConnect.WalletKey,
                                                                                   ClassWalletNetworkSetting.KeySize); // AES
                    }
                    else if (type == "RECV")
                    {
                        amountAndFeeDecrypted = ClassAlgo.GetDecryptedResultManual(ClassAlgoEnumeration.Rijndael,
                                                                                   realFeeAmountRecv,
                                                                                   Program.WalletXiropht.ClassWalletObject.WalletConnect.WalletAddress +
                                                                                   Program.WalletXiropht.ClassWalletObject.WalletConnect.WalletKey,
                                                                                   ClassWalletNetworkSetting.KeySize); // AES
                    }
                    if (amountAndFeeDecrypted != ClassAlgoErrorEnumeration.AlgoError)
                    {
                        var splitDecryptedAmountAndFee =
                            amountAndFeeDecrypted.Split(new[] { "-" }, StringSplitOptions.None);
                        var amountDecrypted = splitDecryptedAmountAndFee[0];
                        var feeDecrypted    = splitDecryptedAmountAndFee[1];
                        var walletDstOrSrc  = splitDecryptedAmountAndFee[2];


                        var timestampRecv    = splitTransaction[5]; // Timestamp Recv CEST.
                        var blockchainHeight = splitTransaction[6]; // Blockchain height.

                        var finalTransaction = type + "#" + hashTransaction + "#" + walletDstOrSrc + "#" +
                                               amountDecrypted + "#" + feeDecrypted + "#" + timestamp + "#" +
                                               timestampRecv + "#" + blockchainHeight;

                        var finalTransactionEncrypted = ClassAlgo.GetEncryptedResultManual(
                            ClassAlgoEnumeration.Rijndael, finalTransaction,
                            Program.WalletXiropht.ClassWalletObject.WalletConnect.WalletAddress +
                            Program.WalletXiropht.ClassWalletObject.WalletConnect.WalletKey,
                            ClassWalletNetworkSetting.KeySize);                               // AES

                        if (finalTransactionEncrypted == ClassAlgoErrorEnumeration.AlgoError) // Ban bad remote node.
                        {
                            errorSyncTransaction = true;
                        }
                        else
                        {
                            var splitBlockchainHeight = blockchainHeight.Split(new[] { "~" }, StringSplitOptions.None);

                            var transactionObject = new ClassWalletTransactionObject
                            {
                                TransactionType          = type,
                                TransactionHash          = hashTransaction,
                                TransactionWalletAddress = walletDstOrSrc,
                                TransactionAmount        = decimal.Parse(amountDecrypted.ToString(Program.GlobalCultureInfo),
                                                                         NumberStyles.Currency, Program.GlobalCultureInfo),
                                TransactionFee = decimal.Parse(feeDecrypted.ToString(Program.GlobalCultureInfo),
                                                               NumberStyles.Currency, Program.GlobalCultureInfo),
                                TransactionTimestampSend    = long.Parse(timestamp),
                                TransactionTimestampRecv    = long.Parse(timestampRecv),
                                TransactionBlockchainHeight = splitBlockchainHeight[0].Replace("{", "")
                            };

                            ListTransaction.Add(hashTransaction, transactionObject);


                            await SaveWalletCache(Program.WalletXiropht.ClassWalletObject.WalletConnect.WalletAddress, finalTransactionEncrypted);

#if DEBUG
                            Log.WriteLine("Total transactions downloaded: " +
                                          ListTransaction.Count + "/" +
                                          Program.WalletXiropht.ClassWalletObject.TotalTransactionInSync + ".");
#endif
                        }
                    }
                    else
                    {
#if DEBUG
                        Log.WriteLine("Can't decrypt transaction: " + transaction + " result: " +
                                      amountAndFeeDecrypted);
#endif
                        errorSyncTransaction = true;
                    }
                }
                else
                {
#if DEBUG
                    Log.WriteLine("Wallet transaction hash: " + hashTransaction + " already exist on database.");
#endif
                    errorSyncTransaction = true;
                }
            }

            if (errorSyncTransaction)
            {
                if (!ClassConnectorSetting.SeedNodeIp.ContainsKey(node))
                {
                    if (!Program.WalletXiropht.ClassWalletObject.ListRemoteNodeBanned.ContainsKey(node))
                    {
                        Program.WalletXiropht.ClassWalletObject.ListRemoteNodeBanned.Add(node,
                                                                                         ClassUtils.DateUnixTimeNowSecond());
                        ClassPeerList.IncrementPeerDisconnect(node);
                    }
                    else
                    {
                        Program.WalletXiropht.ClassWalletObject.ListRemoteNodeBanned[node] =
                            ClassUtils.DateUnixTimeNowSecond();
                        ClassPeerList.IncrementPeerDisconnect(node);
                    }
                }


                await Program.WalletXiropht.ClassWalletObject.DisconnectRemoteNodeTokenSync();

                Program.WalletXiropht.ClassWalletObject.WalletOnUseSync = false;
            }

            Program.WalletXiropht.ClassWalletObject.InReceiveTransaction = false;
        }