public async Task ReceiveMessage(TransitQueueMessage message) { try { await _log.WriteInfoAsync(_component, "", message.TxId, "beginning to process"); var ourVouts = new List <VoutEx>(); // get outputs that where dedicated to our users for (int i = 0; i < message.Vouts.Count; i++) { var vout = message.Vouts[i]; if (await _generatedWallets.GetDataAsync("part", vout.Address) != null) { ourVouts.Add(new VoutEx { Address = vout.Address, Amount = vout.Amount, voutId = i }); } } // if none of the outputs where dedicated to our users, return; if (ourVouts.Count == 0) { await _log.WriteInfoAsync(_component, "", message.TxId, "didn't contain relevant addresses"); return; } foreach (var addr in ourVouts.Select(x => x.Address).Distinct()) { var changePerAddress = ourVouts.Where(x => x.Address == addr).Sum(x => x.Amount); var changePerAddressInSlr = changePerAddress / 100000000m; if (changePerAddressInSlr < _minTxAmount) { continue; } var dest = new Dictionary <string, decimal> { { _hotWalletAddress, changePerAddressInSlr - _txFee } }; var userWallet = _generatedWallets.FirstOrDefault(x => x.Address == addr); var rawTx = await _rpcClient.CreateRawTransaction(ourVouts.Where(x => x.Address == addr).Select(x => new { txid = message.TxId, vout = x.voutId }).ToArray(), dest); var signedTx = await _rpcClient.SignRawTransaction(rawTx, userWallet.PrivateKey); var sentTx = await _rpcClient.SendRawTransaction(signedTx.Hex); await _log.WriteInfoAsync(_component, "", message.TxId, "transferred. posting to queue."); await _txesQueue.PutRawMessageAsync(JsonConvert.SerializeObject(new QueueModel { Address = addr, Amount = changePerAddressInSlr, TxId = message.TxId })); } } catch (Exception e) { //await _slackNotifier.Notify(new SlackMessage { Sender = _component, Type = "Errors", Message = "Error occured during cashin handling" }); await _log.WriteErrorAsync(_component, "", message.TxId, e); throw; } }