Try   HackMD

Debugging Multisig Txs

  1. Ensure you have regen-ledger checked out at v5.0.0
  2. Clone github.com/regen-network/cosmos-sdk into the parent directory of regen-ledger, and check out v0.46.7-regen-2

Update regen-ledger's go.mod:

--- a/go.mod
+++ b/go.mod
@@ -170,7 +170,7 @@ require (

 replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1

-replace github.com/cosmos/cosmos-sdk => github.com/regen-network/cosmos-sdk v0.46.7-regen-2
+replace github.com/cosmos/cosmos-sdk => ../cosmos-sdk

 // Fix upstream GHSA-h395-qcrw-5vmq vulnerability.
 // TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409

Add the following PrintLn's in cosmos-sdk:

​--- a/client/tx/tx.go
+++ b/client/tx/tx.go
@@ -3,6 +3,7 @@ package tx
​import (
​       "bufio"
​       "context"
+       b64 "encoding/base64"
​       "encoding/json"
​       "errors"
​       "fmt"
@@ -297,7 +298,12 @@ func Sign(txf Factory, name string, txBuilder client.TxBuilder, overwriteSig boo
​       }

​       // Generate the bytes to be signed.
+       fmt.Println("Signing transaction...")
+       fmt.Printf("    Sign Mode: %s\n", signMode.String())
+       fmt.Printf("    Signer Data: %s\n", signerData)
​       bytesToSign, err := txf.txConfig.SignModeHandler().GetSignBytes(signMode, signerData, txBuilder.GetTx())
+       fmt.Printf("    Sign Bytes (str): %s\n", bytesToSign)
+       fmt.Printf("    Sign Bytes (base64): %s\n", b64.StdEncoding.EncodeToString(bytesToSign))
​       if err != nil {
​               return err

--- a/x/auth/client/cli/tx_multisign.go
+++ b/x/auth/client/cli/tx_multisign.go
@@ -137,6 +137,9 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) (err error) {
                                        PubKey:        sig.PubKey,
                                }

+                               fmt.Println("Verifying signature...")
+                               fmt.Printf("    Sign Mode: %s\n", sig.Data.(*signingtypes.SingleSignatureData).SignMode.String())
+                               fmt.Printf("    Signer Data: %s\n", signingData)
                                err = signing.VerifySignature(sig.PubKey, signingData, sig.Data
, txCfg.SignModeHandler(), txBuilder.GetTx())
                                if err != nil {
                                        addr, _ := sdk.AccAddressFromHexUnsafe(sig.PubKey.Addre
ss().String())
--- a/x/auth/signing/verify.go
+++ b/x/auth/signing/verify.go
@@ -3,6 +3,7 @@ package signing
 import (
        "fmt"

+       b64 "encoding/base64"
        cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
        "github.com/cosmos/cosmos-sdk/crypto/types/multisig"
        sdk "github.com/cosmos/cosmos-sdk/types"
@@ -15,6 +16,8 @@ func VerifySignature(pubKey cryptotypes.PubKey, signerData SignerData, sigData s
        switch data := sigData.(type) {
        case *signing.SingleSignatureData:
                signBytes, err := handler.GetSignBytes(data.SignMode, signerData, tx)
+               fmt.Printf("Sign Bytes (str): %s\n", signBytes)
+               fmt.Printf("Sign Bytes (base64): %s\n", b64.StdEncoding.EncodeToString(signBytes))
                if err != nil {
                        return err
                }

Verify that the contents of "Sign Mode", "Signer Data", and "Sign Bytes" in stdout are the same when the two commands are run:

Transaction signing:

regen tx sign ...

Signature aggregation:

regen tx multisign ...