From 7746c8d60bf169eefd6f4339366a096789c10b82 Mon Sep 17 00:00:00 2001
From: Jakob Herlitz <jakob@dydx.exchange>
Date: Tue, 24 Oct 2023 19:24:03 -0700
Subject: [PATCH 1/2] add generic json printer to help format customtypes in
 protos

---
 protocol/lib/json.go                   | 20 ++++++++++++++++++++
 protocol/x/clob/keeper/deleveraging.go | 11 +++++------
 2 files changed, 25 insertions(+), 6 deletions(-)
 create mode 100644 protocol/lib/json.go

diff --git a/protocol/lib/json.go b/protocol/lib/json.go
new file mode 100644
index 0000000000..cbb6be4709
--- /dev/null
+++ b/protocol/lib/json.go
@@ -0,0 +1,20 @@
+package lib
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+// MaybeGetStructJsonString returns the json representation of a struct, or a formatted string using
+// %+v if the json conversion encounters an error.
+func MaybeGetJsonString(i interface{}) string {
+	jsonData, err := json.Marshal(i)
+	if err != nil {
+		return fmt.Sprintf("%+v", i)
+	}
+
+	if jsonData == nil {
+		return "nil"
+	}
+	return string(jsonData)
+}
diff --git a/protocol/x/clob/keeper/deleveraging.go b/protocol/x/clob/keeper/deleveraging.go
index e3248a6e35..28e52b3201 100644
--- a/protocol/x/clob/keeper/deleveraging.go
+++ b/protocol/x/clob/keeper/deleveraging.go
@@ -9,7 +9,6 @@ import (
 	errorsmod "cosmossdk.io/errors"
 
 	gometrics "github.com/armon/go-metrics"
-	"github.com/cometbft/cometbft/libs/log"
 	"github.com/cosmos/cosmos-sdk/telemetry"
 	sdk "github.com/cosmos/cosmos-sdk/types"
 	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
@@ -270,8 +269,8 @@ func (k Keeper) OffsetSubaccountPerpetualPosition(
 					"checkTx", ctx.IsCheckTx(),
 					"perpetualId", perpetualId,
 					"deltaQuantums", deltaQuantums,
-					"liquidatedSubaccount", log.NewLazySprintf("%+v", liquidatedSubaccount),
-					"offsettingSubaccount", log.NewLazySprintf("%+v", offsettingSubaccount),
+					"liquidatedSubaccount", liquidatedSubaccount,
+					"offsettingSubaccount", offsettingSubaccount,
 				)
 				numSubaccountsWithNonOverlappingBankruptcyPrices++
 			}
@@ -346,9 +345,9 @@ func (k Keeper) ProcessDeleveraging(
 		offsettingPositionQuantums.CmpAbs(deltaQuantums) == -1 {
 		return errorsmod.Wrapf(
 			types.ErrInvalidPerpetualPositionSizeDelta,
-			"ProcessDeleveraging: liquidated = (%+v), offsetting = (%+v), perpetual id = (%d), deltaQuantums = (%+v)",
-			liquidatedSubaccount,
-			offsettingSubaccount,
+			"ProcessDeleveraging: liquidated = (%s), offsetting = (%s), perpetual id = (%d), deltaQuantums = (%+v)",
+			lib.MaybeGetJsonString(liquidatedSubaccount),
+			lib.MaybeGetJsonString(offsettingSubaccount),
 			perpetualId,
 			deltaQuantums,
 		)

From e221f800b4748a040bb98d18d09370282be5e3e2 Mon Sep 17 00:00:00 2001
From: Jakob Herlitz <jakob@dydx.exchange>
Date: Wed, 25 Oct 2023 10:36:23 -0700
Subject: [PATCH 2/2] remove unreachable check for nil jsonData

---
 protocol/lib/json.go | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/protocol/lib/json.go b/protocol/lib/json.go
index cbb6be4709..3b10722bb3 100644
--- a/protocol/lib/json.go
+++ b/protocol/lib/json.go
@@ -13,8 +13,5 @@ func MaybeGetJsonString(i interface{}) string {
 		return fmt.Sprintf("%+v", i)
 	}
 
-	if jsonData == nil {
-		return "nil"
-	}
 	return string(jsonData)
 }