public async Task <CommandHandlingResult> Handle(RegisterCashInOutCommand command, IEventPublisher eventPublisher)
        {
            var id          = command.CommandId;
            var asset       = command.Asset;
            var amount      = command.Amount;
            var transaction = command.Transaction;

            ChaosKitty.Meow();

            try
            {
                await _cashOperationsRepositoryClient.RegisterAsync(new CashInOutOperation
                {
                    Id             = id,
                    ClientId       = transaction.ClientId,
                    Multisig       = transaction.Multisig,
                    AssetId        = asset.Id,
                    Amount         = amount,
                    BlockChainHash = transaction.Hash,
                    DateTime       = DateTime.UtcNow,
                    AddressTo      = transaction.Multisig,
                    State          = TransactionStates.SettledOnchain
                });
            }
            catch (HttpOperationException)
            {
                var persistedOperation = await _cashOperationsRepositoryClient.GetAsync(transaction.ClientId, id);

                if (persistedOperation == null)
                {
                    throw;
                }
                // else assuming that operation was correctly persisted before
            }

            eventPublisher.PublishEvent(new CashInOutOperationRegisteredEvent
            {
                CommandId   = command.CommandId,
                Asset       = command.Asset,
                Amount      = command.Amount,
                Transaction = command.Transaction
            });

            return(CommandHandlingResult.Ok());
        }
        private async Task Handle(ConfirmationSavedEvent evt, ICommandSender sender)
        {
            var hash     = evt.TransactionHash;
            var clientId = evt.ClientId;

            var balanceChangeTransaction = await _balanceChangeTransactionsRepository.GetAsync(hash);

            var operation = await _internalOperationsRepository.GetAsync(hash);

            var tx = balanceChangeTransaction.First(x => x.ClientId == clientId);

            ChaosKitty.Meow();

            if (operation != null && operation.CommandType == BitCoinCommands.Transfer)
            {
                foreach (var id in operation.OperationIds)
                {
                    if (string.IsNullOrWhiteSpace(id))
                    {
                        continue;
                    }

                    sender.SendCommand(new ProcessTransferCommand
                    {
                        TransferId = id
                    }, "transfer");
                }
            }
            else
            {
                if (tx.IsCashIn(tx.Multisig))
                {
                    var cashIns = tx.GetOperationSummary(tx.Multisig);
                    if (cashIns.Count > 1)
                    {
                        _log.WriteWarning(nameof(ConfirmationSavedEvent), evt, $"Multiple assets in a single transaction detected: {cashIns.ToJson()}");
                        // there should be only one asset in cash-in operation;
                        // code bellow with 'foreach' statement is kept for a while in case of obsolete request with multiple assets;
                    }

                    var skipBtc = (await _appGlobalSettingsRepositry.GetAsync()).BtcOperationsDisabled;

                    foreach (var cashIn in cashIns)
                    {
                        var asset = await GetAssetByBcnIdAsync(cashIn.Key);

                        ChaosKitty.Meow();

                        if (asset.Id == LykkeConstants.BitcoinAssetId && skipBtc)
                        {
                            sender.SendCommand(new SavePostponedCashInCommand
                            {
                                TransactionHash = tx.Hash
                            }, "cashin");
                        }
                        else
                        {
                            var sum = (cashIn.Value * Math.Pow(10, -asset.MultiplierPower)).TruncateDecimalPlaces(asset.Accuracy);

                            var cmd = new RegisterCashInOutCommand
                            {
                                Transaction = new Transaction {
                                    Hash = tx.Hash, ClientId = tx.ClientId, Multisig = tx.Multisig, IsSegwit = tx.IsSegwit
                                },
                                Asset = new Asset {
                                    Id = asset.Id, Accuracy = asset.Accuracy
                                },
                                Amount    = sum,
                                CommandId = Guid.NewGuid().ToString("N")
                            };

                            sender.SendCommand(cmd, "cashin");
                        }
                    }
                }
            }
        }