public async Task <bool> ProcessMessage(TransferQueueMessage queueMessage) { var amount = queueMessage.Amount.ParseAnyDouble(); //Get client wallets var toWallet = await _walletCredentialsRepository.GetAsync(queueMessage.ToClientid); var fromWallet = await _walletCredentialsRepository.GetAsync(queueMessage.FromClientId); //Register transfer events var destTransfer = await _transferEventsRepository.RegisterAsync( TransferEvent.CreateNew(queueMessage.ToClientid, toWallet.MultiSig, null, queueMessage.AssetId, amount, queueMessage.Id, toWallet.Address, toWallet.MultiSig, state: TransactionStates.SettledOffchain)); var sourceTransfer = await _transferEventsRepository.RegisterAsync( TransferEvent.CreateNew(queueMessage.FromClientId, fromWallet.MultiSig, null, queueMessage.AssetId, -amount, queueMessage.Id, fromWallet.Address, fromWallet.MultiSig, state: TransactionStates.SettledOffchain)); //Craete or Update transfer context var transaction = await _bitCoinTransactionsRepository.FindByTransactionIdAsync(queueMessage.Id); if (transaction == null) { await _log.WriteWarningAsync(nameof(TransferQueue), nameof(ProcessMessage), queueMessage.ToJson(), "unkown transaction"); return(false); } var contextData = await _bitcoinTransactionService.GetTransactionContext <TransferContextData>(transaction.TransactionId); if (contextData == null) { contextData = TransferContextData .Create(queueMessage.FromClientId, new TransferContextData.TransferModel { ClientId = queueMessage.ToClientid }, new TransferContextData.TransferModel { ClientId = queueMessage.FromClientId }); } contextData.Transfers[0].OperationId = destTransfer.Id; contextData.Transfers[1].OperationId = sourceTransfer.Id; var contextJson = contextData.ToJson(); var cmd = new TransferCommand { Amount = amount, AssetId = queueMessage.AssetId, Context = contextJson, SourceAddress = fromWallet.MultiSig, DestinationAddress = toWallet.MultiSig, TransactionId = Guid.Parse(queueMessage.Id) }; await _bitCoinTransactionsRepository.UpdateAsync(transaction.TransactionId, cmd.ToJson(), null, ""); await _bitcoinTransactionService.SetTransactionContext(transaction.TransactionId, contextData); if (await _clientSettingsRepository.IsOffchainClient(queueMessage.ToClientid)) { if (!await _clientAccountsRepository.IsTrusted(queueMessage.ToClientid)) { try { await _offchainRequestService.CreateOffchainRequestAndNotify(transaction.TransactionId, queueMessage.ToClientid, queueMessage.AssetId, (decimal)amount, null, OffchainTransferType.CashinToClient); } catch (Exception) { await _log.WriteWarningAsync(nameof(TransferQueue), nameof(ProcessMessage), "", $"Transfer already exists {transaction.TransactionId}"); } } } else { await _bitcoinCommandSender.SendCommand(cmd); } return(true); }