private async void addbutton_Click(object sender, EventArgs e) { Contract_id = contracttextbox.Text; var result = await contractService.FindContract(contracttextbox.Text); if (result == null) { MessageBox.Show("ไม่ค้นพบรหัสสัญญาใน Block explorer"); } else { MyContract = contractService.LoadContract(Contract_id); string connectionString = $"{Directory.GetCurrentDirectory()}{Path.DirectorySeparatorChar}tsc-wallet.db"; using (var db = new LiteDatabase(connectionString)) //Insert Wallet { var collection = db.GetCollection <MonitorContract>("Contracts"); MonitorContract existing = null; existing = collection.Find(c => c.contract_id == Contract_id).FirstOrDefault(); if (existing == null) { var contract = new MonitorContract { contract_id = Contract_id, owner_pubkey = MyContract.OwnerPublicAddress, blockheight = 0 }; collection.Insert(contract); } } string path = $"{Directory.GetCurrentDirectory()}{Path.DirectorySeparatorChar}CurrentContract.txt"; if (File.Exists(path)) { File.WriteAllText(path, string.Empty); using (StreamWriter sw = File.CreateText(path)) { sw.WriteLine(MyContract.ID); } } MessageBox.Show("เลือกรหัสสัญญาสำเร็จ"); LoadData(); } }
private async void ScanWallet() { timer.Stop(); InvokeHelp.SetControlPropertyThreadSafe(refreshbutton, "Enabled", false); InvokeHelp.SetControlPropertyThreadSafe(rescanbutton, "Enabled", false); InvokeHelp.SetControlPropertyThreadSafe(sendDgbButton, "Enabled", false); InvokeHelp.SetControlPropertyThreadSafe(addcontractbutton, "Enabled", false); InvokeHelp.SetControlPropertyThreadSafe(progressBar1, "Visible", true); InvokeHelp.SetControlPropertyThreadSafe(progressBar1, "Value", 1); DgbBalance = await api.GetBalance(publicKey); ShowDataToGrid(new List <WalletAccount>()); if (InvokeRequired) //Invoke DGBBalancelabel { this.Invoke(new MethodInvoker(delegate { DGBBalancelabel.Text = DgbBalance.ToString(); })); } else { DGBBalancelabel.Text = DgbBalance.ToString(); } string path = $"{Directory.GetCurrentDirectory()}{Path.DirectorySeparatorChar}CurrentContract.txt"; using (StreamReader sr = File.OpenText(path)) { string s; if ((s = sr.ReadLine()) != null) { using (var db = new LiteDatabase(connectionString)) { var collection = db.GetCollection <MonitorContract>("Contracts"); CurrentContract = collection.FindOne(x => x.contract_id == s); } InvokeHelp.SetControlPropertyThreadSafe(addcontractbutton, "Text", "แก้ไข"); } else { InvokeHelp.SetControlPropertyThreadSafe(addcontractbutton, "Text", "เพิ่ม"); ShowDataToGrid(new List <WalletAccount>()); InvokeHelp.SetControlPropertyThreadSafe(progressBar1, "Visible", false); InvokeHelp.SetControlPropertyThreadSafe(addcontractbutton, "Enabled", true); //try return; } } if (CurrentContract == null) { InvokeHelp.SetControlPropertyThreadSafe(addcontractbutton, "Enabled", true); //try return; } List <String> pbkey = new List <string>(); try { int i = 0; int totalPage = 1; bool stopLimit = false; LastBlockHeight = 0; string ownerpubkey = CurrentContract.owner_pubkey; while (i < totalPage && !stopLimit) { var response = await client.GetAsync($"/api/txs/?address={ownerpubkey}&pageNum={i}"); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync(); transactions = JsonConvert.DeserializeObject <APITransByAddr>(result); totalPage = transactions.pagesTotal; List <Tx> Address = transactions.txs; foreach (var datatx in Address) { var height = await api.GetBlockHeight(datatx.blockhash); if (height > CurrentContract.blockheight) //only BlockHeight more than BlockHeight in DB Contract { if (LastBlockHeight == 0) { LastBlockHeight = height; } foreach (var vins in datatx.vin) { pbkey.Add(vins.addr); } foreach (var vout in datatx.vout) { if (vout.scriptPubKey.addresses != null) { foreach (var addr in vout.scriptPubKey.addresses) { pbkey.Add(addr.ToString()); } } } } else { stopLimit = true; break; } } i++; } pbkey = pbkey.Distinct().ToList(); //Distince wallet InvokeHelp.SetControlPropertyThreadSafe(progressBar1, "Value", 2); List <string> walletInDb = new List <string>(); List <string> contractInDb = new List <string>(); using (var db = new LiteDatabase(connectionString)) //Compare present wallet in api with wallet in db. Insert difference wallet(new wallet) to db { var collection = db.GetCollection <WalletAccount>("Accounts"); var walletInDb1 = collection.Find(x => x.account_id.contract_id == CurrentContract.contract_id).ToList(); if (walletInDb1.Count() != 0) { walletInDb = walletInDb1.Select(x => x.account_id.publickey).ToList(); pbkey = pbkey.Except(walletInDb).ToList(); } } InvokeHelp.SetControlPropertyThreadSafe(progressBar1, "Value", 3); var a1 = pbkey.IndexOf(CurrentContract.owner_pubkey); //remove owner public key if (a1 >= 0) { pbkey.RemoveAt(a1); } InvokeHelp.SetControlPropertyThreadSafe(progressBar1, "Value", 4); if (pbkey.Count() != 0) //if it have got new wallet. Insert it. { using (var db = new LiteDatabase(connectionString)) //Insert Wallet { var collection = db.GetCollection <WalletAccount>("Accounts"); foreach (var tx in pbkey) { var account = new WalletAccount { account_id = new KeyAccount { contract_id = CurrentContract.contract_id, publickey = tx.ToString() } }; collection.Insert(account); } } using (var db = new LiteDatabase(connectionString)) //Compare present wallet in api with wallet in db. Insert difference wallet(new wallet) to db { var collection = db.GetCollection <MonitorContract>("Contracts"); CurrentContract.blockheight = LastBlockHeight; collection.Update(CurrentContract); } } InvokeHelp.SetControlPropertyThreadSafe(progressBar1, "Value", 5); using (var db = new LiteDatabase(connectionString)) { var collection = db.GetCollection <WalletAccount>("Accounts"); var walletInDb1 = collection.Find(x => x.account_id.contract_id == CurrentContract.contract_id); if (walletInDb1.Count() != 0) { walletInDb = walletInDb1.Select(x => x.account_id.publickey).ToList(); foreach (var wallet in walletInDb) { var balance = await api.GetBalance(wallet); var lessMoney = collection.FindOne(x => x.account_id.contract_id == CurrentContract.contract_id && x.account_id.publickey == wallet); lessMoney.balance = balance; collection.Update(lessMoney); } } WalletInDb = collection.Find(x => x.account_id.contract_id == CurrentContract.contract_id).ToList(); } InvokeHelp.SetControlPropertyThreadSafe(progressBar1, "Value", 6); } catch (Exception e) { MessageBox.Show("การเชื่อมต่อตัวสำรวจบล็อกมีปัญหา โปรดลองใหม่ภายหลัง"); //MessageBox.Show(e.Message); using (var db = new LiteDatabase(connectionString)) //if cannot use transaction in blockchian. Use last data in databasse { var collection = db.GetCollection <WalletAccount>("Accounts"); WalletInDb = collection.Find(x => x.account_id.contract_id == CurrentContract.contract_id).ToList(); } } if (WalletInDb != null) { ShowDataToGrid(WalletInDb); InvokeHelp.SetControlPropertyThreadSafe(progressBar1, "Value", 7); InvokeHelp.SetControlPropertyThreadSafe(progressBar1, "Visible", false); } InvokeHelp.SetControlPropertyThreadSafe(progressBar1, "Visible", false); InvokeHelp.SetControlPropertyThreadSafe(refreshbutton, "Enabled", true); InvokeHelp.SetControlPropertyThreadSafe(rescanbutton, "Enabled", true); InvokeHelp.SetControlPropertyThreadSafe(sendDgbButton, "Enabled", true); InvokeHelp.SetControlPropertyThreadSafe(addcontractbutton, "Enabled", true); LowMoneyWallet = WalletInDb.FindAll(x => x.balance < Properties.Settings.Default.minBalance); //Find Wallet is low money IsDone = true; timer.Start(); AutoSendDGB(); }