static void Main(string[] args)
        {
            Console.WriteLine("Usage: dotnet IndexationStateEditor.dll read|write <bil-ethereum-worker-azure-storage-connection-string> ");

            if (args.Length != 2)
            {
                Console.WriteLine("Invalid parameters count");
                return;
            }

            var connectionString = ConstantReloadingManager.From(args[1]);
            var repository       = BlockchainIndexationStateRepository.Create(connectionString);

            if (args[0] == "read")
            {
                Read(repository).Wait();
            }
            else if (args[0] == "write")
            {
                Write(repository).Wait();
            }
            else
            {
                Console.WriteLine($"Unknown command: {args[0]}");
            }
        }
        private static async Task Read(BlockchainIndexationStateRepository repository)
        {
            Console.WriteLine("Reading the state from BLOB...");

            var state = await repository.GetOrCreateAsync();

            Console.WriteLine("Serializing the state to json...");

            var json = JsonConvert.SerializeObject(state.AsEnumerable(), Formatting.Indented);

            Console.WriteLine("Serializing the state json to the 'state.json' file...");

            await File.WriteAllTextAsync("state.json", json);
        }
        private static async Task Write(BlockchainIndexationStateRepository repository)
        {
            Console.WriteLine("Reading the state from the 'state.json' file...");

            var json = await File.ReadAllTextAsync("state.json");

            Console.WriteLine("Deserializing the state from json...");

            var intervals = JsonConvert.DeserializeObject <IEnumerable <BlocksIntervalIndexationState> >(json);
            var state     = BlockchainIndexationState.Restore(intervals);

            var x = state.GetNonIndexedBlockNumbers();

            Console.WriteLine("Saving the state to BLOB...");

            await repository.UpdateAsync(state);
        }
        static async Task Main(string[] args)
        {
            Console.WriteLine("Usage: dotnet IndexationStateEditor.dll read|write <bil-ethereum-worker-azure-storage-connection-string> ");

            if (args.Length != 2)
            {
                Console.WriteLine("Invalid parameters count");
                return;
            }

            if (args[0] == "read")
            {
                var connectionString = ConstantReloadingManager.From(args[1]);
                var repository       = BlockchainIndexationStateRepository.Create(connectionString);

                await Read(repository);
            }
            else if (args[0] == "write")
            {
                var connectionString = ConstantReloadingManager.From(args[1]);
                var repository       = BlockchainIndexationStateRepository.Create(connectionString);

                await Write(repository);
            }
            else if (args[0] == "read-file")
            {
                var sourceFilePath = args[1];

                await ReadFile(sourceFilePath);
            }
            else if (args[0] == "write-file")
            {
                var destinationFilePath = args[1];

                await WriteFile(destinationFilePath);
            }
            else
            {
                Console.WriteLine($"Unknown command: {args[0]}");
            }
        }
        private void LoadRepositories(
            ContainerBuilder builder)
        {
            var connectionString = _appSettings.ConnectionString(x => x.WorkerService.Db.DataConnString);

            // BalanceObservationTaskRepository

            builder
            .Register(x => BalanceObservationTaskRepository.Create
                      (
                          connectionString: connectionString
                      ))
            .As <IBalanceObservationTaskRepository>()
            .SingleInstance();

            // BlacklistedAddressRepository

            builder
            .Register(x => BlacklistedAddressRepository.Create
                      (
                          connectionString: connectionString,
                          logFactory: x.Resolve <ILogFactory>()
                      ))
            .As <IBlacklistedAddressRepository>()
            .SingleInstance();

            // BlockchainIndexationStateRepository

            builder
            .Register(x => BlockchainIndexationStateRepository.Create
                      (
                          connectionString: connectionString
                      ))
            .As <IBlockchainIndexationStateRepository>()
            .SingleInstance();

            // BlockIndexationLockRepository

            builder
            .Register(x => BlockIndexationLockRepository.Create
                      (
                          connectionString: connectionString,
                          logFactory: x.Resolve <ILogFactory>()
                      ))
            .As <IBlockIndexationLockRepository>()
            .SingleInstance();

            // ObservableBalanceRepository

            builder
            .Register(x => ObservableBalanceRepository.Create
                      (
                          connectionString: connectionString,
                          logFactory: x.Resolve <ILogFactory>()
                      ))
            .As <IObservableBalanceRepository>()
            .SingleInstance();

            // TransactionMonitoringTaskRepository

            builder
            .Register(x => TransactionMonitoringTaskRepository.Create
                      (
                          connectionString: connectionString
                      ))
            .As <ITransactionMonitoringTaskRepository>()
            .SingleInstance();

            // TransactionReceiptRepository

            builder
            .Register(x => TransactionReceiptRepository.Create
                      (
                          connectionString: connectionString,
                          logFactory: x.Resolve <ILogFactory>()
                      ))
            .As <ITransactionReceiptRepository>()
            .SingleInstance();

            // TransactionRepository

            builder
            .Register(x => TransactionRepository.Create
                      (
                          connectionString: connectionString,
                          logFactory: x.Resolve <ILogFactory>()
                      ))
            .As <ITransactionRepository>()
            .SingleInstance();
        }