From 4380b260c42ca6a01a3fd26279acd5200a4e94fd Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Thu, 12 Oct 2023 11:10:59 -0600 Subject: [PATCH] fix: cosmwasmpool state export (#6666) * use CosmWasmExtension * add changelog * just implement getId for deserialization * separate method for serializable pools * fix accident * add test --- CHANGELOG.md | 1 + x/cosmwasmpool/genesis.go | 2 +- x/cosmwasmpool/genesis_test.go | 4 ++++ x/cosmwasmpool/model/store_model.go | 2 +- x/cosmwasmpool/pool_module.go | 17 +++++++++++++++++ 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb79eafe7ec..c82b6ea2b57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Bug Fixes * [#6644](https://github.com/osmosis-labs/osmosis/pull/6644) fix: genesis bug in pool incentives linking NoLock gauges and PoolIDs +* [#6666](https://github.com/osmosis-labs/osmosis/pull/6666) fix: cosmwasmpool state export bug * [#6674](https://github.com/osmosis-labs/osmosis/pull/6674) fix: remove dragonberry replace directive ## v19.2.0 diff --git a/x/cosmwasmpool/genesis.go b/x/cosmwasmpool/genesis.go index 351a796abd4..be8cecd696c 100644 --- a/x/cosmwasmpool/genesis.go +++ b/x/cosmwasmpool/genesis.go @@ -26,7 +26,7 @@ func (k *Keeper) InitGenesis(ctx sdk.Context, gen *types.GenesisState, unpacker func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState { params := k.GetParams(ctx) - pools, err := k.GetPools(ctx) + pools, err := k.GetPoolsSerializable(ctx) if err != nil { panic(err) } diff --git a/x/cosmwasmpool/genesis_test.go b/x/cosmwasmpool/genesis_test.go index 637e38b5cac..5d97308c24d 100644 --- a/x/cosmwasmpool/genesis_test.go +++ b/x/cosmwasmpool/genesis_test.go @@ -91,6 +91,10 @@ func (s *PoolModuleSuite) TestExportGenesis() { genesis := s.App.CosmwasmPoolKeeper.ExportGenesis(s.Ctx) s.Require().Len(genesis.Pools, 2) + + for _, pool := range genesis.Pools { + s.Require().Equal("/osmosis.cosmwasmpool.v1beta1.CosmWasmPool", pool.GetTypeUrl()) + } } func (s *PoolModuleSuite) TestMarshalUnmarshalGenesis() { diff --git a/x/cosmwasmpool/model/store_model.go b/x/cosmwasmpool/model/store_model.go index 009eb8ed7f2..592378edf5b 100644 --- a/x/cosmwasmpool/model/store_model.go +++ b/x/cosmwasmpool/model/store_model.go @@ -44,7 +44,7 @@ func (p CosmWasmPool) GetAddress() sdk.AccAddress { } func (p CosmWasmPool) GetId() uint64 { - panic("CosmWasmPool.GetId not implemented") + return p.PoolId } func (p CosmWasmPool) GetSpreadFactor(ctx sdk.Context) osmomath.Dec { diff --git a/x/cosmwasmpool/pool_module.go b/x/cosmwasmpool/pool_module.go index 51496f237ea..b6182100067 100644 --- a/x/cosmwasmpool/pool_module.go +++ b/x/cosmwasmpool/pool_module.go @@ -110,6 +110,23 @@ func (k Keeper) GetPools(ctx sdk.Context) ([]poolmanagertypes.PoolI, error) { ) } +// GetPoolsSerializable retrieves all pool objects stored in the keeper. +// Because the Pool struct has a non-serializable wasmKeeper field, this method +// utilizes the CosmWasmPool struct directly instead, which allows it to be serialized +// in import/export genesis. +func (k Keeper) GetPoolsSerializable(ctx sdk.Context) ([]poolmanagertypes.PoolI, error) { + return osmoutils.GatherValuesFromStorePrefix( + ctx.KVStore(k.storeKey), types.PoolsKey, func(value []byte) (poolmanagertypes.PoolI, error) { + pool := model.CosmWasmPool{} + err := k.cdc.Unmarshal(value, &pool) + if err != nil { + return nil, err + } + return &pool, nil + }, + ) +} + // GetPoolsWithWasmKeeper behaves the same as GetPools, but it also sets the WasmKeeper field of the pool. func (k Keeper) GetPoolsWithWasmKeeper(ctx sdk.Context) ([]poolmanagertypes.PoolI, error) { return osmoutils.GatherValuesFromStorePrefix(