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; }