diff --git a/modules/apps/27-interchain-accounts/genesis.go b/modules/apps/27-interchain-accounts/genesis.go index e92d99386dc..e052834b8a5 100644 --- a/modules/apps/27-interchain-accounts/genesis.go +++ b/modules/apps/27-interchain-accounts/genesis.go @@ -24,9 +24,8 @@ func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, state types.GenesisState func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) *types.GenesisState { // TODO: Using a range query with KVStorePrefixIterator export all port IDs // See https://github.com/cosmos/ibc-go/issues/448 - portID := keeper.GetPort(ctx, types.PortID) return &types.GenesisState{ - PortId: portID, + PortId: types.PortID, } } diff --git a/modules/apps/27-interchain-accounts/keeper/keeper.go b/modules/apps/27-interchain-accounts/keeper/keeper.go index 028ab76c1ae..8de1c7181c0 100644 --- a/modules/apps/27-interchain-accounts/keeper/keeper.go +++ b/modules/apps/27-interchain-accounts/keeper/keeper.go @@ -2,6 +2,7 @@ package keeper import ( "fmt" + "strings" baseapp "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" @@ -86,10 +87,20 @@ func (k Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With("module", fmt.Sprintf("x/%s-%s", host.ModuleName, types.ModuleName)) } -// GetPort returns the portID for the interchain accounts module. Used in ExportGenesis -func (k Keeper) GetPort(ctx sdk.Context, portID string) string { +// GetAllPorts returns all ports to which the interchain accounts module is bound. Used in ExportGenesis +func (k Keeper) GetAllPorts(ctx sdk.Context) []string { store := ctx.KVStore(k.storeKey) - return string(store.Get(types.KeyPort(portID))) + iterator := sdk.KVStorePrefixIterator(store, []byte(types.PortKeyPrefix)) + defer iterator.Close() + + var ports []string + for ; iterator.Valid(); iterator.Next() { + keySplit := strings.Split(string(iterator.Key()), "/") + + ports = append(ports, keySplit[1]) + } + + return ports } // BindPort stores the provided portID and binds to it, returning the associated capability diff --git a/modules/apps/27-interchain-accounts/keeper/keeper_test.go b/modules/apps/27-interchain-accounts/keeper/keeper_test.go index 2c4d43571c3..307451fd14b 100644 --- a/modules/apps/27-interchain-accounts/keeper/keeper_test.go +++ b/modules/apps/27-interchain-accounts/keeper/keeper_test.go @@ -108,9 +108,17 @@ func (suite *KeeperTestSuite) TestIsBound() { suite.Require().True(isBound) } -func (suite *KeeperTestSuite) TestGetPort() { - port := suite.chainA.GetSimApp().ICAKeeper.GetPort(suite.chainA.GetContext(), types.PortID) - suite.Require().Equal(string([]byte{0x01}), port) +func (suite *KeeperTestSuite) TestGetAllPorts() { + suite.SetupTest() + path := NewICAPath(suite.chainA, suite.chainB) + suite.coordinator.SetupConnections(path) + + err := SetupICAPath(path, TestOwnerAddress) + suite.Require().NoError(err) + + ports := suite.chainA.GetSimApp().ICAKeeper.GetAllPorts(suite.chainA.GetContext()) + suite.Require().Contains(ports, types.PortID) + suite.Require().Contains(ports, TestPortID) } func (suite *KeeperTestSuite) TestGetInterchainAccountAddress() {