private async Task <IEnumerable <AccountedPaymentEntity> > GetPaymentsWithTransaction(InvoiceEntity invoice) { var transactions = await _ExplorerClient.GetTransactions(invoice.Payments.Select(t => t.Outpoint.Hash).ToArray()); var spentTxIn = new Dictionary <OutPoint, AccountedPaymentEntity>(); var result = invoice.Payments.Select(p => p.Outpoint).ToHashSet(); List <AccountedPaymentEntity> payments = new List <AccountedPaymentEntity>(); foreach (var payment in invoice.Payments) { TransactionResult tx; if (!transactions.TryGetValue(payment.Outpoint.Hash, out tx)) { result.Remove(payment.Outpoint); continue; } AccountedPaymentEntity accountedPayment = new AccountedPaymentEntity() { Confirmations = tx.Confirmations, Transaction = tx.Transaction, Payment = payment }; payments.Add(accountedPayment); foreach (var txin in tx.Transaction.Inputs) { if (!spentTxIn.TryAdd(txin.PrevOut, accountedPayment)) { //We get a double spend var existing = spentTxIn[txin.PrevOut]; //Take the most recent, the full node is already comparing fees correctly so we have the most likely to be confirmed if (accountedPayment.Confirmations > 1 || existing.Payment.ReceivedTime < accountedPayment.Payment.ReceivedTime) { spentTxIn[txin.PrevOut] = accountedPayment; result.Remove(existing.Payment.Outpoint); } } } } List <PaymentEntity> updated = new List <PaymentEntity>(); var accountedPayments = payments.Where(p => { var accounted = result.Contains(p.Payment.Outpoint); if (p.Payment.Accounted != accounted) { p.Payment.Accounted = accounted; updated.Add(p.Payment); } return(accounted); }).ToArray(); await _InvoiceRepository.UpdatePayments(payments); return(accountedPayments); }
static void checkAllTransactionForInit(NBXplorerNetwork network, ExplorerClient client, Way.Lib.CLog log) { using (var db = new MainDB()) { var allWalletInfos = db.WalletCyptoCoinInfo.Where(m => m.Currency == "BTC").ToArray(); foreach (var walletinfo in allWalletInfos) { var publicKey = new ExtPubKey(walletinfo.Key2); var userDerivationScheme = network.DerivationStrategyFactory.CreateDirectDerivationStrategy(publicKey, new DerivationStrategyOptions() { // Use non-segwit Legacy = true }); var lastResponse = client.GetTransactions(userDerivationScheme, null); List <TransactionInformation> allTrans = new List <TransactionInformation>(); allTrans.AddRange(lastResponse.UnconfirmedTransactions.Transactions); //为了防止程序关闭期间,有transaction发生,所以ConfirmedTransactions也要分析 allTrans.AddRange(lastResponse.ConfirmedTransactions.Transactions); foreach (var payedTranInfo in allTrans) { var payedTranid = payedTranInfo.TransactionId.ToString(); if (payedTranInfo.Confirmations == 0) { log.Log($"received unconfirmed transaction:{payedTranid}"); } else { log.Log($"received confirmed({payedTranInfo.Confirmations})"); } checkTransaction(db, payedTranInfo.Transaction, payedTranInfo.Confirmations, log); } } } }