Beispiel #1
0
        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();
            }
        }
Beispiel #2
0
        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();
        }