diff --git a/src/CAServer.Application.Contracts/Contacts/Dtos/CreateUpdateContactDto.cs b/src/CAServer.Application.Contracts/Contacts/Dtos/CreateUpdateContactDto.cs
index 6816b54c1..a5840d865 100644
--- a/src/CAServer.Application.Contracts/Contacts/Dtos/CreateUpdateContactDto.cs
+++ b/src/CAServer.Application.Contracts/Contacts/Dtos/CreateUpdateContactDto.cs
@@ -20,20 +20,5 @@ public IEnumerable<ValidationResult> Validate(ValidationContext validationContex
         {
             yield return new ValidationResult("Invalid input.");
         }
-
-        if (!RelationId.IsNullOrWhiteSpace())
-        {
-            if (Addresses is { Count: > 0 })
-            {
-                yield return new ValidationResult("Invalid input.");
-            }
-        }
-        else
-        {
-            if (Addresses?.Count != 1)
-            {
-                yield return new ValidationResult("Invalid input.");
-            }
-        }
     }
 }
\ No newline at end of file
diff --git a/src/CAServer.Application/Contacts/ContactAppService.cs b/src/CAServer.Application/Contacts/ContactAppService.cs
index 27b4d0a02..ac3a26106 100644
--- a/src/CAServer.Application/Contacts/ContactAppService.cs
+++ b/src/CAServer.Application/Contacts/ContactAppService.cs
@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
+using AElf;
 using AElf.Types;
 using CAServer.Common;
 using CAServer.Commons;
@@ -123,6 +124,23 @@ public async Task<ContactResultDto> UpdateAsync(Guid id, CreateUpdateContactDto
         }
 
         var contact = contactResult.Data;
+        if (contact.Addresses?.Count > 1)
+        {
+            contact.Addresses.ForEach(t =>
+            {
+                var validResult = ValidAddress(t.Address);
+                if (!validResult)
+                {
+                    throw new UserFriendlyException("invalid address.");
+                }
+            });
+
+            var dto = ObjectMapper.Map<ContactGrainDto, ContactDto>(contact);
+            dto.Addresses = input.Addresses;
+            dto.Name = input.Name;
+            return await UpdateContactAsync(id, userId, dto);
+        }
+
         if (contact.Addresses != null && contact.Addresses.Count > 1 && input.Addresses != null &&
             input.Addresses.Count == 1)
         {
@@ -145,17 +163,41 @@ public async Task<ContactResultDto> UpdateAsync(Guid id, CreateUpdateContactDto
         var contactDto = await GetContactDtoAsync(input, id);
         await CheckContactAsync(contactDto);
 
+        return await UpdateContactAsync(id, userId, contactDto);
+    }
+
+    private bool ValidAddress(string address)
+    {
+        try
+        {
+            var isValid = AddressHelper.VerifyFormattedAddress(address);
+            if (!isValid)
+            {
+                Logger.LogInformation("invalid address: {address}", address);
+            }
+
+            return isValid;
+        }
+        catch (Exception e)
+        {
+            Logger.LogError(e, "valid address error", address);
+            return false;
+        }
+    }
+
+    private async Task<ContactResultDto> UpdateContactAsync(Guid contactId, Guid userId, ContactDto contactDto)
+    {
+        var contactGrain = _clusterClient.GetGrain<IContactGrain>(contactId);
         var result =
             await contactGrain.UpdateContactAsync(userId,
                 ObjectMapper.Map<ContactDto, ContactGrainDto>(contactDto));
+
         if (!result.Success)
         {
             throw new UserFriendlyException(result.Message);
         }
 
         await _distributedEventBus.PublishAsync(ObjectMapper.Map<ContactGrainDto, ContactUpdateEto>(result.Data));
-        // return ObjectMapper.Map<ContactGrainDto, ContactResultDto>(result.Data);
-
         var contactResultDto = ObjectMapper.Map<ContactGrainDto, ContactResultDto>(result.Data);
         var imageMap = _variablesOptions.ImageMap;
 
@@ -168,9 +210,9 @@ await contactGrain.UpdateContactAsync(userId,
             contactAddressDto.Image = imageMap.GetOrDefault(contactAddressDto.ChainName);
         }
 
-        if (contact.Name != input.Name)
+        if (contactResultDto.ImInfo != null && !contactResultDto.ImInfo.RelationId.IsNullOrEmpty())
         {
-            await ImRemarkAsync(contactResultDto?.ImInfo?.RelationId, userId, input.Name);
+            contactResultDto.ImInfo.RelationId = string.Empty;
         }
 
         return contactResultDto;