public async Task UpdateUserAssignmentFail(string contractAddress, string userAddress, string coinAdapter)
        {
            var canBeRestoredInternally = !string.IsNullOrEmpty(userAddress) && userAddress != Constants.EmptyEthereumAddress;

            var userAssignmentFail = await _userAssignmentFailRepository.GetAsync(contractAddress);

            if (userAssignmentFail == null)
            {
                userAssignmentFail = new UserAssignmentFail()
                {
                    CanBeRestoredInternally = canBeRestoredInternally,
                    ContractAddress         = contractAddress,
                    NotifiedInSlack         = false,
                    FailCount = 0
                };
            }

            if (userAssignmentFail.FailCount == _attempsBeforeReassign)
            {
                if (canBeRestoredInternally)
                {
                    var message = new TransferContractUserAssignment()
                    {
                        CoinAdapterAddress      = coinAdapter,
                        TransferContractAddress = contractAddress,
                        UserAddress             = userAddress
                    };

                    await _queueUserAssignment.PutRawMessageAsync(JsonConvert.SerializeObject(message));

                    userAssignmentFail.FailCount = 0;
                }
                else
                {
                    if (userAssignmentFail.NotifiedInSlack.HasValue &&
                        !userAssignmentFail.NotifiedInSlack.Value)
                    {
                        await _slackNotifier.ErrorAsync($"TransferAddress - {contractAddress}, UserAddress - {userAddress}, " +
                                                        $"CoinAdapter Address - {coinAdapter} can't be restored internally");

                        await _userAssignmentFailRepository.SaveAsync(userAssignmentFail);
                    }

                    return;
                }
            }
            else
            {
                userAssignmentFail.FailCount++;
            }

            await _userAssignmentFailRepository.SaveAsync(userAssignmentFail);
        }
        public async Task Execute(TransferContractUserAssignment transaction, QueueTriggeringContext context)
        {
            try
            {
                string assignedUser = await _transferContractService.GetTransferAddressUser(transaction.CoinAdapterAddress, transaction.TransferContractAddress);

                if (string.IsNullOrEmpty(assignedUser) || assignedUser == Constants.EmptyEthereumAddress)
                {
                    await _transferContractUserAssignmentQueueService.CompleteTransfer(transaction);
                }
                else
                {
                    await _logger.WriteInfoAsync("TransferContractUserAssignmentJob", "Execute", $"{transaction.TransferContractAddress}",
                                                 $"Skipp assignment, current user {assignedUser}", DateTime.UtcNow);
                }
            }
            catch (Exception ex)
            {
                if (ex.Message != transaction.LastError)
                {
                    await _logger.WriteWarningAsync("TransferContractUserAssignmentJob", "Execute", $"TransferContractAddress: [{transaction.TransferContractAddress}]", "");
                }

                transaction.LastError = ex.Message;

                if (transaction.DequeueCount >= 4)
                {
                    context.MoveMessageToPoison();
                }
                else
                {
                    transaction.DequeueCount++;
                    context.MoveMessageToEnd();
                    context.SetCountQueueBasedDelay(_settings.MaxQueueDelay, 200);
                }
                await _logger.WriteErrorAsync("TransferContractUserAssignmentJob", "Execute", "", ex);
            }
        }