public ImportPrivateKeyCommand(string signFacadeUrl,
                                       string apiKey,
                                       string blockchainType)
        {
            _blockchainType = blockchainType;
            var emptyLog = Lykke.Logs.EmptyLogFactory.Instance.CreateLog(this);

            _signFacadeClient = new Lykke.Service.BlockchainSignFacade.Client.BlockchainSignFacadeClient(signFacadeUrl, apiKey, emptyLog);
        }
        private static async Task Migrate(string bwSettingsUrl, string bitcoinSettingsUrl, string apiKey)
        {
            if (!ValidateSettingsUrl(bwSettingsUrl))
            {
                return;
            }
            if (!ValidateSettingsUrl(bitcoinSettingsUrl))
            {
                return;
            }


            var logFactory = LogFactory.Create().AddConsole();

            var appSettings     = new SettingsServiceReloadingManager <AppSettings>(bwSettingsUrl, p => {});
            var bitcoinSettings = new SettingsServiceReloadingManager <BitcoinAppSettings>(bitcoinSettingsUrl, p => { })
                                  .CurrentValue.BitcoinService;


            var signingService = RestClient.For <ISigningServiceApi>(new HttpClient {
                BaseAddress = new Uri(bitcoinSettings.SignatureProviderUrl)
            });

            signingService.ApiKey = bitcoinSettings.SigningServiceApiKey;

            var walletRepository = BlockchainWalletsRepository.Create(appSettings.Nested(o => o.BlockchainWalletsService.Db.DataConnString), logFactory);

            var firstGenerationBlockchainWalletRepository = FirstGenerationBlockchainWalletRepository.Create(
                appSettings.Nested(o => o.BlockchainWalletsService.Db.ClientPersonalInfoConnString), logFactory);

            var cqrs = Cqrs.CreateCqrsEngine(appSettings.CurrentValue.BlockchainWalletsService.Cqrs.RabbitConnectionString, logFactory);

            var blockchainSignFacade = new BlockchainSignFacadeClient
                                       (
                appSettings.CurrentValue.BlockchainSignFacadeClient.ServiceUrl,
                apiKey,
                logFactory.CreateLog(nameof(BlockchainSignFacadeClient))
                                       );

            var       counter   = 0;
            const int batchSize = 10;

            await firstGenerationBlockchainWalletRepository.EnumerateBcnCredsByChunksAsync(AssetId, async records =>
            {
                foreach (var batch in records.Batch(batchSize))
                {
                    await batch.SelectAsync(async o =>
                    {
                        await Migrate(walletRepository, signingService, blockchainSignFacade, cqrs, o);
                        return(true);
                    });

                    counter += batchSize;
                    Console.SetCursorPosition(0, Console.CursorTop);
                    Console.Write($"{counter} wallets migrated");
                }
            });

            Console.WriteLine();
            Console.WriteLine("Migration completed");
        }
        static async Task Main(string[] args)
        {
            Console.WriteLine("Press enter to start");
            Console.ReadLine();
            var client           = new WalletManagerClient("http://localhost:5001");
            var signFacadeClient = new BlockchainSignFacadeClient("http://blockchain-sign-facade.services.svc.cluster.local/",
                                                                  "350AFDCE-A027-4843-935F-EF5C377CE2EB", new EmptyLog());
            var senderWallet = await signFacadeClient.CreateWalletAsync("Bitcoin");

            var receiverWallet = await signFacadeClient.CreateWalletAsync("Bitcoin");

            var walletKey = new WalletKey()
            {
                BlockchainAssetId = "BTC",
                BlockchainId      = "Bitcoin",
                WalletAddress     = senderWallet.PublicAddress
            };

            var balance1 = await client.Balances.GetAllBalancesForBlockchainAsync(new GetAllBalancesForBlockchainRequest()
            {
                BlockchainId = "Bitcoin",
                Skip         = 0,
                Take         = 100
            });

            //await client.Operations.GetOperationsForWallet();

            var task = client.Wallets.RegisterWalletAsync(new RegisterWalletRequest()
            {
                WalletKey = walletKey
            }).ResponseAsync.ContinueWith(async
                                              (prev) =>
            {
                await prev;

                var operationId      = Guid.NewGuid().ToString();
                var builtTransaction = await client.Transfers.BuildTransactionAsync(new BuildTransactionRequest()
                {
                    OperationId        = operationId,
                    BlockchainAssetId  = "BTC",
                    BlockchainId       = "Bitcoin",
                    FromAddress        = senderWallet.PublicAddress,
                    FromAddressContext = senderWallet.AddressContext,
                    Amount             = "1000000",
                    ToAddress          = receiverWallet.PublicAddress,
                    IncludeFee         = true
                });

                var signedTransaction =
                    await signFacadeClient.SignTransactionAsync("Bitcoin",
                                                                new SignTransactionRequest()
                {
                    PublicAddresses    = new[] { senderWallet.PublicAddress },
                    TransactionContext = builtTransaction.TransactionContext
                });

                var sendTransactionResult = await client.Transfers.BroadcastTransactionAsync(new BroadcastTransactionRequest()
                {
                    BlockchainId      = "Bitcoin",
                    SignedTransaction = signedTransaction.SignedTransaction,
                    OperationId       = operationId
                });

                var operations = await client.Operations.GetOperationsAsync(new GetOperationRequest()
                {
                    WalletKey = walletKey,
                    Skip      = 0,
                    Take      = 100
                });

                var balance = await client.Balances.GetBalanceAsync(new GetBalanceRequest()
                {
                    WalletKey = walletKey,
                });
            });

            while (true)
            {
                try
                {
                    var sw = new Stopwatch();
                    sw.Start();
                    var result = await client.Monitoring.IsAliveAsync(new IsAliveRequest());

                    sw.Stop();
                    Console.WriteLine($"{result.Name}  {sw.ElapsedMilliseconds} ms");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }

                await Task.Delay(1000);
            }
        }