From 40431ef64671d748be2d83b3d4f66928cab589c1 Mon Sep 17 00:00:00 2001
From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com>
Date: Wed, 14 Sep 2022 18:49:02 -0500
Subject: [PATCH] fix: MsgBeginUnlocking bug (#2746) (#2748)

* fix unlocking bug

* explicitly allow empty coins

* added fixes

* remove white space

(cherry picked from commit 0997049b4c5459fa5161c9b8f2e18869475e360a)

Co-authored-by: Adam Tucker <adam@osmosis.team>
---
 x/lockup/types/msgs.go      |  6 +++---
 x/lockup/types/msgs_test.go | 12 +++++++++++-
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/x/lockup/types/msgs.go b/x/lockup/types/msgs.go
index 1fb8e83d5..b456cc01c 100644
--- a/x/lockup/types/msgs.go
+++ b/x/lockup/types/msgs.go
@@ -111,12 +111,12 @@ func (m MsgBeginUnlocking) ValidateBasic() error {
 		return fmt.Errorf("invalid lockup ID, got %v", m.ID)
 	}
 
-	// only allow unlocks with a single denom
-	if m.Coins.Len() != 1 {
+	// only allow unlocks with a single denom or empty
+	if m.Coins.Len() > 1 {
 		return fmt.Errorf("can only unlock one denom per lock ID, got %v", m.Coins)
 	}
 
-	if !m.Coins.IsAllPositive() {
+	if !m.Coins.Empty() && !m.Coins.IsAllPositive() {
 		return fmt.Errorf("cannot unlock a zero or negative amount")
 	}
 
diff --git a/x/lockup/types/msgs_test.go b/x/lockup/types/msgs_test.go
index 29a1fc807..6d0ab74ed 100644
--- a/x/lockup/types/msgs_test.go
+++ b/x/lockup/types/msgs_test.go
@@ -167,12 +167,22 @@ func TestMsgBeginUnlocking(t *testing.T) {
 			},
 		},
 		{
-			name: "not positive coins amount",
+			name: "zero coins (same as nil)",
 			msg: types.MsgBeginUnlocking{
 				Owner: addr1,
 				ID:    1,
 				Coins: sdk.NewCoins(sdk.NewCoin("test1", sdk.NewInt(0))),
 			},
+			expectPass: true,
+		},
+		{
+			name: "nil coins (unlock by ID)",
+			msg: types.MsgBeginUnlocking{
+				Owner: addr1,
+				ID:    1,
+				Coins: sdk.NewCoins(),
+			},
+			expectPass: true,
 		},
 	}
 
-- 
GitLab