private static List <Transactions.TransactionData> GetTransactions(string address, string hash = null) { var txClient = new TransactionDataClient(Con); var txs = txClient.EndGetTransactions(txClient.BeginGetIncomingTransactions(address, hash)); return(txs.data); }
internal static void AddAccount(long chatId, List <string> accounts) { var context = new AccountDataContext(); foreach (var acc in accounts) { switch (acc) { case "NBZMQO7ZPBYNBDUR7F75MAKA2S3DHDCIFG775N3D": case "NCPAYOUTH2BGEGT3Q7K75PV27QKMVNN2IZRVZWMD": case null: continue; } if (GetAccount(add: acc, user: chatId)?.EncodedAddress != null) { return; } var a = new AccountClient(); //(encodedAddress: acc); var blocks = a.EndGetHarvestingInfo(a.BeginGetHarvestingInfo(acc)).data; // check hash var tClient = new TransactionDataClient(); tClient.BeginGetAllTransactions(ar => { var txs = ar.Content.data.Where(e => e.transaction?.otherTrans?.type == 257).ToList(); txs.AddRange(ar.Content.data.Where(e => e.transaction.type == 257)); var account = new Account() { OwnedByUser = chatId, EncodedAddress = acc.ToUpper(), LastTransactionHash = txs.Count > 0 ? txs?[0].transaction.type == 4100 ? txs?[0]?.meta.innerHash?.data : txs?[0]?.meta?.hash?.data : "none", // LastBlockHarvestedHeight = blocks.Count > 0 ? blocks[index: 0]?.height : 0, CheckBlocks = true, CheckTxs = true }; context.Accounts.InsertOnSubmit(entity: account); try { context.SubmitChanges(); } catch (Exception e) { Console.WriteLine("account utils: " + e.Message); } }, acc); } }
private static async void ScanTransactions(Account userAccount) { try { var tClient = new TransactionDataClient(Con); var request = tClient.BeginGetAllTransactions(ar => { try { var txs = ar.Content.data.Where(e => e.transaction?.otherTrans?.type == 257 || e.transaction?.type == 257).ToList(); foreach (var t in txs) { if (userAccount.LastTransactionHash == txs?[0]?.meta.innerHash?.data || userAccount.LastTransactionHash == txs?[0]?.meta?.hash?.data) { userAccount.LastTransactionHash = txs?[0].transaction.type == 4100 ? txs?[0]?.meta.innerHash?.data : txs?[0]?.meta?.hash?.data; break; } if (userAccount.LastTransactionHash == t.meta?.hash?.data || userAccount.LastTransactionHash == t.meta.innerHash.data) { userAccount.LastTransactionHash = txs?[0].transaction.type == 4100 ? txs?[0]?.meta.innerHash?.data : txs?[0]?.meta?.hash?.data; AccountUtils.UpdateAccount(usrAcc: userAccount); break; } if (!userAccount.CheckTxs) { continue; } try { var summary = new AccountTxSummary { AmountIn = t.transaction.recipient == userAccount.EncodedAddress ? t.transaction.amount : 0, AmountOut = t.transaction.recipient != userAccount.EncodedAddress ? t.transaction.amount : 0, MonitoredAccount = userAccount.EncodedAddress, Recipient = t.transaction.type == 257 ? t.transaction.recipient : t.transaction.otherTrans.recipient, Sender = AddressEncoding.ToEncoded(network: 0x68, publicKey: new PublicKey(key: t.transaction.type == 257 ? t.transaction.signer : t.transaction.otherTrans.signer)), DateOfInput = DateTime.Now, OwnedByUser = userAccount.OwnedByUser }; Notify(a: userAccount, t: t); SummaryUtils.AddTxSummary(s: summary); } catch (Exception e) { if (e.Message.Contains("blocked")) { AccountUtils.DeleteAccountsByUser(userAccount.OwnedByUser); NodeUtils.DeleteUserNodes(userAccount.OwnedByUser); UserUtils.DeleteUser(userAccount.OwnedByUser); } else { Console.WriteLine("Trans scanner line 112: " + e.StackTrace); } } } } catch (Exception e) { Console.WriteLine(value: e); if (e.Message.Contains("blocked")) { AccountUtils.DeleteAccountsByUser(userAccount.OwnedByUser); NodeUtils.DeleteUserNodes(userAccount.OwnedByUser); UserUtils.DeleteUser(userAccount.OwnedByUser); } } }, userAccount.EncodedAddress); request.AsyncWaitHandle.WaitOne(); } catch (Exception e) { Console.WriteLine("Transaction scanner line 136: " + e.StackTrace); } }
internal void ScanAccounts() { var privateKeys = ConfigurationManager.GetSection("accountsPrivate") as MyConfigSection; if (ConfigurationManager.AppSettings["network"] == "test") { Con.SetTestnet(); } else { Con.SetMainnet(); } List <KeyLastCheckedPair> listOfCosigs = new List <KeyLastCheckedPair>(); foreach (MyConfigInstanceElement e in privateKeys.Instances) { var pair = new KeyLastCheckedPair(); pair.CheckedHash = new List <string>(); pair.Acc = new PrivateKeyAccountClientFactory(Con).FromPrivateKey(e.Code); listOfCosigs.Add(pair); } while (true) { foreach (var pair in listOfCosigs) { try { var client = new TransactionDataClient(Con); client.BeginGetUnconfirmedTransactions(ar => { try { if (pair.CheckedHash.Count > 0 && ar.Content.data.Count > 0) { pair.CheckedHash.RemoveAll(e => ar.Content.data.All(i => e != i.meta.data)); } foreach (var t in ar.Content.data) { if (t.transaction.type != 4100 || t.transaction?.otherTrans?.type != 257 || pair.CheckedHash.Contains(t.meta.data)) { continue; } if (t.transaction.signer == pair.Acc.PublicKey.Raw) { continue; } Console.WriteLine(); Console.WriteLine("checking transaction: \n" + t.meta.data); pair.CheckedHash.Add(t.meta.data); Console.WriteLine("checked"); if (new RuleScanner().ScanTxAgainstRuleSet(t)) { SignTransaction( acc: pair.Acc, t: t, multisigAcc: AddressEncoding.ToEncoded( network: Con.GetNetworkVersion(), publicKey: new PublicKey(t.transaction.otherTrans.signer))); } } } catch (Exception ex) { Console.WriteLine(ex); } }, pair.Acc.Address.Encoded).AsyncWaitHandle.WaitOne(); } catch (Exception e) { Console.WriteLine(e); continue; } } } }