private async void Synchronizer_ResponseArrivedAsync(object sender, SynchronizeResponse response) { try { using (await ProcessLock.LockAsync()) { var unconfirmedCoinJoinHashes = response.UnconfirmedCoinJoins; if (!unconfirmedCoinJoinHashes.Any()) { return; } var txsNotKnownByAWallet = WalletManager.FilterUnknownCoinjoins(unconfirmedCoinJoinHashes); using var client = new WasabiClient(Synchronizer.WasabiClient.TorClient.DestinationUriAction, Synchronizer.WasabiClient.TorClient.TorSocks5EndPoint); var unconfirmedCoinJoins = await client.GetTransactionsAsync(Synchronizer.Network, txsNotKnownByAWallet, CancellationToken.None).ConfigureAwait(false); foreach (var tx in unconfirmedCoinJoins.Select(x => new SmartTransaction(x, Height.Mempool))) { if (RpcClient is null || await TryBroadcastTransactionWithRpcAsync(tx).ConfigureAwait(false) || (await RpcClient.TestAsync().ConfigureAwait(false)) is { }) // If the test throws exception then I believe it, because RPC is down and the backend is the god. { WalletManager.ProcessCoinJoin(tx); } }
public async Task GetTransactionsTestAsync() { var mempool = Enumerable.Range(0, 1_100).Select(_ => CreateTransaction()).ToArray(); Task <HttpResponseMessage> FakeServerCode(HttpMethod method, string action, NameValueCollection parameters, string body) { Assert.True(parameters.Count <= 10); IEnumerable <uint256> requestedTxIds = parameters["transactionIds"].Split(",").Select(x => uint256.Parse(x)); IEnumerable <string> result = mempool.Where(tx => requestedTxIds.Contains(tx.GetHash())).Select(tx => tx.ToHex()); var response = new HttpResponseMessage(HttpStatusCode.OK); response.Content = new StringContent(JsonConvert.SerializeObject(result)); return(Task.FromResult(response)); }; var torHttpClient = new MockTorHttpClient(); torHttpClient.OnSendAsync = FakeServerCode; var client = new WasabiClient(torHttpClient); Assert.Empty(WasabiClient.TransactionCache); // Requests one transaction var searchedTxId = mempool[0].GetHash(); var txs = await client.GetTransactionsAsync(Network.Main, new[] { searchedTxId }, CancellationToken.None); Assert.Equal(searchedTxId, txs.First().GetHash()); Assert.NotEmpty(WasabiClient.TransactionCache); Assert.True(WasabiClient.TransactionCache.ContainsKey(searchedTxId)); // Requests 20 transaction var searchedTxIds = mempool[..20].Select(x => x.GetHash());
public async Task GetTransactionsAsync(NetworkType networkType) { using var client = new WasabiClient(LiveServerTestsFixture.UriMappings[networkType], Global.Instance.TorSocks5Endpoint); var randomTxIds = Enumerable.Range(0, 20).Select(_ => RandomUtils.GetUInt256()); var network = networkType == NetworkType.Mainnet ? Network.Main : Network.TestNet; var ex = await Assert.ThrowsAsync <HttpRequestException>(async() => await client.GetTransactionsAsync(network, randomTxIds.Take(4), CancellationToken.None)); Assert.Equal("Bad Request\nNo such mempool or blockchain transaction. Use gettransaction for wallet transactions.", ex.Message); var mempoolTxIds = await client.GetMempoolHashesAsync(CancellationToken.None); randomTxIds = Enumerable.Range(0, 5).Select(_ => mempoolTxIds.RandomElement()).Distinct().ToArray(); var txs = await client.GetTransactionsAsync(network, randomTxIds, CancellationToken.None); var returnedTxIds = txs.Select(tx => tx.GetHash()); Assert.Equal(returnedTxIds.OrderBy(x => x).ToArray(), randomTxIds.OrderBy(x => x).ToArray()); }