private async Task Sync(Source source, Event replacementCompletedEvent, OTContract contract,
                                MySqlConnection connection, Web3 cl, int blockchainID, EthApiService eth, ulong currentStart, ulong currentEnd)
        {
            var toBlock = new BlockParameter(currentEnd);

            var replacementCompletedEvents = await replacementCompletedEvent.GetAllChangesDefault(
                replacementCompletedEvent.CreateFilterInput(new BlockParameter(currentStart),
                                                            toBlock));


            if (replacementCompletedEvents.Any())
            {
                Logger.WriteLine(source, "Found " + replacementCompletedEvents.Count + " replacement completed events");
            }

            foreach (EventLog <List <ParameterOutput> > eventLog in replacementCompletedEvents)
            {
                var block = await BlockHelper.GetBlock(connection, eventLog.Log.BlockHash, eventLog.Log.BlockNumber,
                                                       cl, blockchainID);

                var offerId =
                    HexHelper.ByteArrayToString((byte[])eventLog.Event
                                                .First(e => e.Parameter.Name == "offerId").Result);

                var challengerIdentity = (string)eventLog.Event
                                         .First(e => e.Parameter.Name == "challengerIdentity").Result;

                var chosenHolder = (string)eventLog.Event
                                   .First(e => e.Parameter.Name == "chosenHolder").Result;

                var transaction = await eth.Transactions.GetTransactionByHash.SendRequestAsync(eventLog.Log.TransactionHash);

                var receipt = await eth.Transactions.GetTransactionReceipt.SendRequestAsync(eventLog.Log.TransactionHash);

                var row = new OTContract_Replacement_ReplacementCompleted
                {
                    TransactionHash    = eventLog.Log.TransactionHash,
                    BlockNumber        = (UInt64)eventLog.Log.BlockNumber.Value,
                    Timestamp          = block.Timestamp,
                    OfferId            = offerId,
                    ChosenHolder       = chosenHolder,
                    ChallengerIdentity = challengerIdentity,
                    GasPrice           = (UInt64)transaction.GasPrice.Value,
                    GasUsed            = (UInt64)receipt.GasUsed.Value,
                    BlockchainID       = blockchainID
                };

                await OTContract_Replacement_ReplacementCompleted.InsertIfNotExist(connection, row);

                await OTOfferHolder.Insert(connection, offerId, chosenHolder, false, blockchainID);

                await OTOfferHolder.UpdateLitigationStatusesForOffer(connection, offerId, blockchainID);
            }

            contract.LastSyncedTimestamp = DateTime.Now;
            contract.SyncBlockNumber     = (ulong)toBlock.BlockNumber.Value;

            await OTContract.Update(connection, contract, false, false);
        }
        public override async Task <bool> Execute(Source source, BlockchainType blockchain, BlockchainNetwork network)
        {
            await using (var connection =
                             new MySqlConnection(OTHubSettings.Instance.MariaDB.ConnectionString))
            {
                int blockchainID = await GetBlockchainID(connection, blockchain, network);

                await OTOfferHolder.UpdateLitigationForAllOffers(connection, blockchainID);
            }

            return(true);
        }