diff --git a/pkg/morph/client/client.go b/pkg/morph/client/client.go
index 9d8d26ebf..b60ffe79e 100644
--- a/pkg/morph/client/client.go
+++ b/pkg/morph/client/client.go
@@ -33,13 +33,18 @@ import (
 // expression (or just declaring a Client variable) is unsafe
 // and can lead to panic.
 type Client struct {
-	// two mutual exclusive modes, exactly one must be non-nil
+	cache
 
+	// two mutual exclusive modes, exactly one must be non-nil
 	*singleClient // works with single neo-go client
 
 	*multiClient // creates and caches single clients
 }
 
+type cache struct {
+	nnsHash util.Uint160
+}
+
 type singleClient struct {
 	logger *logger.Logger // logging component
 
diff --git a/pkg/morph/client/nns.go b/pkg/morph/client/nns.go
index f20b62197..4ae3d303a 100644
--- a/pkg/morph/client/nns.go
+++ b/pkg/morph/client/nns.go
@@ -58,12 +58,15 @@ func (c *Client) NNSContractAddress(name string) (sh util.Uint160, err error) {
 		})
 	}
 
-	cs, err := c.client.GetContractStateByID(nnsContractID) // cache it?
-	if err != nil {
-		return sh, fmt.Errorf("NNS contract state: %w", err)
+	if c.nnsHash.Equals(util.Uint160{}) {
+		cs, err := c.client.GetContractStateByID(nnsContractID)
+		if err != nil {
+			return sh, fmt.Errorf("NNS contract state: %w", err)
+		}
+		c.nnsHash = cs.Hash
 	}
 
-	sh, err = nnsResolve(c.client, cs.Hash, name)
+	sh, err = nnsResolve(c.client, c.nnsHash, name)
 	if err != nil {
 		return sh, fmt.Errorf("NNS.resolve: %w", err)
 	}