public static void AddFeeDataToOperation(this TransferEvent operation, TransferQueueMessage message, Asset asset) { var fee = message?.Fees?.FirstOrDefault(); if (fee?.Instruction == null) { return; } if (fee.Instruction.SourceClientId == operation.ClientId) { operation.FeeSize = (double)(fee.Transfer?.Volume ?? 0); operation.FeeType = FeeType.Absolute; } if (fee.Instruction.TargetClientId == operation.ClientId) { // client receives more (amount + fee), amount should be increased operation.Amount = (operation.Amount + (double)(fee.Transfer?.Volume ?? 0)).TruncateDecimalPlaces(asset.Accuracy, true); } }
private async Task ProcessMessage(TransferQueueMessage queueMessage) { await _delayWampUpSubject.OnNewOperation(queueMessage.FromClientId); await _delayWampUpSubject.OnNewOperation(queueMessage.ToClientid); }
public static Task <decimal> GetAmountNoFeeAsync(this IFeeCalculationService src, TransferQueueMessage message) { return(src.GetAmountNoFeeAsync(message.Amount.ParseAnyDecimal(), message.AssetId, message.Fees, message.ToClientid)); }
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); }