diff --git a/app/upgrades/v6_6_0/upgrade.go b/app/upgrades/v6_6_0/upgrade.go index f8557803..ac235692 100644 --- a/app/upgrades/v6_6_0/upgrade.go +++ b/app/upgrades/v6_6_0/upgrade.go @@ -11,13 +11,16 @@ import ( slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + routertypes "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v7/packetforward/types" icahosttypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types" + "github.com/notional-labs/composable/v6/app/keepers" "github.com/notional-labs/composable/v6/app/upgrades" bech32authmigration "github.com/notional-labs/composable/v6/bech32-migration/auth" bech32govmigration "github.com/notional-labs/composable/v6/bech32-migration/gov" bech32icamigration "github.com/notional-labs/composable/v6/bech32-migration/ica" bech32mintmigration "github.com/notional-labs/composable/v6/bech32-migration/mint" + bech32PfmMigration "github.com/notional-labs/composable/v6/bech32-migration/pfmmiddleware" bech32slashingmigration "github.com/notional-labs/composable/v6/bech32-migration/slashing" bech32stakingmigration "github.com/notional-labs/composable/v6/bech32-migration/staking" bech32transfermiddlewaremigration "github.com/notional-labs/composable/v6/bech32-migration/transfermiddleware" @@ -45,6 +48,7 @@ func CreateUpgradeHandler( bech32mintmigration.MigrateAddressBech32(ctx, keys[minttypes.StoreKey], codec) bech32transfermiddlewaremigration.MigrateAddressBech32(ctx, keys[transfermiddlewaretypes.StoreKey], codec) bech32WasmMigration.MigrateAddressBech32(ctx, keys[wasm.StoreKey], codec) + bech32PfmMigration.MigrateAddressBech32(ctx, keys[routertypes.StoreKey], codec, keepers) return mm.RunMigrations(ctx, configurator, vm) } } diff --git a/app/upgrades/v6_6_0/upgrades_test.go b/app/upgrades/v6_6_0/upgrades_test.go index d726ca98..10e54570 100644 --- a/app/upgrades/v6_6_0/upgrades_test.go +++ b/app/upgrades/v6_6_0/upgrades_test.go @@ -18,6 +18,7 @@ import ( minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + routertypes "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v7/packetforward/types" apptesting "github.com/notional-labs/composable/v6/app" "github.com/notional-labs/composable/v6/bech32-migration/utils" "github.com/stretchr/testify/suite" @@ -58,6 +59,7 @@ func (s *UpgradeTestSuite) TestForMigratingNewPrefix() { prepareForTestingICAHostModule(s) prepareForTestingMintModule(s) prepareForTestingTransferMiddlewareModule(s) + prepareForTestingPfmMiddlewareModule(s) /* == UPGRADE == */ upgradeHeight := int64(5) @@ -72,6 +74,7 @@ func (s *UpgradeTestSuite) TestForMigratingNewPrefix() { checkUpgradeICAHostModule(s) checkUpgradeMintModule(s) checkUpgradeTransferMiddlewareModule(s) + checkUpgradePfmMiddlewareModule(s) } func prepareForTestingGovModule(s *UpgradeTestSuite) (sdk.AccAddress, govtypes.Proposal) { @@ -214,6 +217,37 @@ func prepareForTestingTransferMiddlewareModule(s *UpgradeTestSuite) { s.App.TransferMiddlewareKeeper.SetAllowRlyAddress(s.Ctx, acc1.String()) } +func prepareForTestingPfmMiddlewareModule(s *UpgradeTestSuite) { + store := s.Ctx.KVStore(s.App.GetKey(routertypes.StoreKey)) + inFlightPacket := routertypes.InFlightPacket{ + PacketData: []byte("{\"amount\":\"10000\",\"denom\":\"transfer/channel-6660/ppica\",\"memo\":\"{\\\"forward\\\":{\\\"receiver\\\":\\\"osmo1wkjvpgkuchq0r8425g4z4sf6n85zj5wth3u77y\\\",\\\"port\\\":\\\"transfer\\\",\\\"channel\\\":\\\"channel-9\\\",\\\"timeout\\\":600000000000,\\\"retries\\\":0}}\",\"receiver\":\"centauri1wkjvpgkuchq0r8425g4z4sf6n85zj5wtmqzjv9\",\"sender\":\"osmo1wkjvpgkuchq0r8425g4z4sf6n85zj5wth3u77y\"}"), + OriginalSenderAddress: "centauri1wkjvpgkuchq0r8425g4z4sf6n85zj5wtmqzjv9", + RefundChannelId: "channel-9", + RefundPortId: "transfer", + RefundSequence: 18, + PacketSrcPortId: "transfer", + PacketSrcChannelId: "channel-66660", + + PacketTimeoutTimestamp: 1712153063084849609, + PacketTimeoutHeight: "5-123", + + RetriesRemaining: int32(0), + Timeout: uint64(600000000000), + Nonrefundable: false, + } + + encCdc := apptesting.MakeEncodingConfig() + + key := routertypes.RefundPacketKey("channel-9", "transfer", 0) + bz := encCdc.Amino.MustMarshal(&inFlightPacket) + store.Set(key, bz) + + key = routertypes.RefundPacketKey("channel-9", "transfer", 2) + inFlightPacket.OriginalSenderAddress = "centauri1hj5fveer5cjtn4wd6wstzugjfdxzl0xpzxlwgs" + bz = encCdc.Amino.MustMarshal(&inFlightPacket) + store.Set(key, bz) +} + func checkUpgradeGovModule(s *UpgradeTestSuite, acc1 sdk.AccAddress, proposal govtypes.Proposal) { // CONVERT ACC TO NEW PREFIX _, bz, _ := bech32.DecodeAndConvert(acc1.String()) @@ -409,6 +443,14 @@ func checkUpgradeTransferMiddlewareModule(s *UpgradeTestSuite) { s.Suite.Equal(found, true) } +func checkUpgradePfmMiddlewareModule(s *UpgradeTestSuite) { + data := s.App.RouterKeeper.GetAndClearInFlightPacket(s.Ctx, "channel-9", "transfer", 0) + s.Suite.Equal("pica1wkjvpgkuchq0r8425g4z4sf6n85zj5wtykvtv3", data.OriginalSenderAddress) + + data = s.App.RouterKeeper.GetAndClearInFlightPacket(s.Ctx, "channel-9", "transfer", 2) + s.Suite.Equal("pica1hj5fveer5cjtn4wd6wstzugjfdxzl0xpas3hgy", data.OriginalSenderAddress) +} + func CreateVestingAccount(s *UpgradeTestSuite, ) vestingtypes.ContinuousVestingAccount { str := `{"@type":"/cosmos.vesting.v1beta1.ContinuousVestingAccount","base_vesting_account":{"base_account":{"address":"centauri1alga5e8vr6ccr9yrg0kgxevpt5xgmgrvfkc5p8","pub_key":{"@type":"/cosmos.crypto.multisig.LegacyAminoPubKey","threshold":4,"public_keys":[{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AlnzK22KrkylnvTCvZZc8eZnydtQuzCWLjJJSMFUvVHf"},{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"Aiw2Ftg+fnoHDU7M3b0VMRsI0qurXlerW0ahtfzSDZA4"},{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AvEHv+MVYRVau8FbBcJyG0ql85Tbbn7yhSA0VGmAY4ku"},{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"Az5VHWqi3zMJu1rLGcu2EgNXLLN+al4Dy/lj6UZTzTCl"},{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"Ai4GlSH3uG+joMnAFbQC3jQeHl9FPvVTlRmwIFt7d7TI"},{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A2kAzH2bZr530jmFq/bRFrT2q8SRqdnfIebba+YIBqI1"}]},"account_number":46,"sequence":27},"original_vesting":[{"denom":"stake","amount":"22165200000000"}],"delegated_free":[{"denom":"stake","amount":"443382497453"}],"delegated_vesting":[{"denom":"stake","amount":"22129422502547"}],"end_time":1770994800},"start_time":1676300400}` diff --git a/bech32-migration/pfmmiddleware/pfmmiddleware.go b/bech32-migration/pfmmiddleware/pfmmiddleware.go new file mode 100644 index 00000000..a7f26407 --- /dev/null +++ b/bech32-migration/pfmmiddleware/pfmmiddleware.go @@ -0,0 +1,67 @@ +package pfmmiddleware + +import ( + "encoding/json" + + "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + routertypes "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v7/packetforward/types" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + "github.com/notional-labs/composable/v6/app/keepers" + "github.com/notional-labs/composable/v6/bech32-migration/utils" +) + +func MigrateAddressBech32(ctx sdk.Context, storeKey storetypes.StoreKey, cdc codec.BinaryCodec, keepers *keepers.AppKeepers) { + ctx.Logger().Info("Migration of address bech32 for pfmmiddleware module begin") + totalAddr := uint64(0) + + store := ctx.KVStore(storeKey) + + channelKey := []byte("channel") + iterator := sdk.KVStorePrefixIterator(store, channelKey) + for ; iterator.Valid(); iterator.Next() { + totalAddr++ + fullKey := iterator.Key() + if !store.Has(fullKey) { + continue + } + bz := store.Get(fullKey) + var inFlightPacket routertypes.InFlightPacket + cdc.MustUnmarshal(bz, &inFlightPacket) + inFlightPacket.OriginalSenderAddress = utils.SafeConvertAddress(inFlightPacket.OriginalSenderAddress) + var data transfertypes.FungibleTokenPacketData + if err := transfertypes.ModuleCdc.UnmarshalJSON(inFlightPacket.PacketData, &data); err != nil { + continue + } + data.Receiver = utils.SafeConvertAddress(data.Receiver) + data.Sender = utils.SafeConvertAddress(data.Sender) + + d := make(map[string]interface{}) + err := json.Unmarshal([]byte(data.Memo), &d) + // parse memo + if err == nil && d["forward"] != nil { + var m routertypes.PacketMetadata + err = json.Unmarshal([]byte(data.Memo), &m) + if err != nil { + continue + } + m.Forward.Receiver = utils.SafeConvertAddress(m.Forward.Receiver) + bzM, err := json.Marshal(m) + if err != nil { + continue + } + data.Memo = string(bzM) + } + bz = cdc.MustMarshal(&data) + inFlightPacket.PacketData = bz + bz = cdc.MustMarshal(&inFlightPacket) + totalAddr++ + store.Set(fullKey, bz) + } + + ctx.Logger().Info( + "Migration of address bech32 for pfmmiddleware module done", + "totalAddr", totalAddr, + ) +}