From a482196b6a2a5abc5a6b43214df7e30ea4de8847 Mon Sep 17 00:00:00 2001
From: Tim Lind <tim@incremental.co>
Date: Thu, 17 Feb 2022 11:37:04 +0200
Subject: [PATCH 1/2] fix: classify client states without consensus states as
 expired

---
 modules/light-clients/07-tendermint/types/client_state.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/modules/light-clients/07-tendermint/types/client_state.go b/modules/light-clients/07-tendermint/types/client_state.go
index a0430337d0b..8c7a255dfc5 100644
--- a/modules/light-clients/07-tendermint/types/client_state.go
+++ b/modules/light-clients/07-tendermint/types/client_state.go
@@ -78,7 +78,7 @@ func (cs ClientState) Status(
 	// get latest consensus state from clientStore to check for expiry
 	consState, err := GetConsensusState(clientStore, cdc, cs.GetLatestHeight())
 	if err != nil {
-		return exported.Unknown
+		return exported.Expired
 	}
 
 	if cs.IsExpired(consState.Timestamp, ctx.BlockTime()) {

From bfa39869d8f1503e56061fa206e44c1dc65f6820 Mon Sep 17 00:00:00 2001
From: Tim Lind <tim@incremental.co>
Date: Mon, 21 Feb 2022 18:14:49 +0200
Subject: [PATCH 2/2] fix: classify client states without consensus states as
 expired

---
 modules/core/02-client/keeper/grpc_query_test.go              | 2 +-
 modules/light-clients/07-tendermint/types/client_state.go     | 2 ++
 .../light-clients/07-tendermint/types/client_state_test.go    | 4 ++--
 3 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/modules/core/02-client/keeper/grpc_query_test.go b/modules/core/02-client/keeper/grpc_query_test.go
index f4fa3c59322..5e393c33a97 100644
--- a/modules/core/02-client/keeper/grpc_query_test.go
+++ b/modules/core/02-client/keeper/grpc_query_test.go
@@ -452,7 +452,7 @@ func (suite *KeeperTestSuite) TestQueryClientStatus() {
 					ClientId: path.EndpointA.ClientID,
 				}
 			},
-			true, exported.Unknown.String(),
+			true, exported.Expired.String(),
 		},
 		{
 			"Frozen client status",
diff --git a/modules/light-clients/07-tendermint/types/client_state.go b/modules/light-clients/07-tendermint/types/client_state.go
index 8c7a255dfc5..51f826979fd 100644
--- a/modules/light-clients/07-tendermint/types/client_state.go
+++ b/modules/light-clients/07-tendermint/types/client_state.go
@@ -78,6 +78,8 @@ func (cs ClientState) Status(
 	// get latest consensus state from clientStore to check for expiry
 	consState, err := GetConsensusState(clientStore, cdc, cs.GetLatestHeight())
 	if err != nil {
+		// if the client state does not have an associated consensus state for its latest height
+		// then it must be expired
 		return exported.Expired
 	}
 
diff --git a/modules/light-clients/07-tendermint/types/client_state_test.go b/modules/light-clients/07-tendermint/types/client_state_test.go
index b0434579b76..cf52d2996b5 100644
--- a/modules/light-clients/07-tendermint/types/client_state_test.go
+++ b/modules/light-clients/07-tendermint/types/client_state_test.go
@@ -47,10 +47,10 @@ func (suite *TendermintTestSuite) TestStatus() {
 			clientState.FrozenHeight = clienttypes.NewHeight(0, 1)
 			path.EndpointA.SetClientState(clientState)
 		}, exported.Frozen},
-		{"client status is unknown", func() {
+		{"client status without consensus state", func() {
 			clientState.LatestHeight = clientState.LatestHeight.Increment().(clienttypes.Height)
 			path.EndpointA.SetClientState(clientState)
-		}, exported.Unknown},
+		}, exported.Expired},
 		{"client status is expired", func() {
 			suite.coordinator.IncrementTimeBy(clientState.TrustingPeriod)
 		}, exported.Expired},