diff --git a/WalletConnectSharp.Core/Utils.cs b/WalletConnectSharp.Core/Utils.cs
index 64a0b28..f8804b8 100644
--- a/WalletConnectSharp.Core/Utils.cs
+++ b/WalletConnectSharp.Core/Utils.cs
@@ -1,14 +1,19 @@
-namespace WalletConnectSharp.Core;
+using System.Text.RegularExpressions;
+
+namespace WalletConnectSharp.Core;
 
 public static class Utils
 {
+    private const string SessionIdPattern = @"^[-a-z0-9]{3,8}:[-_a-zA-Z0-9]{1,32}$";
+    private static readonly Regex SessionIdRegex = new(SessionIdPattern, RegexOptions.None, TimeSpan.FromSeconds(1));
+    
     public static bool IsValidUrl(string url)
     {
         if (string.IsNullOrWhiteSpace(url)) return false;
             
         try
         {
-            new Uri(url);
+            _ = new Uri(url);
             return true;
         }
         catch (Exception e)
@@ -17,6 +22,11 @@ public static bool IsValidUrl(string url)
         }
     }
 
+    public static bool IsValidChainId(string chainId)
+    {
+        return SessionIdRegex.IsMatch(chainId);
+    }
+
     public static bool IsValidRequestExpiry(long expiry, long min, long max)
     {
         return expiry <= max && expiry >= min;
diff --git a/WalletConnectSharp.Sign/Engine.cs b/WalletConnectSharp.Sign/Engine.cs
index 01fc48f..7b0c77c 100644
--- a/WalletConnectSharp.Sign/Engine.cs
+++ b/WalletConnectSharp.Sign/Engine.cs
@@ -656,7 +656,7 @@ public async Task Reject(RejectParams @params)
 
             if (!string.IsNullOrWhiteSpace(pairingTopic))
             {
-                await MessageHandler.SendError<SessionPropose, SessionProposeResponse>(id, pairingTopic, reason);
+                await MessageHandler.SendError<SessionPropose, SessionProposeResponseReject>(id, pairingTopic, reason);
                 await this.Client.Proposal.Delete(id, Error.FromErrorType(ErrorType.USER_DISCONNECTED));
             }
         }
diff --git a/WalletConnectSharp.Sign/Internals/EngineHandler.cs b/WalletConnectSharp.Sign/Internals/EngineHandler.cs
index c38748d..adc1753 100644
--- a/WalletConnectSharp.Sign/Internals/EngineHandler.cs
+++ b/WalletConnectSharp.Sign/Internals/EngineHandler.cs
@@ -77,7 +77,7 @@ async Task IEnginePrivate.OnSessionProposeRequest(string topic, JsonRpcRequest<S
             }
             catch (WalletConnectException e)
             {
-                await MessageHandler.SendError<SessionPropose, SessionProposeResponse>(id, topic,
+                await MessageHandler.SendError<SessionPropose, SessionProposeResponseAutoReject>(id, topic,
                     Error.FromException(e));
             }
         }
diff --git a/WalletConnectSharp.Sign/Models/Engine/Methods/SessionProposeResponseAutoReject.cs b/WalletConnectSharp.Sign/Models/Engine/Methods/SessionProposeResponseAutoReject.cs
new file mode 100644
index 0000000..d078334
--- /dev/null
+++ b/WalletConnectSharp.Sign/Models/Engine/Methods/SessionProposeResponseAutoReject.cs
@@ -0,0 +1,25 @@
+using Newtonsoft.Json;
+using WalletConnectSharp.Common.Utils;
+using WalletConnectSharp.Core.Models.Relay;
+using WalletConnectSharp.Network.Models;
+
+namespace WalletConnectSharp.Sign.Models.Engine.Methods;
+
+/// <summary>
+/// A class that represents the response to wc_sessionPropose. Used to approve a session proposal
+/// </summary>
+[RpcResponseOptions(Clock.FIVE_MINUTES, 1121)]
+public class SessionProposeResponseAutoReject
+{
+    /// <summary>
+    /// The protocol options that should be used in this session
+    /// </summary>
+    [JsonProperty("relay")]
+    public ProtocolOptions Relay;
+        
+    /// <summary>
+    /// The public key of the responder to this session proposal
+    /// </summary>
+    [JsonProperty("responderPublicKey")]
+    public string ResponderPublicKey;
+}
diff --git a/WalletConnectSharp.Sign/Models/Engine/Methods/SessionProposeResponseReject.cs b/WalletConnectSharp.Sign/Models/Engine/Methods/SessionProposeResponseReject.cs
new file mode 100644
index 0000000..0659584
--- /dev/null
+++ b/WalletConnectSharp.Sign/Models/Engine/Methods/SessionProposeResponseReject.cs
@@ -0,0 +1,25 @@
+using Newtonsoft.Json;
+using WalletConnectSharp.Common.Utils;
+using WalletConnectSharp.Core.Models.Relay;
+using WalletConnectSharp.Network.Models;
+
+namespace WalletConnectSharp.Sign.Models.Engine.Methods;
+
+/// <summary>
+/// A class that represents the response to wc_sessionPropose. Used to reject a session proposal.
+/// </summary>
+[RpcResponseOptions(Clock.FIVE_MINUTES, 1120)]
+public class SessionProposeResponseReject
+{
+    /// <summary>
+    /// The protocol options that should be used in this session
+    /// </summary>
+    [JsonProperty("relay")]
+    public ProtocolOptions Relay;
+
+    /// <summary>
+    /// The public key of the responder to this session proposal
+    /// </summary>
+    [JsonProperty("responderPublicKey")]
+    public string ResponderPublicKey;
+}
diff --git a/WalletConnectSharp.Sign/Models/SessionStruct.cs b/WalletConnectSharp.Sign/Models/SessionStruct.cs
index d92a29a..8ee1f63 100644
--- a/WalletConnectSharp.Sign/Models/SessionStruct.cs
+++ b/WalletConnectSharp.Sign/Models/SessionStruct.cs
@@ -1,4 +1,5 @@
 using Newtonsoft.Json;
+using WalletConnectSharp.Core;
 using WalletConnectSharp.Core.Interfaces;
 using WalletConnectSharp.Core.Models.Relay;
 
@@ -144,9 +145,14 @@ private void ValidateNamespaceAndTopic(string @namespace)
 
         private void ValidateChainIdAndTopic(string chainId)
         {
-            if (chainId == null)
+            if (string.IsNullOrWhiteSpace(chainId))
             {
-                throw new ArgumentException("chainId is null");
+                throw new ArgumentException("chainId is null or empty");
+            }
+
+            if (!Utils.IsValidChainId(chainId))
+            {
+                throw new ArgumentException("The format of 'chainId' is invalid. Must be in the format of 'namespace:chainId' (e.g. 'eip155:10'). See CAIP-2 for more information.");
             }
 
             if (string.IsNullOrWhiteSpace(Topic))