public async Task DoubleSpendMempoolCheckCleanUp() { //arrange cleanUpTxService.Pause(); var cleanUpTxTriggeredSubscription = eventBus.Subscribe <CleanUpTxTriggeredEvent>(); (List <Tx> txList, uint256 firstBlockHash) = await CreateAndInsertTxWithMempoolAsync(dsCheckMempool : true); WaitUntilEventBusIsIdle(); var doubleSpendTx = Transaction.Parse(Tx2Hex, Network.Main); List <byte[]> dsTxId = new List <byte[]> { doubleSpendTx.GetHash().ToBytes() }; var txsWithDSCheck = (await TxRepositoryPostgres.GetTxsForDSCheckAsync(dsTxId, true)).ToArray(); var txPayload = HelperTools.HexStringToByteArray(tx2Hex); foreach (var dsTx in txsWithDSCheck) { await TxRepositoryPostgres.InsertMempoolDoubleSpendAsync( dsTx.TxInternalId, dsTx.TxExternalIdBytes, txPayload); } WaitUntilEventBusIsIdle(); var doubleSpends = (await TxRepositoryPostgres.GetTxsToSendMempoolDSNotificationsAsync()).ToList(); Assert.AreEqual(1, doubleSpends.Count()); foreach (var txDoubleSpend in doubleSpends) { await TxRepositoryPostgres.SetNotificationSendDateAsync(CallbackReason.DoubleSpendAttempt, txDoubleSpend.TxInternalId, -1, txDoubleSpend.DoubleSpendTxId, MockedClock.UtcNow); } doubleSpends = (await TxRepositoryPostgres.GetTxsToSendMempoolDSNotificationsAsync()).ToList(); Assert.AreEqual(0, doubleSpends.Count()); using (MockedClock.NowIs(DateTime.UtcNow.AddDays(cleanUpTxAfterDays))) { await ResumeAndWaitForCleanup(cleanUpTxTriggeredSubscription); // check if everything in db was cleared await CheckBlockNotPresentInDb(firstBlockHash); await CheckTxListNotPresentInDbAsync(txList); } }
public async Task SubmitAndCheckMultipleDSRead() { var address = BitcoinAddress.Create(testAddress, Network.RegTest); var tx1 = BCash.Instance.Regtest.CreateTransaction(); tx1.Inputs.Add(new TxIn(new OutPoint(new uint256(txC1Hash), 0))); tx1.Inputs.Add(new TxIn(new OutPoint(new uint256(txC1Hash), 1))); tx1.Outputs.Add(new TxOut(new Money(1000L), address)); var tx2 = BCash.Instance.Regtest.CreateTransaction(); tx2.Inputs.Add(new TxIn(new OutPoint(new uint256(txC2Hash), 0))); tx2.Inputs.Add(new TxIn(new OutPoint(new uint256(txC2Hash), 1))); tx2.Outputs.Add(new TxOut(new Money(100L), address)); var txList = new List <Tx>() { CreateNewTx(tx1.GetHash().ToString(), tx1.ToHex(), false, null, true), CreateNewTx(tx2.GetHash().ToString(), tx2.ToHex(), false, null, true) }; await TxRepositoryPostgres.InsertTxsAsync(txList, false); var txs = await TxRepositoryPostgres.GetTxsForDSCheckAsync(new List <byte[]> { tx1.GetHash().ToBytes(), tx2.GetHash().ToBytes() }, true); Assert.AreEqual(2, txs.Count()); Assert.AreEqual(2, txs.First().TxIn.Count); Assert.AreEqual(2, txs.Last().TxIn.Count); var readTx1 = txs.SingleOrDefault(x => x.TxIn.Any(y => new uint256(y.PrevTxId) == new uint256(txC1Hash))); Assert.IsNotNull(readTx1); Assert.AreEqual(0, readTx1.OrderderInputs.First().N); Assert.AreEqual(1, readTx1.OrderderInputs.Last().N); var readTx2 = txs.SingleOrDefault(x => x.TxIn.Any(y => new uint256(y.PrevTxId) == new uint256(txC2Hash))); Assert.IsNotNull(readTx2); Assert.AreEqual(0, readTx2.OrderderInputs.First().N); Assert.AreEqual(1, readTx2.OrderderInputs.Last().N); }