From e747c92694ce8347198bb63bcb77eba13e56807c Mon Sep 17 00:00:00 2001 From: metalarm10 Date: Fri, 20 Feb 2026 13:54:54 +0300 Subject: [PATCH 1/3] migrate address reverse-lookup entry alongside key info --- cmd/txd/cosmoscmd/migrate_keyring.go | 48 ++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/cmd/txd/cosmoscmd/migrate_keyring.go b/cmd/txd/cosmoscmd/migrate_keyring.go index df138f0b..25202104 100644 --- a/cmd/txd/cosmoscmd/migrate_keyring.go +++ b/cmd/txd/cosmoscmd/migrate_keyring.go @@ -1,10 +1,15 @@ package cosmoscmd import ( + "encoding/hex" "fmt" "strings" "github.com/99designs/keyring" + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + sdkkeyring "github.com/cosmos/cosmos-sdk/crypto/keyring" sdkversion "github.com/cosmos/cosmos-sdk/version" "github.com/spf13/cobra" ) @@ -95,6 +100,11 @@ func runMigrateKeyring(cmd *cobra.Command, args []string) error { } migrated++ + + // After migrating a .info entry, also migrate its .address reverse-lookup entry. + if strings.HasSuffix(key, ".info") { + migrated += migrateAddressEntry(cmd, srcKr, destKr, item.Data) + } } if migrated == 0 { @@ -106,6 +116,44 @@ func runMigrateKeyring(cmd *cobra.Command, args []string) error { return nil } +// migrateAddressEntry extracts and migrates the corresponding .address reverse-lookup entry. +func migrateAddressEntry(cmd *cobra.Command, srcKr, destKr keyring.Keyring, infoData []byte) int { + ir := codectypes.NewInterfaceRegistry() + cryptocodec.RegisterInterfaces(ir) + cdc := codec.NewProtoCodec(ir) + + var record sdkkeyring.Record + if err := cdc.Unmarshal(infoData, &record); err != nil { + cmd.PrintErrf(" Warning: could not unmarshal record: %v\n", err) + return 0 + } + + pubKey, err := record.GetPubKey() + if err != nil { + cmd.PrintErrf(" Warning: could not extract public key: %v\n", err) + return 0 + } + + addrKey := hex.EncodeToString(pubKey.Address()) + ".address" + + if _, err := destKr.Get(addrKey); err == nil { + return 0 // already exists + } + + addrItem, err := srcKr.Get(addrKey) + if err != nil { + cmd.PrintErrf(" Warning: could not read %q: %v\n", addrKey, err) + return 0 + } + + if err := destKr.Set(addrItem); err != nil { + cmd.PrintErrf(" Warning: could not write %q: %v\n", addrKey, err) + return 0 + } + + return 1 +} + // filterKeys returns keyring entries whose key name matches any of the given names. func filterKeys(allKeys []string, names []string) []string { selected := make(map[string]bool, len(names)) From 4aeeacece3a3b50eef62407c65eac7902943926f Mon Sep 17 00:00:00 2001 From: metalarm10 Date: Fri, 20 Feb 2026 14:12:48 +0300 Subject: [PATCH 2/3] fix log to show correct number of completed migrations --- cmd/txd/cosmoscmd/migrate_keyring.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/txd/cosmoscmd/migrate_keyring.go b/cmd/txd/cosmoscmd/migrate_keyring.go index 25202104..fc3d6070 100644 --- a/cmd/txd/cosmoscmd/migrate_keyring.go +++ b/cmd/txd/cosmoscmd/migrate_keyring.go @@ -103,7 +103,7 @@ func runMigrateKeyring(cmd *cobra.Command, args []string) error { // After migrating a .info entry, also migrate its .address reverse-lookup entry. if strings.HasSuffix(key, ".info") { - migrated += migrateAddressEntry(cmd, srcKr, destKr, item.Data) + migrateAddressEntry(cmd, srcKr, destKr, item.Data) } } From 1c5dd71cb997e87cff0fdacd86b3924fa6c88a5e Mon Sep 17 00:00:00 2001 From: metalarm10 Date: Mon, 23 Feb 2026 23:28:08 +0300 Subject: [PATCH 3/3] fix return type --- cmd/txd/cosmoscmd/migrate_keyring.go | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/cmd/txd/cosmoscmd/migrate_keyring.go b/cmd/txd/cosmoscmd/migrate_keyring.go index fc3d6070..13efd7cf 100644 --- a/cmd/txd/cosmoscmd/migrate_keyring.go +++ b/cmd/txd/cosmoscmd/migrate_keyring.go @@ -103,7 +103,9 @@ func runMigrateKeyring(cmd *cobra.Command, args []string) error { // After migrating a .info entry, also migrate its .address reverse-lookup entry. if strings.HasSuffix(key, ".info") { - migrateAddressEntry(cmd, srcKr, destKr, item.Data) + if err := migrateAddressEntry(srcKr, destKr, item.Data); err != nil { + cmd.PrintErrf(" Warning: could not migrate address entry for %q: %v\n", key, err) + } } } @@ -117,41 +119,37 @@ func runMigrateKeyring(cmd *cobra.Command, args []string) error { } // migrateAddressEntry extracts and migrates the corresponding .address reverse-lookup entry. -func migrateAddressEntry(cmd *cobra.Command, srcKr, destKr keyring.Keyring, infoData []byte) int { +func migrateAddressEntry(srcKr, destKr keyring.Keyring, infoData []byte) error { ir := codectypes.NewInterfaceRegistry() cryptocodec.RegisterInterfaces(ir) cdc := codec.NewProtoCodec(ir) var record sdkkeyring.Record if err := cdc.Unmarshal(infoData, &record); err != nil { - cmd.PrintErrf(" Warning: could not unmarshal record: %v\n", err) - return 0 + return fmt.Errorf("unmarshal record: %w", err) } pubKey, err := record.GetPubKey() if err != nil { - cmd.PrintErrf(" Warning: could not extract public key: %v\n", err) - return 0 + return fmt.Errorf("extract public key: %w", err) } addrKey := hex.EncodeToString(pubKey.Address()) + ".address" if _, err := destKr.Get(addrKey); err == nil { - return 0 // already exists + return nil // already exists } addrItem, err := srcKr.Get(addrKey) if err != nil { - cmd.PrintErrf(" Warning: could not read %q: %v\n", addrKey, err) - return 0 + return fmt.Errorf("read %q from source: %w", addrKey, err) } if err := destKr.Set(addrItem); err != nil { - cmd.PrintErrf(" Warning: could not write %q: %v\n", addrKey, err) - return 0 + return fmt.Errorf("write %q to destination: %w", addrKey, err) } - return 1 + return nil } // filterKeys returns keyring entries whose key name matches any of the given names.