From 57e7a8923ddfc84c56e498a972e55593f699caf3 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Mon, 31 Jul 2023 23:27:17 -0700 Subject: [PATCH 01/21] added logic --- app/upgrades/v16/upgrades.go | 2 +- app/upgrades/v17/twap.go | 50 +++++++++++++++++++++++++++++++++++ app/upgrades/v17/twap_test.go | 49 ++++++++++++++++++++++++++++++++++ app/upgrades/v17/upgrades.go | 6 +++++ x/twap/api_test.go | 2 +- x/twap/keeper.go | 2 +- x/twap/keeper_test.go | 2 +- x/twap/listeners_test.go | 2 +- x/twap/logic.go | 4 +-- x/twap/logic_test.go | 4 +-- x/twap/store.go | 5 ++-- x/twap/store_test.go | 6 ++--- 12 files changed, 120 insertions(+), 14 deletions(-) create mode 100644 app/upgrades/v17/twap.go create mode 100644 app/upgrades/v17/twap_test.go diff --git a/app/upgrades/v16/upgrades.go b/app/upgrades/v16/upgrades.go index 9234578817d..0fb9876d3ec 100644 --- a/app/upgrades/v16/upgrades.go +++ b/app/upgrades/v16/upgrades.go @@ -185,7 +185,7 @@ func CreateUpgradeHandler( for _, twapRecord := range clPoolTwapRecords { twapRecord.LastErrorTime = time.Time{} - keepers.TwapKeeper.StoreNewRecord(ctx, twapRecord) + keepers.TwapKeeper.StoreNewRecord(ctx, twapRecord.Asset0Denom, twapRecord.Asset1Denom, twapRecord) } updateTokenFactoryParams(ctx, keepers.TokenFactoryKeeper) diff --git a/app/upgrades/v17/twap.go b/app/upgrades/v17/twap.go new file mode 100644 index 00000000000..57795a1807f --- /dev/null +++ b/app/upgrades/v17/twap.go @@ -0,0 +1,50 @@ +package v17 + +import ( + "fmt" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/osmosis-labs/osmosis/v17/app/keepers" +) + +func FlipTwapSpotPriceRecords(ctx sdk.Context, poolIds []uint64, keepers *keepers.AppKeepers) error { + for _, poolId := range poolIds { + // check that this is a cl pool + _, err := keepers.ConcentratedLiquidityKeeper.GetConcentratedPoolById(ctx, poolId) + if err != nil { + return err + } + + // check that the twap record exists + clPoolTwapRecords, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, poolId) + if err != nil { + return err + } + + fmt.Println("BEFORE FLIP", clPoolTwapRecords) + + for _, twapRecord := range clPoolTwapRecords { + twapRecord.LastErrorTime = time.Time{} + oldAsset0Denom := twapRecord.Asset0Denom + oldAsset1Denom := twapRecord.Asset1Denom + oldSpotPrice0 := twapRecord.P0LastSpotPrice + oldSpotPrice1 := twapRecord.P1LastSpotPrice + + twapRecord.Asset0Denom = oldAsset1Denom + twapRecord.Asset1Denom = oldAsset0Denom + twapRecord.P0LastSpotPrice = oldSpotPrice1 + twapRecord.P1LastSpotPrice = oldSpotPrice0 + keepers.TwapKeeper.StoreNewRecord(ctx, oldAsset0Denom, oldAsset1Denom, twapRecord) + } + + newRecord, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, poolId) + if err != nil { + return err + } + + fmt.Println("AFTER FLIP", newRecord) + } + return nil +} diff --git a/app/upgrades/v17/twap_test.go b/app/upgrades/v17/twap_test.go new file mode 100644 index 00000000000..6484d834a42 --- /dev/null +++ b/app/upgrades/v17/twap_test.go @@ -0,0 +1,49 @@ +package v17_test + +import ( + "testing" + "time" + + "github.com/stretchr/testify/suite" + + "github.com/osmosis-labs/osmosis/v17/app/apptesting" + v17 "github.com/osmosis-labs/osmosis/v17/app/upgrades/v17" +) + +type TwapUpgradeTestSuite struct { + apptesting.KeeperTestHelper +} + +func (suite *TwapUpgradeTestSuite) SetupTest() { + suite.Setup() +} + +func TestTwapUpgradeTestSuite(t *testing.T) { + suite.Run(t, new(TwapUpgradeTestSuite)) +} + +func (s *TwapUpgradeTestSuite) TestFlipTwapSpotPriceRecords() { + tests := map[string]struct { + poolIds []uint64 + }{ + "success": { + poolIds: []uint64{1}, + }, + } + + for name, tc := range tests { + tc := tc + s.Run(name, func() { + s.SetupTest() + + s.PrepareMultipleConcentratedPools(5) + + // perform bunch of swaps + // let x amount of time run by + // check twap data + s.Ctx.WithBlockTime(s.Ctx.BlockTime().Add(time.Hour * 24)) + err := v17.FlipTwapSpotPriceRecords(s.Ctx, tc.poolIds, &s.App.AppKeepers) + s.Require().NoError(err) + }) + } +} diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index 419e25fdce7..de97e4fd917 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -125,6 +125,12 @@ func CreateUpgradeHandler( // Reset the pool weights upon upgrade. This will add support for CW pools on ProtoRev. keepers.ProtoRevKeeper.SetInfoByPoolType(ctx, types.DefaultPoolTypeInfo) + // // migrate twap records for CL Pools + // err = FlipTwapSpotPriceRecords(ctx, []uint64{1}, keepers) + // if err != nil { + // return nil, err + // } + return migrations, nil } } diff --git a/x/twap/api_test.go b/x/twap/api_test.go index 6656f6f1ff3..ea1f6994be2 100644 --- a/x/twap/api_test.go +++ b/x/twap/api_test.go @@ -122,7 +122,7 @@ func (s *TestSuite) TestGetBeginBlockAccumulatorRecord() { s.Ctx = s.Ctx.WithBlockTime(tc.time) tc.expRecord.Time = tc.time - s.twapkeeper.StoreNewRecord(s.Ctx, tc.startRecord) + s.twapkeeper.StoreNewRecord(s.Ctx, tc.baseDenom, tc.quoteDenom, tc.startRecord) actualRecord, err := s.twapkeeper.GetBeginBlockAccumulatorRecord(s.Ctx, tc.poolId, tc.baseDenom, tc.quoteDenom) diff --git a/x/twap/keeper.go b/x/twap/keeper.go index 92daf2eff97..da95658560c 100644 --- a/x/twap/keeper.go +++ b/x/twap/keeper.go @@ -65,7 +65,7 @@ func (k Keeper) InitGenesis(ctx sdk.Context, genState *types.GenesisState) { }) for _, twap := range genState.Twaps { - k.StoreNewRecord(ctx, twap) + k.StoreNewRecord(ctx, twap.Asset0Denom, twap.Asset1Denom, twap) } } diff --git a/x/twap/keeper_test.go b/x/twap/keeper_test.go index 35c20068f8d..e4fec080c3b 100644 --- a/x/twap/keeper_test.go +++ b/x/twap/keeper_test.go @@ -319,7 +319,7 @@ func (s *TestSuite) setupDefaultPool() (poolId uint64, denomA, denomB string) { // given records. func (s *TestSuite) preSetRecords(records []types.TwapRecord) { for _, record := range records { - s.twapkeeper.StoreNewRecord(s.Ctx, record) + s.twapkeeper.StoreNewRecord(s.Ctx, record.Asset0Denom, record.Asset1Denom, record) } } diff --git a/x/twap/listeners_test.go b/x/twap/listeners_test.go index 76dca526b4a..731f9bdd797 100644 --- a/x/twap/listeners_test.go +++ b/x/twap/listeners_test.go @@ -253,7 +253,7 @@ func (s *TestSuite) TestAfterEpochEnd() { s.Ctx = s.Ctx.WithBlockTime(tPlus10sp5Record.Time) newestRecord := tPlus10sp5Record - s.twapkeeper.StoreNewRecord(s.Ctx, newestRecord) + s.twapkeeper.StoreNewRecord(s.Ctx, newestRecord.Asset0Denom, newestRecord.Asset1Denom, newestRecord) twapsBeforeEpoch, err := s.twapkeeper.GetAllHistoricalTimeIndexedTWAPs(s.Ctx) s.Require().NoError(err) diff --git a/x/twap/logic.go b/x/twap/logic.go index 0b704884926..ed2cdbf87a8 100644 --- a/x/twap/logic.go +++ b/x/twap/logic.go @@ -93,7 +93,7 @@ func (k Keeper) afterCreatePool(ctx sdk.Context, poolId uint64) error { // that there is a swap against this pool in this same block. // furthermore, this protects against an edge case where a pool is created // during EndBlock, after twapkeeper's endblock. - k.StoreNewRecord(ctx, record) + k.StoreNewRecord(ctx, record.Asset0Denom, record.Asset1Denom, record) } k.trackChangedPool(ctx, poolId) return err @@ -148,7 +148,7 @@ func (k Keeper) updateRecords(ctx sdk.Context, poolId uint64) error { if err != nil { return err } - k.StoreNewRecord(ctx, newRecord) + k.StoreNewRecord(ctx, newRecord.Asset0Denom, newRecord.Asset1Denom, newRecord) } return nil } diff --git a/x/twap/logic_test.go b/x/twap/logic_test.go index aa24ebf08e7..cfa9be9260d 100644 --- a/x/twap/logic_test.go +++ b/x/twap/logic_test.go @@ -432,7 +432,7 @@ func (s *TestSuite) TestGetInterpolatedRecord() { for name, test := range tests { s.Run(name, func() { s.SetupTest() - s.twapkeeper.StoreNewRecord(s.Ctx, test.recordsToPreSet) + s.twapkeeper.StoreNewRecord(s.Ctx, test.testDenom0, test.testDenom1, test.recordsToPreSet) interpolatedRecord, err := s.twapkeeper.GetInterpolatedRecord(s.Ctx, test.testPoolId, test.testDenom0, test.testDenom1, test.testTime) if test.expectedErr != nil { @@ -534,7 +534,7 @@ func (s *TestSuite) TestGetInterpolatedRecord_ThreeAsset() { s.Run(name, func() { s.SetupTest() for i := range test.recordsToPreSet { - s.twapkeeper.StoreNewRecord(s.Ctx, test.recordsToPreSet[i]) + s.twapkeeper.StoreNewRecord(s.Ctx, test.recordsToPreSet[i].Asset0Denom, test.recordsToPreSet[i].Asset1Denom, test.recordsToPreSet[i]) interpolatedRecord, err := s.twapkeeper.GetInterpolatedRecord(s.Ctx, baseRecord[i].PoolId, baseRecord[i].Asset0Denom, baseRecord[i].Asset1Denom, test.testTime) if test.expectedErr != nil { diff --git a/x/twap/store.go b/x/twap/store.go index a363271d82d..8e5cb50229b 100644 --- a/x/twap/store.go +++ b/x/twap/store.go @@ -163,9 +163,10 @@ func (k Keeper) getAllHistoricalPoolIndexedTWAPs(ctx sdk.Context) ([]types.TwapR } // StoreNewRecord stores a record, in both the most recent record store and historical stores. -func (k Keeper) StoreNewRecord(ctx sdk.Context, twap types.TwapRecord) { +// NOTE: if it's a new Record make sure to update asset0 and asset1 as well. +func (k Keeper) StoreNewRecord(ctx sdk.Context, asset0 string, asset1 string, twap types.TwapRecord) { store := ctx.KVStore(k.storeKey) - key := types.FormatMostRecentTWAPKey(twap.PoolId, twap.Asset0Denom, twap.Asset1Denom) + key := types.FormatMostRecentTWAPKey(twap.PoolId, asset0, asset1) osmoutils.MustSet(store, key, &twap) k.storeHistoricalTWAP(ctx, twap) } diff --git a/x/twap/store_test.go b/x/twap/store_test.go index e763c7d8115..3941b090a9f 100644 --- a/x/twap/store_test.go +++ b/x/twap/store_test.go @@ -140,7 +140,7 @@ func (s *TestSuite) TestGetAllMostRecentRecordsForPool() { s.Run(name, func() { s.SetupTest() for _, record := range test.recordsToSet { - s.twapkeeper.StoreNewRecord(s.Ctx, record) + s.twapkeeper.StoreNewRecord(s.Ctx, record.Asset0Denom, record.Asset1Denom, record) } actualRecords, err := s.twapkeeper.GetAllMostRecentRecordsForPool(s.Ctx, test.poolId) s.Require().NoError(err) @@ -233,7 +233,7 @@ func (s *TestSuite) TestGetRecordAtOrBeforeTime() { s.Run(name, func() { s.SetupTest() for _, record := range test.recordsToSet { - s.twapkeeper.StoreNewRecord(s.Ctx, record) + s.twapkeeper.StoreNewRecord(s.Ctx, record.Asset0Denom, record.Asset1Denom, record) } record, err := s.twapkeeper.GetRecordAtOrBeforeTime( s.Ctx, @@ -569,7 +569,7 @@ func (s *TestSuite) TestAccumulatorOverflow() { P0ArithmeticTwapAccumulator: accumulatorVal, } - s.twapkeeper.StoreNewRecord(s.Ctx, twapRecordToStore) + s.twapkeeper.StoreNewRecord(s.Ctx, twapRecordToStore.Asset0Denom, twapRecordToStore.Asset1Denom, twapRecordToStore) } }) } From a9b735c637757b0f6d90ab8865f88fe95755810f Mon Sep 17 00:00:00 2001 From: stackman27 Date: Tue, 1 Aug 2023 13:46:45 -0700 Subject: [PATCH 02/21] added upgrade handler test --- app/upgrades/v17/twap.go | 50 ----------------------------------- app/upgrades/v17/twap_test.go | 49 ---------------------------------- app/upgrades/v17/upgrades.go | 49 ++++++++++++++++++++++++++++++---- x/twap/keeper_test.go | 2 +- x/twap/store_test.go | 4 +-- 5 files changed, 47 insertions(+), 107 deletions(-) delete mode 100644 app/upgrades/v17/twap.go delete mode 100644 app/upgrades/v17/twap_test.go diff --git a/app/upgrades/v17/twap.go b/app/upgrades/v17/twap.go deleted file mode 100644 index 57795a1807f..00000000000 --- a/app/upgrades/v17/twap.go +++ /dev/null @@ -1,50 +0,0 @@ -package v17 - -import ( - "fmt" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/osmosis-labs/osmosis/v17/app/keepers" -) - -func FlipTwapSpotPriceRecords(ctx sdk.Context, poolIds []uint64, keepers *keepers.AppKeepers) error { - for _, poolId := range poolIds { - // check that this is a cl pool - _, err := keepers.ConcentratedLiquidityKeeper.GetConcentratedPoolById(ctx, poolId) - if err != nil { - return err - } - - // check that the twap record exists - clPoolTwapRecords, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, poolId) - if err != nil { - return err - } - - fmt.Println("BEFORE FLIP", clPoolTwapRecords) - - for _, twapRecord := range clPoolTwapRecords { - twapRecord.LastErrorTime = time.Time{} - oldAsset0Denom := twapRecord.Asset0Denom - oldAsset1Denom := twapRecord.Asset1Denom - oldSpotPrice0 := twapRecord.P0LastSpotPrice - oldSpotPrice1 := twapRecord.P1LastSpotPrice - - twapRecord.Asset0Denom = oldAsset1Denom - twapRecord.Asset1Denom = oldAsset0Denom - twapRecord.P0LastSpotPrice = oldSpotPrice1 - twapRecord.P1LastSpotPrice = oldSpotPrice0 - keepers.TwapKeeper.StoreNewRecord(ctx, oldAsset0Denom, oldAsset1Denom, twapRecord) - } - - newRecord, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, poolId) - if err != nil { - return err - } - - fmt.Println("AFTER FLIP", newRecord) - } - return nil -} diff --git a/app/upgrades/v17/twap_test.go b/app/upgrades/v17/twap_test.go deleted file mode 100644 index 6484d834a42..00000000000 --- a/app/upgrades/v17/twap_test.go +++ /dev/null @@ -1,49 +0,0 @@ -package v17_test - -import ( - "testing" - "time" - - "github.com/stretchr/testify/suite" - - "github.com/osmosis-labs/osmosis/v17/app/apptesting" - v17 "github.com/osmosis-labs/osmosis/v17/app/upgrades/v17" -) - -type TwapUpgradeTestSuite struct { - apptesting.KeeperTestHelper -} - -func (suite *TwapUpgradeTestSuite) SetupTest() { - suite.Setup() -} - -func TestTwapUpgradeTestSuite(t *testing.T) { - suite.Run(t, new(TwapUpgradeTestSuite)) -} - -func (s *TwapUpgradeTestSuite) TestFlipTwapSpotPriceRecords() { - tests := map[string]struct { - poolIds []uint64 - }{ - "success": { - poolIds: []uint64{1}, - }, - } - - for name, tc := range tests { - tc := tc - s.Run(name, func() { - s.SetupTest() - - s.PrepareMultipleConcentratedPools(5) - - // perform bunch of swaps - // let x amount of time run by - // check twap data - s.Ctx.WithBlockTime(s.Ctx.BlockTime().Add(time.Hour * 24)) - err := v17.FlipTwapSpotPriceRecords(s.Ctx, tc.poolIds, &s.App.AppKeepers) - s.Require().NoError(err) - }) - } -} diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index de97e4fd917..44ba791e6d9 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -125,12 +125,51 @@ func CreateUpgradeHandler( // Reset the pool weights upon upgrade. This will add support for CW pools on ProtoRev. keepers.ProtoRevKeeper.SetInfoByPoolType(ctx, types.DefaultPoolTypeInfo) - // // migrate twap records for CL Pools - // err = FlipTwapSpotPriceRecords(ctx, []uint64{1}, keepers) - // if err != nil { - // return nil, err - // } + // get all the existing CL pools + pools, err := keepers.ConcentratedLiquidityKeeper.GetPools(ctx) + if err != nil { + return nil, err + } + + for _, pool := range pools { + // migrate twap records for CL Pools + err = FlipTwapSpotPriceRecords(ctx, []uint64{pool.GetId()}, keepers) + if err != nil { + return nil, err + } + } return migrations, nil } } + +func FlipTwapSpotPriceRecords(ctx sdk.Context, poolIds []uint64, keepers *keepers.AppKeepers) error { + for _, poolId := range poolIds { + // check that this is a cl pool + _, err := keepers.ConcentratedLiquidityKeeper.GetConcentratedPoolById(ctx, poolId) + if err != nil { + return err + } + + // check that the twap record exists + clPoolTwapRecords, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, poolId) + if err != nil { + return err + } + + for _, twapRecord := range clPoolTwapRecords { + twapRecord.LastErrorTime = time.Time{} + oldAsset0Denom := twapRecord.Asset0Denom + oldAsset1Denom := twapRecord.Asset1Denom + // oldSpotPrice0 := twapRecord.P0LastSpotPrice + // oldSpotPrice1 := twapRecord.P1LastSpotPrice + + twapRecord.Asset0Denom = oldAsset1Denom + twapRecord.Asset1Denom = oldAsset0Denom + // twapRecord.P0LastSpotPrice = oldSpotPrice1 + // twapRecord.P1LastSpotPrice = oldSpotPrice0 + keepers.TwapKeeper.StoreNewRecord(ctx, oldAsset0Denom, oldAsset1Denom, twapRecord) + } + } + return nil +} diff --git a/x/twap/keeper_test.go b/x/twap/keeper_test.go index e4fec080c3b..adee515bb1d 100644 --- a/x/twap/keeper_test.go +++ b/x/twap/keeper_test.go @@ -383,7 +383,7 @@ func (s *TestSuite) createTestRecordsFromTime(t time.Time) (types.TwapRecord, ty // - 3 records at time t // - 3 records t time t + 1 seconds // all returned records belong to the same pool with poolId -func (s *TestSuite) createTestRecordsFromTimeInPool(t time.Time, poolId uint64) (types.TwapRecord, types.TwapRecord, types.TwapRecord, types.TwapRecord, types.TwapRecord, types.TwapRecord, +func (s *TestSuite) CreateTestRecordsFromTimeInPool(t time.Time, poolId uint64) (types.TwapRecord, types.TwapRecord, types.TwapRecord, types.TwapRecord, types.TwapRecord, types.TwapRecord, types.TwapRecord, types.TwapRecord, types.TwapRecord, types.TwapRecord, types.TwapRecord, types.TwapRecord, ) { baseRecordAB := newEmptyPriceRecord(poolId, t, denom0, denom1) diff --git a/x/twap/store_test.go b/x/twap/store_test.go index 3941b090a9f..95ee6296e0b 100644 --- a/x/twap/store_test.go +++ b/x/twap/store_test.go @@ -273,13 +273,13 @@ func (s *TestSuite) TestPruneRecordsBeforeTimeButNewest() { pool5Min2SBaseMsAB, pool5Min2SBaseMsAC, pool5Min2SBaseMsBC, pool5Min1SBaseMsAB, pool5Min1SBaseMsAC, pool5Min1SBaseMsBC, pool5BaseSecBaseMsAB, pool5BaseSecBaseMsAC, pool5BaseSecBaseMsBC, - pool5Plus1SBaseMsAB, pool5Plus1SBaseMsAC, pool5Plus1SBaseMsBC := s.createTestRecordsFromTimeInPool(baseTime, 5) + pool5Plus1SBaseMsAB, pool5Plus1SBaseMsAC, pool5Plus1SBaseMsBC := s.CreateTestRecordsFromTimeInPool(baseTime, 5) // Create 12 records in the same pool from base time - 1 ms, each record with the difference of 1 second between them pool5Min2SMin1MsAB, pool5Min2SMin1MsAC, pool5Min2SMin1MsBC, pool5Min1SMin1MsAB, pool5Min1SMin1MsAC, pool5Min1SMin1MsBC, pool5BaseSecMin1MsAB, pool5BaseSecMin1MsAC, pool5BaseSecMin1MsBC, - pool5Plus1SMin1MsAB, pool5Plus1SMin1MsAC, pool5Plus1SMin1MsBC := s.createTestRecordsFromTimeInPool(baseTime.Add(-time.Millisecond), 5) + pool5Plus1SMin1MsAB, pool5Plus1SMin1MsAC, pool5Plus1SMin1MsBC := s.CreateTestRecordsFromTimeInPool(baseTime.Add(-time.Millisecond), 5) tests := map[string]struct { // order does not follow any specific pattern From 6f0fa47e05d7a858a2b5c024286e103a5325d1e3 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Tue, 1 Aug 2023 13:51:51 -0700 Subject: [PATCH 03/21] added changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b76ad0edcaf..aac78a64011 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#5874](https://github.com/osmosis-labs/osmosis/pull/5874) Remove Partial Migration from superfluid migration to CL * [#5901](https://github.com/osmosis-labs/osmosis/pull/5901) Adding support for CW pools in ProtoRev * [#5937](https://github.com/osmosis-labs/osmosis/pull/5937) feat: add SetScalingFactorController gov prop +* [#5939](https://github.com/osmosis-labs/osmosis/pull/5939) Fix: Flip existing twapRecords base/quote price denoms +* [#5938](https://github.com/osmosis-labs/osmosis/pull/5938) Chore: Fix valset amino codec ### BugFix From 3c34a375abef9cfd88beb801fd972e3725831ef6 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Tue, 1 Aug 2023 15:05:28 -0700 Subject: [PATCH 04/21] flip spot price too --- app/upgrades/v17/upgrades.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index 44ba791e6d9..236d99f517e 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -161,13 +161,13 @@ func FlipTwapSpotPriceRecords(ctx sdk.Context, poolIds []uint64, keepers *keeper twapRecord.LastErrorTime = time.Time{} oldAsset0Denom := twapRecord.Asset0Denom oldAsset1Denom := twapRecord.Asset1Denom - // oldSpotPrice0 := twapRecord.P0LastSpotPrice - // oldSpotPrice1 := twapRecord.P1LastSpotPrice + oldSpotPrice0 := twapRecord.P0LastSpotPrice + oldSpotPrice1 := twapRecord.P1LastSpotPrice twapRecord.Asset0Denom = oldAsset1Denom twapRecord.Asset1Denom = oldAsset0Denom - // twapRecord.P0LastSpotPrice = oldSpotPrice1 - // twapRecord.P1LastSpotPrice = oldSpotPrice0 + twapRecord.P0LastSpotPrice = oldSpotPrice1 + twapRecord.P1LastSpotPrice = oldSpotPrice0 keepers.TwapKeeper.StoreNewRecord(ctx, oldAsset0Denom, oldAsset1Denom, twapRecord) } } From ec0eb1b03fcf2fcfc8651fdc92a955a4ab8e7c67 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Wed, 2 Aug 2023 19:39:35 +0000 Subject: [PATCH 05/21] adams suggestions --- app/upgrades/v17/upgrades.go | 14 ++++++-------- x/concentrated-liquidity/pool.go | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index 236d99f517e..24a9ed064e5 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -125,18 +125,16 @@ func CreateUpgradeHandler( // Reset the pool weights upon upgrade. This will add support for CW pools on ProtoRev. keepers.ProtoRevKeeper.SetInfoByPoolType(ctx, types.DefaultPoolTypeInfo) - // get all the existing CL pools - pools, err := keepers.ConcentratedLiquidityKeeper.GetPools(ctx) + // get all the existing CL pool Ids + poolIds, err := keepers.ConcentratedLiquidityKeeper.GetPoolIds(ctx) if err != nil { return nil, err } - for _, pool := range pools { - // migrate twap records for CL Pools - err = FlipTwapSpotPriceRecords(ctx, []uint64{pool.GetId()}, keepers) - if err != nil { - return nil, err - } + // migrate twap records for CL Pools + err = FlipTwapSpotPriceRecords(ctx, poolIds, keepers) + if err != nil { + return nil, err } return migrations, nil diff --git a/x/concentrated-liquidity/pool.go b/x/concentrated-liquidity/pool.go index 9edf0e46455..374b9fa5448 100644 --- a/x/concentrated-liquidity/pool.go +++ b/x/concentrated-liquidity/pool.go @@ -114,6 +114,22 @@ func (k Keeper) GetPools(ctx sdk.Context) ([]poolmanagertypes.PoolI, error) { ) } +// GetPoolIds returns all the poolIds for CL Pools +func (k Keeper) GetPoolIds(ctx sdk.Context) ([]uint64, error) { + poolIds := []uint64{} + // get all the existing CL pools + pools, err := k.GetPools(ctx) + if err != nil { + return nil, err + } + + for _, pool := range pools { + poolIds = append(poolIds, pool.GetId()) + } + + return poolIds, nil +} + // setPool stores a ConcentratedPoolExtension in the Keeper's KVStore. // It returns an error if the provided pool is not of type *model.Pool. func (k Keeper) setPool(ctx sdk.Context, pool types.ConcentratedPoolExtension) error { From 22e66fd15c7206f8aef1339472d77561bb66145f Mon Sep 17 00:00:00 2001 From: stackman27 Date: Thu, 3 Aug 2023 02:34:04 +0000 Subject: [PATCH 06/21] rebased --- app/upgrades/v17/upgrades.go | 3 +- app/upgrades/v17/upgrades_test.go | 55 +++++++++++++++++++++++++------ 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index 24a9ed064e5..a9dbd6f1696 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -98,7 +98,7 @@ func CreateUpgradeHandler( for _, twapRecord := range clPoolTwapRecords { twapRecord.LastErrorTime = time.Time{} - keepers.TwapKeeper.StoreNewRecord(ctx, twapRecord) + keepers.TwapKeeper.StoreNewRecord(ctx, twapRecord.Asset0Denom, twapRecord.Asset1Denom, twapRecord) } } @@ -166,6 +166,7 @@ func FlipTwapSpotPriceRecords(ctx sdk.Context, poolIds []uint64, keepers *keeper twapRecord.Asset1Denom = oldAsset0Denom twapRecord.P0LastSpotPrice = oldSpotPrice1 twapRecord.P1LastSpotPrice = oldSpotPrice0 + keepers.TwapKeeper.StoreNewRecord(ctx, oldAsset0Denom, oldAsset1Denom, twapRecord) } } diff --git a/app/upgrades/v17/upgrades_test.go b/app/upgrades/v17/upgrades_test.go index 20f72d2f832..9e1ee71aaa7 100644 --- a/app/upgrades/v17/upgrades_test.go +++ b/app/upgrades/v17/upgrades_test.go @@ -4,6 +4,7 @@ import ( "fmt" "sort" "testing" + "time" sdk "github.com/cosmos/cosmos-sdk/types" @@ -19,6 +20,7 @@ import ( v17 "github.com/osmosis-labs/osmosis/v17/app/upgrades/v17" cltypes "github.com/osmosis-labs/osmosis/v17/x/concentrated-liquidity/types" poolmanagertypes "github.com/osmosis-labs/osmosis/v17/x/poolmanager/types" + "github.com/osmosis-labs/osmosis/v17/x/twap/types" ) type UpgradeTestSuite struct { @@ -54,6 +56,21 @@ func dummyUpgrade(suite *UpgradeTestSuite) { suite.Ctx = suite.Ctx.WithBlockHeight(dummyUpgradeHeight) } +func dummyTwapRecord(poolId uint64, t time.Time, asset0 string, asset1 string, sp0, accum0, accum1, geomAccum sdk.Dec) types.TwapRecord { + return types.TwapRecord{ + PoolId: poolId, + Time: t, + Asset0Denom: asset0, + Asset1Denom: asset1, + + P0LastSpotPrice: sp0, + P1LastSpotPrice: sdk.OneDec().Quo(sp0), + P0ArithmeticTwapAccumulator: accum0, + P1ArithmeticTwapAccumulator: accum1, + GeometricTwapAccumulator: geomAccum, + } +} + func (suite *UpgradeTestSuite) TestUpgrade() { upgradeSetup := func() { // This is done to ensure that we run the InitGenesis() logic for the new modules @@ -70,12 +87,12 @@ func (suite *UpgradeTestSuite) TestUpgrade() { testCases := []struct { name string - pre_upgrade func(sdk.Context, *keepers.AppKeepers) (sdk.Coins, uint64) - upgrade func(sdk.Context, *keepers.AppKeepers, sdk.Coins, uint64) + pre_upgrade func(sdk.Context, *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord) + upgrade func(sdk.Context, *keepers.AppKeepers, sdk.Coins, uint64, []types.TwapRecord) }{ { "Test that the upgrade succeeds", - func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64) { + func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord) { upgradeSetup() var lastPoolID uint64 // To keep track of the last assigned pool ID @@ -125,10 +142,21 @@ func (suite *UpgradeTestSuite) TestUpgrade() { lastPoolID = poolID } - return expectedCoinsUsedInUpgradeHandler, lastPoolID + // create few TWAP records for the pools + t1 := dummyTwapRecord(1040, time.Now().Add(-time.Hour*24), "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", sdk.NewDec(2), + sdk.OneDec().MulInt64(10*10+5*10), + sdk.OneDec().MulInt64(3), + sdk.ZeroDec()) + + suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", t1) + + clPoolTwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, 1040) + suite.Require().NoError(err) + + return expectedCoinsUsedInUpgradeHandler, lastPoolID, clPoolTwapRecordPreUpgrade }, - func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64) { + func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64, twapRecord []types.TwapRecord) { stakingParams := suite.App.StakingKeeper.GetParams(suite.Ctx) stakingParams.BondDenom = "uosmo" suite.App.StakingKeeper.SetParams(suite.Ctx, stakingParams) @@ -201,15 +229,22 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.Require().Equal(len(assetPairs), len(migrationInfo.BalancerToConcentratedPoolLinks)) suite.Require().NoError(err) + clPoolTwapRecordPostUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, 1040) + suite.Require().NoError(err) + + for idx := range clPoolTwapRecordPostUpgrade { + suite.Require().Equal(twapRecord[idx].Asset0Denom, clPoolTwapRecordPostUpgrade[idx].Asset1Denom) + suite.Require().Equal(twapRecord[idx].Asset1Denom, clPoolTwapRecordPostUpgrade[idx].Asset0Denom) + } }, }, { "Fails because CFMM pool is not found", - func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64) { + func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord) { upgradeSetup() - return sdk.NewCoins(), 0 + return sdk.NewCoins(), 0, nil }, - func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64) { + func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64, twapRecord []types.TwapRecord) { dummyUpgrade(suite) suite.Require().Panics(func() { suite.App.BeginBlocker(suite.Ctx, abci.RequestBeginBlock{}) @@ -222,8 +257,8 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.Run(fmt.Sprintf("Case %s", tc.name), func() { suite.SetupTest() // reset - expectedCoinsUsedInUpgradeHandler, lastPoolID := tc.pre_upgrade(suite.Ctx, &suite.App.AppKeepers) - tc.upgrade(suite.Ctx, &suite.App.AppKeepers, expectedCoinsUsedInUpgradeHandler, lastPoolID) + expectedCoinsUsedInUpgradeHandler, lastPoolID, twapRecord := tc.pre_upgrade(suite.Ctx, &suite.App.AppKeepers) + tc.upgrade(suite.Ctx, &suite.App.AppKeepers, expectedCoinsUsedInUpgradeHandler, lastPoolID, twapRecord) }) } } From ce8d5f0757794a718dae7f4ca11f11f915a66f27 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Thu, 3 Aug 2023 16:01:09 +0000 Subject: [PATCH 07/21] adams final suggestion --- app/upgrades/v17/upgrades.go | 24 ++++++++++++------------ app/upgrades/v17/upgrades_test.go | 28 +++++++++++++++++----------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index a9dbd6f1696..401770a2fd9 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -33,6 +33,18 @@ func CreateUpgradeHandler( return nil, err } + // get all the existing CL pool Ids + poolIds, err := keepers.ConcentratedLiquidityKeeper.GetPoolIds(ctx) + if err != nil { + return nil, err + } + + // migrate twap records for CL Pools + err = FlipTwapSpotPriceRecords(ctx, poolIds, keepers) + if err != nil { + return nil, err + } + // Get community pool address. communityPoolAddress := keepers.AccountKeeper.GetModuleAddress(distrtypes.ModuleName) @@ -125,18 +137,6 @@ func CreateUpgradeHandler( // Reset the pool weights upon upgrade. This will add support for CW pools on ProtoRev. keepers.ProtoRevKeeper.SetInfoByPoolType(ctx, types.DefaultPoolTypeInfo) - // get all the existing CL pool Ids - poolIds, err := keepers.ConcentratedLiquidityKeeper.GetPoolIds(ctx) - if err != nil { - return nil, err - } - - // migrate twap records for CL Pools - err = FlipTwapSpotPriceRecords(ctx, poolIds, keepers) - if err != nil { - return nil, err - } - return migrations, nil } } diff --git a/app/upgrades/v17/upgrades_test.go b/app/upgrades/v17/upgrades_test.go index 9e1ee71aaa7..4c48bd05b61 100644 --- a/app/upgrades/v17/upgrades_test.go +++ b/app/upgrades/v17/upgrades_test.go @@ -19,8 +19,9 @@ import ( "github.com/osmosis-labs/osmosis/v17/app/keepers" v17 "github.com/osmosis-labs/osmosis/v17/app/upgrades/v17" cltypes "github.com/osmosis-labs/osmosis/v17/x/concentrated-liquidity/types" - poolmanagertypes "github.com/osmosis-labs/osmosis/v17/x/poolmanager/types" "github.com/osmosis-labs/osmosis/v17/x/twap/types" + + poolmanagertypes "github.com/osmosis-labs/osmosis/v17/x/poolmanager/types" ) type UpgradeTestSuite struct { @@ -142,21 +143,25 @@ func (suite *UpgradeTestSuite) TestUpgrade() { lastPoolID = poolID } + // poolId = 1040 + poolId := suite.PrepareConcentratedPoolWithCoins("ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo") + // create few TWAP records for the pools - t1 := dummyTwapRecord(1040, time.Now().Add(-time.Hour*24), "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", sdk.NewDec(2), - sdk.OneDec().MulInt64(10*10+5*10), + t1 := dummyTwapRecord(poolId.GetId(), time.Now().Add(-time.Hour*24), "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", sdk.NewDec(10), + sdk.OneDec().MulInt64(10*10), sdk.OneDec().MulInt64(3), sdk.ZeroDec()) suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", t1) - clPoolTwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, 1040) + clPoolTwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, poolId.GetId()) suite.Require().NoError(err) return expectedCoinsUsedInUpgradeHandler, lastPoolID, clPoolTwapRecordPreUpgrade }, func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64, twapRecord []types.TwapRecord) { + lastPoolID = twapRecord[0].PoolId stakingParams := suite.App.StakingKeeper.GetParams(suite.Ctx) stakingParams.BondDenom = "uosmo" suite.App.StakingKeeper.SetParams(suite.Ctx, stakingParams) @@ -171,6 +176,14 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.App.BeginBlocker(suite.Ctx, abci.RequestBeginBlock{}) }) + clPoolTwapRecordPostUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, 1040) + suite.Require().NoError(err) + + for idx := range clPoolTwapRecordPostUpgrade { + suite.Require().Equal(twapRecord[idx].Asset0Denom, clPoolTwapRecordPostUpgrade[idx].Asset1Denom) + suite.Require().Equal(twapRecord[idx].Asset1Denom, clPoolTwapRecordPostUpgrade[idx].Asset0Denom) + } + // Retrieve the community pool balance (and the feePool balance) after the upgrade communityPoolBalancePost := suite.App.BankKeeper.GetAllBalances(suite.Ctx, communityPoolAddress) feePoolCommunityPoolPost := suite.App.DistrKeeper.GetFeePool(suite.Ctx).CommunityPool @@ -229,13 +242,6 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.Require().Equal(len(assetPairs), len(migrationInfo.BalancerToConcentratedPoolLinks)) suite.Require().NoError(err) - clPoolTwapRecordPostUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, 1040) - suite.Require().NoError(err) - - for idx := range clPoolTwapRecordPostUpgrade { - suite.Require().Equal(twapRecord[idx].Asset0Denom, clPoolTwapRecordPostUpgrade[idx].Asset1Denom) - suite.Require().Equal(twapRecord[idx].Asset1Denom, clPoolTwapRecordPostUpgrade[idx].Asset0Denom) - } }, }, { From 7aaf6329914c008aa4f81cdf1c039bd769225a2a Mon Sep 17 00:00:00 2001 From: stackman27 Date: Thu, 3 Aug 2023 21:38:54 +0000 Subject: [PATCH 08/21] roman comments --- app/upgrades/v17/upgrades.go | 9 +++++++-- x/concentrated-liquidity/pool.go | 16 ---------------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index 401770a2fd9..683eab225f0 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -33,12 +33,17 @@ func CreateUpgradeHandler( return nil, err } - // get all the existing CL pool Ids - poolIds, err := keepers.ConcentratedLiquidityKeeper.GetPoolIds(ctx) + poolIds := []uint64{} + // get all the existing CL pools + pools, err := keepers.ConcentratedLiquidityKeeper.GetPools(ctx) if err != nil { return nil, err } + for _, pool := range pools { + poolIds = append(poolIds, pool.GetId()) + } + // migrate twap records for CL Pools err = FlipTwapSpotPriceRecords(ctx, poolIds, keepers) if err != nil { diff --git a/x/concentrated-liquidity/pool.go b/x/concentrated-liquidity/pool.go index 374b9fa5448..9edf0e46455 100644 --- a/x/concentrated-liquidity/pool.go +++ b/x/concentrated-liquidity/pool.go @@ -114,22 +114,6 @@ func (k Keeper) GetPools(ctx sdk.Context) ([]poolmanagertypes.PoolI, error) { ) } -// GetPoolIds returns all the poolIds for CL Pools -func (k Keeper) GetPoolIds(ctx sdk.Context) ([]uint64, error) { - poolIds := []uint64{} - // get all the existing CL pools - pools, err := k.GetPools(ctx) - if err != nil { - return nil, err - } - - for _, pool := range pools { - poolIds = append(poolIds, pool.GetId()) - } - - return poolIds, nil -} - // setPool stores a ConcentratedPoolExtension in the Keeper's KVStore. // It returns an error if the provided pool is not of type *model.Pool. func (k Keeper) setPool(ctx sdk.Context, pool types.ConcentratedPoolExtension) error { From 166d0f9f7e45657ae3c41a89f6b18f61dd4a0cbc Mon Sep 17 00:00:00 2001 From: stackman27 Date: Fri, 4 Aug 2023 21:20:42 +0000 Subject: [PATCH 09/21] roman suggestion --- app/upgrades/v16/upgrades.go | 2 +- app/upgrades/v17/upgrades.go | 45 ++++++++++++++++++++++++------- app/upgrades/v17/upgrades_test.go | 2 +- x/twap/api_test.go | 2 +- x/twap/export_test.go | 12 ++++----- x/twap/keeper.go | 4 +-- x/twap/keeper_test.go | 2 +- x/twap/listeners_test.go | 2 +- x/twap/logic.go | 4 +-- x/twap/logic_test.go | 4 +-- x/twap/store.go | 23 ++++++++++------ x/twap/store_test.go | 6 ++--- 12 files changed, 70 insertions(+), 38 deletions(-) diff --git a/app/upgrades/v16/upgrades.go b/app/upgrades/v16/upgrades.go index 0fb9876d3ec..9234578817d 100644 --- a/app/upgrades/v16/upgrades.go +++ b/app/upgrades/v16/upgrades.go @@ -185,7 +185,7 @@ func CreateUpgradeHandler( for _, twapRecord := range clPoolTwapRecords { twapRecord.LastErrorTime = time.Time{} - keepers.TwapKeeper.StoreNewRecord(ctx, twapRecord.Asset0Denom, twapRecord.Asset1Denom, twapRecord) + keepers.TwapKeeper.StoreNewRecord(ctx, twapRecord) } updateTokenFactoryParams(ctx, keepers.TokenFactoryKeeper) diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index 683eab225f0..e856dff934a 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -115,7 +115,7 @@ func CreateUpgradeHandler( for _, twapRecord := range clPoolTwapRecords { twapRecord.LastErrorTime = time.Time{} - keepers.TwapKeeper.StoreNewRecord(ctx, twapRecord.Asset0Denom, twapRecord.Asset1Denom, twapRecord) + keepers.TwapKeeper.StoreNewRecord(ctx, twapRecord) } } @@ -147,6 +147,34 @@ func CreateUpgradeHandler( } func FlipTwapSpotPriceRecords(ctx sdk.Context, poolIds []uint64, keepers *keepers.AppKeepers) error { + twapRecordHistoricalTimeIndexed, err := keepers.TwapKeeper.GetAllHistoricalTimeIndexedTWAPs(ctx) + if err != nil { + return err + } + + for _, historicalTwapRecord := range twapRecordHistoricalTimeIndexed { + oldRecord := historicalTwapRecord + historicalTwapRecord.Asset0Denom, historicalTwapRecord.Asset1Denom = oldRecord.Asset1Denom, oldRecord.Asset0Denom + historicalTwapRecord.P0LastSpotPrice, historicalTwapRecord.P1LastSpotPrice = oldRecord.P1LastSpotPrice, oldRecord.P0LastSpotPrice + + keepers.TwapKeeper.StoreHistoricalTWAP(ctx, historicalTwapRecord) + keepers.TwapKeeper.DeleteHistoricalRecord(ctx, oldRecord) + } + + twapRecordHistoricalPoolIndexed, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPs(ctx) + if err != nil { + return err + } + + for _, historicalTwapRecord := range twapRecordHistoricalPoolIndexed { + oldRecord := historicalTwapRecord + historicalTwapRecord.Asset0Denom, historicalTwapRecord.Asset1Denom = oldRecord.Asset1Denom, oldRecord.Asset0Denom + historicalTwapRecord.P0LastSpotPrice, historicalTwapRecord.P1LastSpotPrice = oldRecord.P1LastSpotPrice, oldRecord.P0LastSpotPrice + + keepers.TwapKeeper.StoreHistoricalTWAP(ctx, historicalTwapRecord) + keepers.TwapKeeper.DeleteHistoricalRecord(ctx, oldRecord) + } + for _, poolId := range poolIds { // check that this is a cl pool _, err := keepers.ConcentratedLiquidityKeeper.GetConcentratedPoolById(ctx, poolId) @@ -162,18 +190,15 @@ func FlipTwapSpotPriceRecords(ctx sdk.Context, poolIds []uint64, keepers *keeper for _, twapRecord := range clPoolTwapRecords { twapRecord.LastErrorTime = time.Time{} - oldAsset0Denom := twapRecord.Asset0Denom - oldAsset1Denom := twapRecord.Asset1Denom - oldSpotPrice0 := twapRecord.P0LastSpotPrice - oldSpotPrice1 := twapRecord.P1LastSpotPrice + oldRecord := twapRecord - twapRecord.Asset0Denom = oldAsset1Denom - twapRecord.Asset1Denom = oldAsset0Denom - twapRecord.P0LastSpotPrice = oldSpotPrice1 - twapRecord.P1LastSpotPrice = oldSpotPrice0 + twapRecord.Asset0Denom, twapRecord.Asset1Denom = oldRecord.Asset1Denom, oldRecord.Asset0Denom + twapRecord.P0LastSpotPrice, twapRecord.P1LastSpotPrice = oldRecord.P1LastSpotPrice, oldRecord.P0LastSpotPrice - keepers.TwapKeeper.StoreNewRecord(ctx, oldAsset0Denom, oldAsset1Denom, twapRecord) + keepers.TwapKeeper.StoreNewRecord(ctx, twapRecord) + keepers.TwapKeeper.DeleteOldRecord(ctx, oldRecord) } } + return nil } diff --git a/app/upgrades/v17/upgrades_test.go b/app/upgrades/v17/upgrades_test.go index 4c48bd05b61..a4d35769d91 100644 --- a/app/upgrades/v17/upgrades_test.go +++ b/app/upgrades/v17/upgrades_test.go @@ -152,7 +152,7 @@ func (suite *UpgradeTestSuite) TestUpgrade() { sdk.OneDec().MulInt64(3), sdk.ZeroDec()) - suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", t1) + suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, t1) clPoolTwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, poolId.GetId()) suite.Require().NoError(err) diff --git a/x/twap/api_test.go b/x/twap/api_test.go index ea1f6994be2..6656f6f1ff3 100644 --- a/x/twap/api_test.go +++ b/x/twap/api_test.go @@ -122,7 +122,7 @@ func (s *TestSuite) TestGetBeginBlockAccumulatorRecord() { s.Ctx = s.Ctx.WithBlockTime(tc.time) tc.expRecord.Time = tc.time - s.twapkeeper.StoreNewRecord(s.Ctx, tc.baseDenom, tc.quoteDenom, tc.startRecord) + s.twapkeeper.StoreNewRecord(s.Ctx, tc.startRecord) actualRecord, err := s.twapkeeper.GetBeginBlockAccumulatorRecord(s.Ctx, tc.poolId, tc.baseDenom, tc.quoteDenom) diff --git a/x/twap/export_test.go b/x/twap/export_test.go index 197384db0d1..7f03062c4e0 100644 --- a/x/twap/export_test.go +++ b/x/twap/export_test.go @@ -24,13 +24,13 @@ func (k Keeper) GetRecordAtOrBeforeTime(ctx sdk.Context, poolId uint64, time tim return k.getRecordAtOrBeforeTime(ctx, poolId, time, asset0Denom, asset1Denom) } -func (k Keeper) GetAllHistoricalTimeIndexedTWAPs(ctx sdk.Context) ([]types.TwapRecord, error) { - return k.getAllHistoricalTimeIndexedTWAPs(ctx) -} +// func (k Keeper) GetAllHistoricalTimeIndexedTWAPs(ctx sdk.Context) ([]types.TwapRecord, error) { +// return k.getAllHistoricalTimeIndexedTWAPs(ctx) +// } -func (k Keeper) GetAllHistoricalPoolIndexedTWAPs(ctx sdk.Context) ([]types.TwapRecord, error) { - return k.getAllHistoricalPoolIndexedTWAPs(ctx) -} +// func (k Keeper) GetAllHistoricalPoolIndexedTWAPs(ctx sdk.Context) ([]types.TwapRecord, error) { +// return k.getAllHistoricalPoolIndexedTWAPs(ctx) +//} func (k Keeper) TrackChangedPool(ctx sdk.Context, poolId uint64) { k.trackChangedPool(ctx, poolId) diff --git a/x/twap/keeper.go b/x/twap/keeper.go index da95658560c..c59e4520ea1 100644 --- a/x/twap/keeper.go +++ b/x/twap/keeper.go @@ -65,7 +65,7 @@ func (k Keeper) InitGenesis(ctx sdk.Context, genState *types.GenesisState) { }) for _, twap := range genState.Twaps { - k.StoreNewRecord(ctx, twap.Asset0Denom, twap.Asset1Denom, twap) + k.StoreNewRecord(ctx, twap) } } @@ -73,7 +73,7 @@ func (k Keeper) InitGenesis(ctx sdk.Context, genState *types.GenesisState) { func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState { // These are ordered in increasing order, guaranteed by the iterator // that is prefixed by time. - twapRecords, err := k.getAllHistoricalTimeIndexedTWAPs(ctx) + twapRecords, err := k.GetAllHistoricalTimeIndexedTWAPs(ctx) if err != nil { panic(err) } diff --git a/x/twap/keeper_test.go b/x/twap/keeper_test.go index adee515bb1d..25dbcb67279 100644 --- a/x/twap/keeper_test.go +++ b/x/twap/keeper_test.go @@ -319,7 +319,7 @@ func (s *TestSuite) setupDefaultPool() (poolId uint64, denomA, denomB string) { // given records. func (s *TestSuite) preSetRecords(records []types.TwapRecord) { for _, record := range records { - s.twapkeeper.StoreNewRecord(s.Ctx, record.Asset0Denom, record.Asset1Denom, record) + s.twapkeeper.StoreNewRecord(s.Ctx, record) } } diff --git a/x/twap/listeners_test.go b/x/twap/listeners_test.go index 731f9bdd797..76dca526b4a 100644 --- a/x/twap/listeners_test.go +++ b/x/twap/listeners_test.go @@ -253,7 +253,7 @@ func (s *TestSuite) TestAfterEpochEnd() { s.Ctx = s.Ctx.WithBlockTime(tPlus10sp5Record.Time) newestRecord := tPlus10sp5Record - s.twapkeeper.StoreNewRecord(s.Ctx, newestRecord.Asset0Denom, newestRecord.Asset1Denom, newestRecord) + s.twapkeeper.StoreNewRecord(s.Ctx, newestRecord) twapsBeforeEpoch, err := s.twapkeeper.GetAllHistoricalTimeIndexedTWAPs(s.Ctx) s.Require().NoError(err) diff --git a/x/twap/logic.go b/x/twap/logic.go index ed2cdbf87a8..0b704884926 100644 --- a/x/twap/logic.go +++ b/x/twap/logic.go @@ -93,7 +93,7 @@ func (k Keeper) afterCreatePool(ctx sdk.Context, poolId uint64) error { // that there is a swap against this pool in this same block. // furthermore, this protects against an edge case where a pool is created // during EndBlock, after twapkeeper's endblock. - k.StoreNewRecord(ctx, record.Asset0Denom, record.Asset1Denom, record) + k.StoreNewRecord(ctx, record) } k.trackChangedPool(ctx, poolId) return err @@ -148,7 +148,7 @@ func (k Keeper) updateRecords(ctx sdk.Context, poolId uint64) error { if err != nil { return err } - k.StoreNewRecord(ctx, newRecord.Asset0Denom, newRecord.Asset1Denom, newRecord) + k.StoreNewRecord(ctx, newRecord) } return nil } diff --git a/x/twap/logic_test.go b/x/twap/logic_test.go index cfa9be9260d..aa24ebf08e7 100644 --- a/x/twap/logic_test.go +++ b/x/twap/logic_test.go @@ -432,7 +432,7 @@ func (s *TestSuite) TestGetInterpolatedRecord() { for name, test := range tests { s.Run(name, func() { s.SetupTest() - s.twapkeeper.StoreNewRecord(s.Ctx, test.testDenom0, test.testDenom1, test.recordsToPreSet) + s.twapkeeper.StoreNewRecord(s.Ctx, test.recordsToPreSet) interpolatedRecord, err := s.twapkeeper.GetInterpolatedRecord(s.Ctx, test.testPoolId, test.testDenom0, test.testDenom1, test.testTime) if test.expectedErr != nil { @@ -534,7 +534,7 @@ func (s *TestSuite) TestGetInterpolatedRecord_ThreeAsset() { s.Run(name, func() { s.SetupTest() for i := range test.recordsToPreSet { - s.twapkeeper.StoreNewRecord(s.Ctx, test.recordsToPreSet[i].Asset0Denom, test.recordsToPreSet[i].Asset1Denom, test.recordsToPreSet[i]) + s.twapkeeper.StoreNewRecord(s.Ctx, test.recordsToPreSet[i]) interpolatedRecord, err := s.twapkeeper.GetInterpolatedRecord(s.Ctx, baseRecord[i].PoolId, baseRecord[i].Asset0Denom, baseRecord[i].Asset1Denom, test.testTime) if test.expectedErr != nil { diff --git a/x/twap/store.go b/x/twap/store.go index 8e5cb50229b..02703d13731 100644 --- a/x/twap/store.go +++ b/x/twap/store.go @@ -52,7 +52,7 @@ func (k Keeper) getChangedPools(ctx sdk.Context) []uint64 { } // storeHistoricalTWAP writes a twap to the store, in all needed indexing. -func (k Keeper) storeHistoricalTWAP(ctx sdk.Context, twap types.TwapRecord) { +func (k Keeper) StoreHistoricalTWAP(ctx sdk.Context, twap types.TwapRecord) { store := ctx.KVStore(k.storeKey) key1 := types.FormatHistoricalTimeIndexTWAPKey(twap.Time, twap.PoolId, twap.Asset0Denom, twap.Asset1Denom) key2 := types.FormatHistoricalPoolIndexTWAPKey(twap.PoolId, twap.Asset0Denom, twap.Asset1Denom, twap.Time) @@ -110,12 +110,12 @@ func (k Keeper) pruneRecordsBeforeTimeButNewest(ctx sdk.Context, lastKeptTime ti continue } - k.deleteHistoricalRecord(ctx, twapToRemove) + k.DeleteHistoricalRecord(ctx, twapToRemove) } return nil } -func (k Keeper) deleteHistoricalRecord(ctx sdk.Context, twap types.TwapRecord) { +func (k Keeper) DeleteHistoricalRecord(ctx sdk.Context, twap types.TwapRecord) { store := ctx.KVStore(k.storeKey) key1 := types.FormatHistoricalTimeIndexTWAPKey(twap.Time, twap.PoolId, twap.Asset0Denom, twap.Asset1Denom) key2 := types.FormatHistoricalPoolIndexTWAPKey(twap.PoolId, twap.Asset0Denom, twap.Asset1Denom, twap.Time) @@ -152,23 +152,30 @@ func (k Keeper) GetAllMostRecentRecordsForPool(ctx sdk.Context, poolId uint64) ( } // getAllHistoricalTimeIndexedTWAPs returns all historical TWAPs indexed by time. -func (k Keeper) getAllHistoricalTimeIndexedTWAPs(ctx sdk.Context) ([]types.TwapRecord, error) { +func (k Keeper) GetAllHistoricalTimeIndexedTWAPs(ctx sdk.Context) ([]types.TwapRecord, error) { return osmoutils.GatherValuesFromStorePrefix(ctx.KVStore(k.storeKey), []byte(types.HistoricalTWAPTimeIndexPrefix), types.ParseTwapFromBz) } // getAllHistoricalPoolIndexedTWAPs returns all historical TWAPs indexed by pool id. // nolint: unused -func (k Keeper) getAllHistoricalPoolIndexedTWAPs(ctx sdk.Context) ([]types.TwapRecord, error) { +func (k Keeper) GetAllHistoricalPoolIndexedTWAPs(ctx sdk.Context) ([]types.TwapRecord, error) { return osmoutils.GatherValuesFromStorePrefix(ctx.KVStore(k.storeKey), []byte(types.HistoricalTWAPPoolIndexPrefix), types.ParseTwapFromBz) } // StoreNewRecord stores a record, in both the most recent record store and historical stores. // NOTE: if it's a new Record make sure to update asset0 and asset1 as well. -func (k Keeper) StoreNewRecord(ctx sdk.Context, asset0 string, asset1 string, twap types.TwapRecord) { +func (k Keeper) StoreNewRecord(ctx sdk.Context, twap types.TwapRecord) { store := ctx.KVStore(k.storeKey) - key := types.FormatMostRecentTWAPKey(twap.PoolId, asset0, asset1) + key := types.FormatMostRecentTWAPKey(twap.PoolId, twap.Asset0Denom, twap.Asset1Denom) osmoutils.MustSet(store, key, &twap) - k.storeHistoricalTWAP(ctx, twap) + k.StoreHistoricalTWAP(ctx, twap) +} + +// DeleteOldRecord deletes a record, in both the most recent record store and historical stores. +func (k Keeper) DeleteOldRecord(ctx sdk.Context, twap types.TwapRecord) { + store := ctx.KVStore(k.storeKey) + key := types.FormatMostRecentTWAPKey(twap.PoolId, twap.Asset0Denom, twap.Asset1Denom) + store.Delete(key) } // getRecordAtOrBeforeTime on a given input (id, t, asset0, asset1) diff --git a/x/twap/store_test.go b/x/twap/store_test.go index 95ee6296e0b..49a8ee40416 100644 --- a/x/twap/store_test.go +++ b/x/twap/store_test.go @@ -140,7 +140,7 @@ func (s *TestSuite) TestGetAllMostRecentRecordsForPool() { s.Run(name, func() { s.SetupTest() for _, record := range test.recordsToSet { - s.twapkeeper.StoreNewRecord(s.Ctx, record.Asset0Denom, record.Asset1Denom, record) + s.twapkeeper.StoreNewRecord(s.Ctx, record) } actualRecords, err := s.twapkeeper.GetAllMostRecentRecordsForPool(s.Ctx, test.poolId) s.Require().NoError(err) @@ -233,7 +233,7 @@ func (s *TestSuite) TestGetRecordAtOrBeforeTime() { s.Run(name, func() { s.SetupTest() for _, record := range test.recordsToSet { - s.twapkeeper.StoreNewRecord(s.Ctx, record.Asset0Denom, record.Asset1Denom, record) + s.twapkeeper.StoreNewRecord(s.Ctx, record) } record, err := s.twapkeeper.GetRecordAtOrBeforeTime( s.Ctx, @@ -569,7 +569,7 @@ func (s *TestSuite) TestAccumulatorOverflow() { P0ArithmeticTwapAccumulator: accumulatorVal, } - s.twapkeeper.StoreNewRecord(s.Ctx, twapRecordToStore.Asset0Denom, twapRecordToStore.Asset1Denom, twapRecordToStore) + s.twapkeeper.StoreNewRecord(s.Ctx, twapRecordToStore) } }) } From 3ff7e9062b611a1840fd9e66305d5b8561b2318a Mon Sep 17 00:00:00 2001 From: stackman27 Date: Fri, 4 Aug 2023 21:50:11 +0000 Subject: [PATCH 10/21] cleanup --- app/upgrades/v17/upgrades.go | 14 -------------- app/upgrades/v17/upgrades_test.go | 5 +++++ x/twap/export_test.go | 8 -------- 3 files changed, 5 insertions(+), 22 deletions(-) diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index e856dff934a..b6449d7d04b 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -161,20 +161,6 @@ func FlipTwapSpotPriceRecords(ctx sdk.Context, poolIds []uint64, keepers *keeper keepers.TwapKeeper.DeleteHistoricalRecord(ctx, oldRecord) } - twapRecordHistoricalPoolIndexed, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPs(ctx) - if err != nil { - return err - } - - for _, historicalTwapRecord := range twapRecordHistoricalPoolIndexed { - oldRecord := historicalTwapRecord - historicalTwapRecord.Asset0Denom, historicalTwapRecord.Asset1Denom = oldRecord.Asset1Denom, oldRecord.Asset0Denom - historicalTwapRecord.P0LastSpotPrice, historicalTwapRecord.P1LastSpotPrice = oldRecord.P1LastSpotPrice, oldRecord.P0LastSpotPrice - - keepers.TwapKeeper.StoreHistoricalTWAP(ctx, historicalTwapRecord) - keepers.TwapKeeper.DeleteHistoricalRecord(ctx, oldRecord) - } - for _, poolId := range poolIds { // check that this is a cl pool _, err := keepers.ConcentratedLiquidityKeeper.GetConcentratedPoolById(ctx, poolId) diff --git a/app/upgrades/v17/upgrades_test.go b/app/upgrades/v17/upgrades_test.go index a4d35769d91..90b6bf1a75d 100644 --- a/app/upgrades/v17/upgrades_test.go +++ b/app/upgrades/v17/upgrades_test.go @@ -176,6 +176,11 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.App.BeginBlocker(suite.Ctx, abci.RequestBeginBlock{}) }) + twapRecordHistoricalTimeIndexedPOST, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPs(ctx) + suite.Require().NoError(err) + + fmt.Println("POST UPGRADE: ", twapRecordHistoricalTimeIndexedPOST) + clPoolTwapRecordPostUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, 1040) suite.Require().NoError(err) diff --git a/x/twap/export_test.go b/x/twap/export_test.go index 7f03062c4e0..0b71c82df27 100644 --- a/x/twap/export_test.go +++ b/x/twap/export_test.go @@ -24,14 +24,6 @@ func (k Keeper) GetRecordAtOrBeforeTime(ctx sdk.Context, poolId uint64, time tim return k.getRecordAtOrBeforeTime(ctx, poolId, time, asset0Denom, asset1Denom) } -// func (k Keeper) GetAllHistoricalTimeIndexedTWAPs(ctx sdk.Context) ([]types.TwapRecord, error) { -// return k.getAllHistoricalTimeIndexedTWAPs(ctx) -// } - -// func (k Keeper) GetAllHistoricalPoolIndexedTWAPs(ctx sdk.Context) ([]types.TwapRecord, error) { -// return k.getAllHistoricalPoolIndexedTWAPs(ctx) -//} - func (k Keeper) TrackChangedPool(ctx sdk.Context, poolId uint64) { k.trackChangedPool(ctx, poolId) } From 9e1ed18f367cf16ff5ab9bd691616f29fff959bc Mon Sep 17 00:00:00 2001 From: stackman27 Date: Mon, 7 Aug 2023 16:15:46 +0000 Subject: [PATCH 11/21] romans suggestion --- app/upgrades/v17/upgrades.go | 29 ++++++++++--------- app/upgrades/v17/upgrades_test.go | 48 ++++++++++++------------------- x/twap/store.go | 5 ++++ x/twap/store_test.go | 44 ++++++++++++++++++++++++++++ x/twap/types/keys.go | 33 +++++++++++++++++++++ 5 files changed, 115 insertions(+), 44 deletions(-) diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index b6449d7d04b..7be3fb749f7 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -147,20 +147,6 @@ func CreateUpgradeHandler( } func FlipTwapSpotPriceRecords(ctx sdk.Context, poolIds []uint64, keepers *keepers.AppKeepers) error { - twapRecordHistoricalTimeIndexed, err := keepers.TwapKeeper.GetAllHistoricalTimeIndexedTWAPs(ctx) - if err != nil { - return err - } - - for _, historicalTwapRecord := range twapRecordHistoricalTimeIndexed { - oldRecord := historicalTwapRecord - historicalTwapRecord.Asset0Denom, historicalTwapRecord.Asset1Denom = oldRecord.Asset1Denom, oldRecord.Asset0Denom - historicalTwapRecord.P0LastSpotPrice, historicalTwapRecord.P1LastSpotPrice = oldRecord.P1LastSpotPrice, oldRecord.P0LastSpotPrice - - keepers.TwapKeeper.StoreHistoricalTWAP(ctx, historicalTwapRecord) - keepers.TwapKeeper.DeleteHistoricalRecord(ctx, oldRecord) - } - for _, poolId := range poolIds { // check that this is a cl pool _, err := keepers.ConcentratedLiquidityKeeper.GetConcentratedPoolById(ctx, poolId) @@ -168,6 +154,21 @@ func FlipTwapSpotPriceRecords(ctx sdk.Context, poolIds []uint64, keepers *keeper return err } + // check if the pool is CL osmo/dai pool + twapRecordHistoricalPoolIndexed, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, poolId) + if err != nil { + return err + } + + for _, historicalTwapRecord := range twapRecordHistoricalPoolIndexed { + oldRecord := historicalTwapRecord + historicalTwapRecord.Asset0Denom, historicalTwapRecord.Asset1Denom = oldRecord.Asset1Denom, oldRecord.Asset0Denom + historicalTwapRecord.P0LastSpotPrice, historicalTwapRecord.P1LastSpotPrice = oldRecord.P1LastSpotPrice, oldRecord.P0LastSpotPrice + + keepers.TwapKeeper.StoreHistoricalTWAP(ctx, historicalTwapRecord) + keepers.TwapKeeper.DeleteHistoricalRecord(ctx, oldRecord) + } + // check that the twap record exists clPoolTwapRecords, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, poolId) if err != nil { diff --git a/app/upgrades/v17/upgrades_test.go b/app/upgrades/v17/upgrades_test.go index 90b6bf1a75d..6d64189d8b1 100644 --- a/app/upgrades/v17/upgrades_test.go +++ b/app/upgrades/v17/upgrades_test.go @@ -19,9 +19,8 @@ import ( "github.com/osmosis-labs/osmosis/v17/app/keepers" v17 "github.com/osmosis-labs/osmosis/v17/app/upgrades/v17" cltypes "github.com/osmosis-labs/osmosis/v17/x/concentrated-liquidity/types" - "github.com/osmosis-labs/osmosis/v17/x/twap/types" - poolmanagertypes "github.com/osmosis-labs/osmosis/v17/x/poolmanager/types" + "github.com/osmosis-labs/osmosis/v17/x/twap/types" ) type UpgradeTestSuite struct { @@ -88,12 +87,12 @@ func (suite *UpgradeTestSuite) TestUpgrade() { testCases := []struct { name string - pre_upgrade func(sdk.Context, *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord) - upgrade func(sdk.Context, *keepers.AppKeepers, sdk.Coins, uint64, []types.TwapRecord) + pre_upgrade func(sdk.Context, *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord, []types.TwapRecord) + upgrade func(sdk.Context, *keepers.AppKeepers, sdk.Coins, uint64, []types.TwapRecord, []types.TwapRecord) }{ { "Test that the upgrade succeeds", - func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord) { + func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord, []types.TwapRecord) { upgradeSetup() var lastPoolID uint64 // To keep track of the last assigned pool ID @@ -143,25 +142,27 @@ func (suite *UpgradeTestSuite) TestUpgrade() { lastPoolID = poolID } - // poolId = 1040 - poolId := suite.PrepareConcentratedPoolWithCoins("ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo") + existingPool := suite.PrepareConcentratedPoolWithCoins("ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo") // create few TWAP records for the pools - t1 := dummyTwapRecord(poolId.GetId(), time.Now().Add(-time.Hour*24), "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", sdk.NewDec(10), + t1 := dummyTwapRecord(existingPool.GetId(), time.Now().Add(-time.Hour*24), "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", sdk.NewDec(10), sdk.OneDec().MulInt64(10*10), sdk.OneDec().MulInt64(3), sdk.ZeroDec()) suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, t1) - clPoolTwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, poolId.GetId()) + clPoolTwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, existingPool.GetId()) suite.Require().NoError(err) - return expectedCoinsUsedInUpgradeHandler, lastPoolID, clPoolTwapRecordPreUpgrade + clPoolTwapRecordHistoricalPoolIndex, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, existingPool.GetId()) + suite.Require().NoError(err) + + return expectedCoinsUsedInUpgradeHandler, lastPoolID, clPoolTwapRecordPreUpgrade, clPoolTwapRecordHistoricalPoolIndex }, - func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64, twapRecord []types.TwapRecord) { - lastPoolID = twapRecord[0].PoolId + func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64, clPoolTwapRecordPreUpgrade []types.TwapRecord, clPoolTwapRecordHistoricalPoolIndex []types.TwapRecord) { + lastPoolID = clPoolTwapRecordPreUpgrade[0].GetPoolId() stakingParams := suite.App.StakingKeeper.GetParams(suite.Ctx) stakingParams.BondDenom = "uosmo" suite.App.StakingKeeper.SetParams(suite.Ctx, stakingParams) @@ -176,19 +177,6 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.App.BeginBlocker(suite.Ctx, abci.RequestBeginBlock{}) }) - twapRecordHistoricalTimeIndexedPOST, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPs(ctx) - suite.Require().NoError(err) - - fmt.Println("POST UPGRADE: ", twapRecordHistoricalTimeIndexedPOST) - - clPoolTwapRecordPostUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, 1040) - suite.Require().NoError(err) - - for idx := range clPoolTwapRecordPostUpgrade { - suite.Require().Equal(twapRecord[idx].Asset0Denom, clPoolTwapRecordPostUpgrade[idx].Asset1Denom) - suite.Require().Equal(twapRecord[idx].Asset1Denom, clPoolTwapRecordPostUpgrade[idx].Asset0Denom) - } - // Retrieve the community pool balance (and the feePool balance) after the upgrade communityPoolBalancePost := suite.App.BankKeeper.GetAllBalances(suite.Ctx, communityPoolAddress) feePoolCommunityPoolPost := suite.App.DistrKeeper.GetFeePool(suite.Ctx).CommunityPool @@ -251,11 +239,11 @@ func (suite *UpgradeTestSuite) TestUpgrade() { }, { "Fails because CFMM pool is not found", - func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord) { + func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord, []types.TwapRecord) { upgradeSetup() - return sdk.NewCoins(), 0, nil + return sdk.NewCoins(), 0, nil, nil }, - func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64, twapRecord []types.TwapRecord) { + func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64, clPoolTwapRecordPreUpgrade []types.TwapRecord, clPoolTwapRecordHistoricalPoolIndex []types.TwapRecord) { dummyUpgrade(suite) suite.Require().Panics(func() { suite.App.BeginBlocker(suite.Ctx, abci.RequestBeginBlock{}) @@ -268,8 +256,8 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.Run(fmt.Sprintf("Case %s", tc.name), func() { suite.SetupTest() // reset - expectedCoinsUsedInUpgradeHandler, lastPoolID, twapRecord := tc.pre_upgrade(suite.Ctx, &suite.App.AppKeepers) - tc.upgrade(suite.Ctx, &suite.App.AppKeepers, expectedCoinsUsedInUpgradeHandler, lastPoolID, twapRecord) + expectedCoinsUsedInUpgradeHandler, lastPoolID, clPoolTwapRecordPreUpgrade, clPoolTwapRecordHistoricalPoolIndex := tc.pre_upgrade(suite.Ctx, &suite.App.AppKeepers) + tc.upgrade(suite.Ctx, &suite.App.AppKeepers, expectedCoinsUsedInUpgradeHandler, lastPoolID, clPoolTwapRecordPreUpgrade, clPoolTwapRecordHistoricalPoolIndex) }) } } diff --git a/x/twap/store.go b/x/twap/store.go index 02703d13731..54e2e7b6a03 100644 --- a/x/twap/store.go +++ b/x/twap/store.go @@ -162,6 +162,11 @@ func (k Keeper) GetAllHistoricalPoolIndexedTWAPs(ctx sdk.Context) ([]types.TwapR return osmoutils.GatherValuesFromStorePrefix(ctx.KVStore(k.storeKey), []byte(types.HistoricalTWAPPoolIndexPrefix), types.ParseTwapFromBz) } +// GetAllHistoricalPoolIndexedTWAPsForPoolId returns HistoricalTwapRecord for a pool give poolId. +func (k Keeper) GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx sdk.Context, poolId uint64) ([]types.TwapRecord, error) { + return osmoutils.GatherValuesFromStorePrefixWithKeyParser(ctx.KVStore(k.storeKey), types.FormatKeyPoolTwapRecords(poolId), types.ParseTwapHistoricalPoolIndexedRecordFromBz) +} + // StoreNewRecord stores a record, in both the most recent record store and historical stores. // NOTE: if it's a new Record make sure to update asset0 and asset1 as well. func (k Keeper) StoreNewRecord(ctx sdk.Context, twap types.TwapRecord) { diff --git a/x/twap/store_test.go b/x/twap/store_test.go index 49a8ee40416..f80f3f0708d 100644 --- a/x/twap/store_test.go +++ b/x/twap/store_test.go @@ -574,3 +574,47 @@ func (s *TestSuite) TestAccumulatorOverflow() { }) } } + +func (s *TestSuite) TestGetAllHistoricalPoolIndexedTWAPsForPooId() { + baseRecord := newEmptyPriceRecord(1, baseTime, denom0, denom1) + tPlusOneRecord := newEmptyPriceRecord(1, tPlusOne, denom0, denom1) + tests := map[string]struct { + recordsToSet []types.TwapRecord + poolId uint64 + expectedRecords []types.TwapRecord + }{ + "set single record": { + poolId: 1, + expectedRecords: []types.TwapRecord{baseRecord}, + }, + "query non-existent pool": { + poolId: 2, + expectedRecords: []types.TwapRecord{}, + }, + "set single record, different pool ID": { + poolId: 2, + expectedRecords: []types.TwapRecord{newEmptyPriceRecord(2, baseTime, denom0, denom1)}, + }, + "set two records": { + poolId: 1, + expectedRecords: []types.TwapRecord{baseRecord, tPlusOneRecord}, + }, + } + + for name, test := range tests { + s.Run(name, func() { + s.SetupTest() + twapKeeper := s.twapkeeper + s.preSetRecords(test.expectedRecords) + + // System under test. + actualRecords, err := twapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(s.Ctx, test.poolId) + s.NoError(err) + + // Assertions. + s.Equal(test.expectedRecords, actualRecords) + + }) + } + +} diff --git a/x/twap/types/keys.go b/x/twap/types/keys.go index 8b4f4f7225a..825baf3c1e9 100644 --- a/x/twap/types/keys.go +++ b/x/twap/types/keys.go @@ -3,6 +3,8 @@ package types import ( "errors" fmt "fmt" + "strconv" + "strings" time "time" sdk "github.com/cosmos/cosmos-sdk/types" @@ -46,6 +48,10 @@ var ( // TODO: make utility command to automatically interlace separators +func FormatKeyPoolTwapRecords(poolId uint64) []byte { + return []byte(fmt.Sprintf("%s%d", HistoricalTWAPPoolIndexPrefix, poolId)) +} + func FormatMostRecentTWAPKey(poolId uint64, denom1, denom2 string) []byte { poolIdS := osmoutils.FormatFixedLengthU64(poolId) return []byte(fmt.Sprintf("%s%s%s%s%s%s", mostRecentTWAPsPrefix, poolIdS, KeySeparator, denom1, KeySeparator, denom2)) @@ -92,3 +98,30 @@ func ParseTwapFromBz(bz []byte) (twap TwapRecord, err error) { } return twap, err } + +// ParseTwapHistoricalPoolIndexedRecordFromBz parses through an existing Twap Record by key and returns Twap Record. +func ParseTwapHistoricalPoolIndexedRecordFromBz(key []byte, value []byte) (TwapRecord, error) { + if len(key) == 0 { + return TwapRecord{}, fmt.Errorf("Invalid twap record key") + } + if len(value) == 0 { + return TwapRecord{}, fmt.Errorf("Invalid twap record value") + } + + keyStr := string(key) + twapRecordKeyComponent := strings.Split(keyStr, KeySeparator) + + poolId, err := strconv.ParseUint(twapRecordKeyComponent[1], 10, 64) + if err != nil { + return TwapRecord{}, fmt.Errorf("cannot parse poolId key") + } + + twapRecord, err := ParseTwapFromBz(value) + if err != nil { + return TwapRecord{}, fmt.Errorf("cannot parse TwapRecord value") + } + + twapRecord.PoolId = poolId + + return twapRecord, nil +} From 2a5ac83d8d5ee3bdb50d7f49b744d0033019a390 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Mon, 7 Aug 2023 16:21:50 +0000 Subject: [PATCH 12/21] lint --- x/twap/store.go | 1 - 1 file changed, 1 deletion(-) diff --git a/x/twap/store.go b/x/twap/store.go index 54e2e7b6a03..bcfaf813df6 100644 --- a/x/twap/store.go +++ b/x/twap/store.go @@ -157,7 +157,6 @@ func (k Keeper) GetAllHistoricalTimeIndexedTWAPs(ctx sdk.Context) ([]types.TwapR } // getAllHistoricalPoolIndexedTWAPs returns all historical TWAPs indexed by pool id. -// nolint: unused func (k Keeper) GetAllHistoricalPoolIndexedTWAPs(ctx sdk.Context) ([]types.TwapRecord, error) { return osmoutils.GatherValuesFromStorePrefix(ctx.KVStore(k.storeKey), []byte(types.HistoricalTWAPPoolIndexPrefix), types.ParseTwapFromBz) } From 460dada5ea7d456ec87c5f8ad52f45fa24f627f3 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Mon, 7 Aug 2023 16:36:05 +0000 Subject: [PATCH 13/21] misc cleanup --- app/upgrades/v17/upgrades.go | 1 + x/twap/store.go | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index 7be3fb749f7..7b58bdae46e 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -146,6 +146,7 @@ func CreateUpgradeHandler( } } +// FlipTwapSpotPriceRecords flips the denoms and spot price of twap record of a given pool. func FlipTwapSpotPriceRecords(ctx sdk.Context, poolIds []uint64, keepers *keepers.AppKeepers) error { for _, poolId := range poolIds { // check that this is a cl pool diff --git a/x/twap/store.go b/x/twap/store.go index bcfaf813df6..8cdd6aac7d9 100644 --- a/x/twap/store.go +++ b/x/twap/store.go @@ -167,7 +167,6 @@ func (k Keeper) GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx sdk.Context, poolI } // StoreNewRecord stores a record, in both the most recent record store and historical stores. -// NOTE: if it's a new Record make sure to update asset0 and asset1 as well. func (k Keeper) StoreNewRecord(ctx sdk.Context, twap types.TwapRecord) { store := ctx.KVStore(k.storeKey) key := types.FormatMostRecentTWAPKey(twap.PoolId, twap.Asset0Denom, twap.Asset1Denom) @@ -175,7 +174,7 @@ func (k Keeper) StoreNewRecord(ctx sdk.Context, twap types.TwapRecord) { k.StoreHistoricalTWAP(ctx, twap) } -// DeleteOldRecord deletes a record, in both the most recent record store and historical stores. +// DeleteOldRecord deletes a record, in most recent record store func (k Keeper) DeleteOldRecord(ctx sdk.Context, twap types.TwapRecord) { store := ctx.KVStore(k.storeKey) key := types.FormatMostRecentTWAPKey(twap.PoolId, twap.Asset0Denom, twap.Asset1Denom) From c20d814e949f959eeb6d2195b6d2c0943d77dfa3 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Tue, 8 Aug 2023 03:12:27 +0000 Subject: [PATCH 14/21] added test --- app/upgrades/v17/upgrades_test.go | 42 +++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/app/upgrades/v17/upgrades_test.go b/app/upgrades/v17/upgrades_test.go index 6d64189d8b1..c5804525728 100644 --- a/app/upgrades/v17/upgrades_test.go +++ b/app/upgrades/v17/upgrades_test.go @@ -87,12 +87,12 @@ func (suite *UpgradeTestSuite) TestUpgrade() { testCases := []struct { name string - pre_upgrade func(sdk.Context, *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord, []types.TwapRecord) - upgrade func(sdk.Context, *keepers.AppKeepers, sdk.Coins, uint64, []types.TwapRecord, []types.TwapRecord) + pre_upgrade func(sdk.Context, *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord) + upgrade func(sdk.Context, *keepers.AppKeepers, sdk.Coins, uint64, []types.TwapRecord) }{ { "Test that the upgrade succeeds", - func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord, []types.TwapRecord) { + func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord) { upgradeSetup() var lastPoolID uint64 // To keep track of the last assigned pool ID @@ -155,13 +155,10 @@ func (suite *UpgradeTestSuite) TestUpgrade() { clPoolTwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, existingPool.GetId()) suite.Require().NoError(err) - clPoolTwapRecordHistoricalPoolIndex, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, existingPool.GetId()) - suite.Require().NoError(err) - - return expectedCoinsUsedInUpgradeHandler, lastPoolID, clPoolTwapRecordPreUpgrade, clPoolTwapRecordHistoricalPoolIndex + return expectedCoinsUsedInUpgradeHandler, lastPoolID, clPoolTwapRecordPreUpgrade }, - func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64, clPoolTwapRecordPreUpgrade []types.TwapRecord, clPoolTwapRecordHistoricalPoolIndex []types.TwapRecord) { + func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64, clPoolTwapRecordPreUpgrade []types.TwapRecord) { lastPoolID = clPoolTwapRecordPreUpgrade[0].GetPoolId() stakingParams := suite.App.StakingKeeper.GetParams(suite.Ctx) stakingParams.BondDenom = "uosmo" @@ -171,12 +168,31 @@ func (suite *UpgradeTestSuite) TestUpgrade() { communityPoolAddress := suite.App.AccountKeeper.GetModuleAddress(distrtypes.ModuleName) communityPoolBalancePre := suite.App.BankKeeper.GetAllBalances(suite.Ctx, communityPoolAddress) + clPoolTwapRecordHistoricalPoolIndexPreUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolID) + suite.Require().NoError(err) + // Run upgrade handler. dummyUpgrade(suite) suite.Require().NotPanics(func() { suite.App.BeginBlocker(suite.Ctx, abci.RequestBeginBlock{}) }) + clPoolTwapRecordPostUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, lastPoolID) + suite.Require().NoError(err) + + clPoolTwapRecordHistoricalPoolIndexPostUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolID) + suite.Require().NoError(err) + + for i := range clPoolTwapRecordHistoricalPoolIndexPostUpgrade { + suite.Require().Equal(clPoolTwapRecordHistoricalPoolIndexPreUpgrade[i].Asset0Denom, clPoolTwapRecordHistoricalPoolIndexPostUpgrade[i].Asset1Denom) + suite.Require().Equal(clPoolTwapRecordHistoricalPoolIndexPreUpgrade[i].Asset1Denom, clPoolTwapRecordHistoricalPoolIndexPostUpgrade[i].Asset0Denom) + } + + for i := range clPoolTwapRecordPostUpgrade { + suite.Require().Equal(clPoolTwapRecordPreUpgrade[i].Asset0Denom, clPoolTwapRecordPostUpgrade[i].Asset1Denom) + suite.Require().Equal(clPoolTwapRecordPreUpgrade[i].Asset1Denom, clPoolTwapRecordPostUpgrade[i].Asset0Denom) + } + // Retrieve the community pool balance (and the feePool balance) after the upgrade communityPoolBalancePost := suite.App.BankKeeper.GetAllBalances(suite.Ctx, communityPoolAddress) feePoolCommunityPoolPost := suite.App.DistrKeeper.GetFeePool(suite.Ctx).CommunityPool @@ -239,11 +255,11 @@ func (suite *UpgradeTestSuite) TestUpgrade() { }, { "Fails because CFMM pool is not found", - func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord, []types.TwapRecord) { + func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord) { upgradeSetup() - return sdk.NewCoins(), 0, nil, nil + return sdk.NewCoins(), 0, nil }, - func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64, clPoolTwapRecordPreUpgrade []types.TwapRecord, clPoolTwapRecordHistoricalPoolIndex []types.TwapRecord) { + func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64, clPoolTwapRecordPreUpgrade []types.TwapRecord) { dummyUpgrade(suite) suite.Require().Panics(func() { suite.App.BeginBlocker(suite.Ctx, abci.RequestBeginBlock{}) @@ -256,8 +272,8 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.Run(fmt.Sprintf("Case %s", tc.name), func() { suite.SetupTest() // reset - expectedCoinsUsedInUpgradeHandler, lastPoolID, clPoolTwapRecordPreUpgrade, clPoolTwapRecordHistoricalPoolIndex := tc.pre_upgrade(suite.Ctx, &suite.App.AppKeepers) - tc.upgrade(suite.Ctx, &suite.App.AppKeepers, expectedCoinsUsedInUpgradeHandler, lastPoolID, clPoolTwapRecordPreUpgrade, clPoolTwapRecordHistoricalPoolIndex) + expectedCoinsUsedInUpgradeHandler, lastPoolID, clPoolTwapRecordPreUpgrade := tc.pre_upgrade(suite.Ctx, &suite.App.AppKeepers) + tc.upgrade(suite.Ctx, &suite.App.AppKeepers, expectedCoinsUsedInUpgradeHandler, lastPoolID, clPoolTwapRecordPreUpgrade) }) } } From 21a755262a9715599dae1175a6ad3a11f55f1bb3 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Tue, 8 Aug 2023 06:30:21 +0000 Subject: [PATCH 15/21] more tests --- app/upgrades/v17/upgrades.go | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index 7b58bdae46e..d8ccaace22c 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -17,6 +17,8 @@ import ( "github.com/osmosis-labs/osmosis/v17/app/keepers" "github.com/osmosis-labs/osmosis/v17/app/upgrades" "github.com/osmosis-labs/osmosis/v17/x/protorev/types" + + poolmanagertypes "github.com/osmosis-labs/osmosis/v17/x/poolmanager/types" ) func CreateUpgradeHandler( @@ -33,19 +35,14 @@ func CreateUpgradeHandler( return nil, err } - poolIds := []uint64{} // get all the existing CL pools pools, err := keepers.ConcentratedLiquidityKeeper.GetPools(ctx) if err != nil { return nil, err } - for _, pool := range pools { - poolIds = append(poolIds, pool.GetId()) - } - // migrate twap records for CL Pools - err = FlipTwapSpotPriceRecords(ctx, poolIds, keepers) + err = FlipTwapSpotPriceRecords(ctx, pools, keepers) if err != nil { return nil, err } @@ -147,16 +144,9 @@ func CreateUpgradeHandler( } // FlipTwapSpotPriceRecords flips the denoms and spot price of twap record of a given pool. -func FlipTwapSpotPriceRecords(ctx sdk.Context, poolIds []uint64, keepers *keepers.AppKeepers) error { - for _, poolId := range poolIds { - // check that this is a cl pool - _, err := keepers.ConcentratedLiquidityKeeper.GetConcentratedPoolById(ctx, poolId) - if err != nil { - return err - } - - // check if the pool is CL osmo/dai pool - twapRecordHistoricalPoolIndexed, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, poolId) +func FlipTwapSpotPriceRecords(ctx sdk.Context, pools []poolmanagertypes.PoolI, keepers *keepers.AppKeepers) error { + for _, pool := range pools { + twapRecordHistoricalPoolIndexed, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, pool.GetId()) if err != nil { return err } @@ -171,7 +161,7 @@ func FlipTwapSpotPriceRecords(ctx sdk.Context, poolIds []uint64, keepers *keeper } // check that the twap record exists - clPoolTwapRecords, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, poolId) + clPoolTwapRecords, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, pool.GetId()) if err != nil { return err } From 4ea33fa8248b92b65c17dc271335010d91716985 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Tue, 8 Aug 2023 16:58:40 +0000 Subject: [PATCH 16/21] added verbose tests --- app/upgrades/v17/upgrades.go | 3 +- app/upgrades/v17/upgrades_test.go | 91 +++++++++++++++++++++++++++---- x/twap/store.go | 7 ++- x/twap/types/keys.go | 31 +---------- 4 files changed, 86 insertions(+), 46 deletions(-) diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index d8ccaace22c..3e77493f1d6 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -160,7 +160,6 @@ func FlipTwapSpotPriceRecords(ctx sdk.Context, pools []poolmanagertypes.PoolI, k keepers.TwapKeeper.DeleteHistoricalRecord(ctx, oldRecord) } - // check that the twap record exists clPoolTwapRecords, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, pool.GetId()) if err != nil { return err @@ -174,7 +173,7 @@ func FlipTwapSpotPriceRecords(ctx sdk.Context, pools []poolmanagertypes.PoolI, k twapRecord.P0LastSpotPrice, twapRecord.P1LastSpotPrice = oldRecord.P1LastSpotPrice, oldRecord.P0LastSpotPrice keepers.TwapKeeper.StoreNewRecord(ctx, twapRecord) - keepers.TwapKeeper.DeleteOldRecord(ctx, oldRecord) + keepers.TwapKeeper.DeleteMostRecentRecord(ctx, oldRecord) } } diff --git a/app/upgrades/v17/upgrades_test.go b/app/upgrades/v17/upgrades_test.go index c5804525728..35a8a827849 100644 --- a/app/upgrades/v17/upgrades_test.go +++ b/app/upgrades/v17/upgrades_test.go @@ -143,6 +143,7 @@ func (suite *UpgradeTestSuite) TestUpgrade() { } existingPool := suite.PrepareConcentratedPoolWithCoins("ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo") + existingPool2 := suite.PrepareConcentratedPoolWithCoins("akash", "uosmo") // create few TWAP records for the pools t1 := dummyTwapRecord(existingPool.GetId(), time.Now().Add(-time.Hour*24), "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", sdk.NewDec(10), @@ -150,16 +151,41 @@ func (suite *UpgradeTestSuite) TestUpgrade() { sdk.OneDec().MulInt64(3), sdk.ZeroDec()) + t2 := dummyTwapRecord(existingPool.GetId(), time.Now().Add(-time.Hour*24), "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", sdk.NewDec(30), + sdk.OneDec().MulInt64(10*10+10), + sdk.OneDec().MulInt64(5), + sdk.ZeroDec()) + + t3 := dummyTwapRecord(existingPool.GetId(), time.Now().Add(-time.Hour*24), "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", sdk.NewDec(20), + sdk.OneDec().MulInt64(10*10+10*5), + sdk.OneDec().MulInt64(10), + sdk.ZeroDec()) + + t4 := dummyTwapRecord(existingPool2.GetId(), time.Now().Add(-time.Hour*24), "akash", "uosmo", sdk.NewDec(10), + sdk.OneDec().MulInt64(10*10*10), + sdk.OneDec().MulInt64(5), + sdk.ZeroDec()) + + t5 := dummyTwapRecord(existingPool2.GetId(), time.Now().Add(-time.Hour*24), "akash", "uosmo", sdk.NewDec(20), + sdk.OneDec().MulInt64(10), + sdk.OneDec().MulInt64(2), + sdk.ZeroDec()) + suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, t1) + suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, t2) + suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, t3) + suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, t4) + suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, t5) - clPoolTwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, existingPool.GetId()) + clPool2TwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, existingPool2.GetId()) suite.Require().NoError(err) - return expectedCoinsUsedInUpgradeHandler, lastPoolID, clPoolTwapRecordPreUpgrade + return expectedCoinsUsedInUpgradeHandler, lastPoolID, clPool2TwapRecordPreUpgrade }, func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64, clPoolTwapRecordPreUpgrade []types.TwapRecord) { lastPoolID = clPoolTwapRecordPreUpgrade[0].GetPoolId() + lastPoolIdMinusOne := lastPoolID - 1 stakingParams := suite.App.StakingKeeper.GetParams(suite.Ctx) stakingParams.BondDenom = "uosmo" suite.App.StakingKeeper.SetParams(suite.Ctx, stakingParams) @@ -168,7 +194,19 @@ func (suite *UpgradeTestSuite) TestUpgrade() { communityPoolAddress := suite.App.AccountKeeper.GetModuleAddress(distrtypes.ModuleName) communityPoolBalancePre := suite.App.BankKeeper.GetAllBalances(suite.Ctx, communityPoolAddress) - clPoolTwapRecordHistoricalPoolIndexPreUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolID) + clPool1TwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, lastPoolIdMinusOne) + suite.Require().NoError(err) + + clPool1TwapRecordHistoricalPoolIndexPreUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolIdMinusOne) + suite.Require().NoError(err) + + clPool2TwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, lastPoolID) + suite.Require().NoError(err) + + clPool2TwapRecordHistoricalPoolIndexPreUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolID) + suite.Require().NoError(err) + + clPoolsTwapRecordHistoricalTimeIndexPreUpgrade, err := keepers.TwapKeeper.GetAllHistoricalTimeIndexedTWAPs(ctx) suite.Require().NoError(err) // Run upgrade handler. @@ -177,20 +215,51 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.App.BeginBlocker(suite.Ctx, abci.RequestBeginBlock{}) }) - clPoolTwapRecordPostUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, lastPoolID) + clPool1TwapRecordPostUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, lastPoolIdMinusOne) + suite.Require().NoError(err) + + clPool1TwapRecordHistoricalPoolIndexPostUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolIdMinusOne) + suite.Require().NoError(err) + + clPool2TwapRecordPostUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, lastPoolID) + suite.Require().NoError(err) + + clPool2TwapRecordHistoricalPoolIndexPostUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolID) suite.Require().NoError(err) - clPoolTwapRecordHistoricalPoolIndexPostUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolID) + clPoolsTwapRecordHistoricalTimeIndexPostUpgrade, err := keepers.TwapKeeper.GetAllHistoricalTimeIndexedTWAPs(ctx) suite.Require().NoError(err) - for i := range clPoolTwapRecordHistoricalPoolIndexPostUpgrade { - suite.Require().Equal(clPoolTwapRecordHistoricalPoolIndexPreUpgrade[i].Asset0Denom, clPoolTwapRecordHistoricalPoolIndexPostUpgrade[i].Asset1Denom) - suite.Require().Equal(clPoolTwapRecordHistoricalPoolIndexPreUpgrade[i].Asset1Denom, clPoolTwapRecordHistoricalPoolIndexPostUpgrade[i].Asset0Denom) + suite.Require().NotEmpty(clPool1TwapRecordPostUpgrade, "Most recent TWAP records should not be empty after upgrade.") + suite.Require().NotEmpty(clPool1TwapRecordHistoricalPoolIndexPostUpgrade, "Historical Pool Index TWAP record should not be empty after upgrade") + suite.Require().NotEmpty(clPool2TwapRecordPostUpgrade, "Most recent TWAP records should not be empty after upgrade.") + suite.Require().NotEmpty(clPool2TwapRecordHistoricalPoolIndexPostUpgrade, "Historical Pool Index TWAP record should not be empty after upgrade") + + for i := range clPool1TwapRecordPostUpgrade { + suite.Require().Equal(clPool1TwapRecordPreUpgrade[i].Asset0Denom, clPool1TwapRecordPostUpgrade[i].Asset1Denom) + suite.Require().Equal(clPool1TwapRecordPreUpgrade[i].Asset1Denom, clPool1TwapRecordPostUpgrade[i].Asset0Denom) } - for i := range clPoolTwapRecordPostUpgrade { - suite.Require().Equal(clPoolTwapRecordPreUpgrade[i].Asset0Denom, clPoolTwapRecordPostUpgrade[i].Asset1Denom) - suite.Require().Equal(clPoolTwapRecordPreUpgrade[i].Asset1Denom, clPoolTwapRecordPostUpgrade[i].Asset0Denom) + for i := range clPool1TwapRecordHistoricalPoolIndexPostUpgrade { + suite.Require().Equal(clPool1TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset0Denom, clPool1TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset1Denom) + suite.Require().Equal(clPool1TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset1Denom, clPool1TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset0Denom) + } + + for i := range clPool2TwapRecordPostUpgrade { + suite.Require().Equal(clPool2TwapRecordPreUpgrade[i].Asset0Denom, clPool2TwapRecordPostUpgrade[i].Asset1Denom) + suite.Require().Equal(clPool2TwapRecordPreUpgrade[i].Asset1Denom, clPool2TwapRecordPostUpgrade[i].Asset0Denom) + } + + for i := range clPool2TwapRecordHistoricalPoolIndexPostUpgrade { + suite.Require().Equal(clPool2TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset0Denom, clPool2TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset1Denom) + suite.Require().Equal(clPool2TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset1Denom, clPool2TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset0Denom) + } + + for i := range clPoolsTwapRecordHistoricalTimeIndexPostUpgrade { + if (clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].PoolId == lastPoolID) || (clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].PoolId == lastPoolIdMinusOne) { + suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i].Asset0Denom, clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].Asset1Denom) + suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i].Asset1Denom, clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].Asset0Denom) + } } // Retrieve the community pool balance (and the feePool balance) after the upgrade diff --git a/x/twap/store.go b/x/twap/store.go index 8cdd6aac7d9..f1f67f43f0b 100644 --- a/x/twap/store.go +++ b/x/twap/store.go @@ -163,7 +163,7 @@ func (k Keeper) GetAllHistoricalPoolIndexedTWAPs(ctx sdk.Context) ([]types.TwapR // GetAllHistoricalPoolIndexedTWAPsForPoolId returns HistoricalTwapRecord for a pool give poolId. func (k Keeper) GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx sdk.Context, poolId uint64) ([]types.TwapRecord, error) { - return osmoutils.GatherValuesFromStorePrefixWithKeyParser(ctx.KVStore(k.storeKey), types.FormatKeyPoolTwapRecords(poolId), types.ParseTwapHistoricalPoolIndexedRecordFromBz) + return osmoutils.GatherValuesFromStorePrefix(ctx.KVStore(k.storeKey), types.FormatKeyPoolTwapRecords(poolId), types.ParseTwapFromBz) } // StoreNewRecord stores a record, in both the most recent record store and historical stores. @@ -174,8 +174,9 @@ func (k Keeper) StoreNewRecord(ctx sdk.Context, twap types.TwapRecord) { k.StoreHistoricalTWAP(ctx, twap) } -// DeleteOldRecord deletes a record, in most recent record store -func (k Keeper) DeleteOldRecord(ctx sdk.Context, twap types.TwapRecord) { +// DeleteMostRecentRecord deletes a given record in most recent record store. +// Note that if there are entries in historical indexes for this record, they are not deleted by this method. +func (k Keeper) DeleteMostRecentRecord(ctx sdk.Context, twap types.TwapRecord) { store := ctx.KVStore(k.storeKey) key := types.FormatMostRecentTWAPKey(twap.PoolId, twap.Asset0Denom, twap.Asset1Denom) store.Delete(key) diff --git a/x/twap/types/keys.go b/x/twap/types/keys.go index 825baf3c1e9..a1a003f8064 100644 --- a/x/twap/types/keys.go +++ b/x/twap/types/keys.go @@ -2,9 +2,7 @@ package types import ( "errors" - fmt "fmt" - "strconv" - "strings" + "fmt" time "time" sdk "github.com/cosmos/cosmos-sdk/types" @@ -98,30 +96,3 @@ func ParseTwapFromBz(bz []byte) (twap TwapRecord, err error) { } return twap, err } - -// ParseTwapHistoricalPoolIndexedRecordFromBz parses through an existing Twap Record by key and returns Twap Record. -func ParseTwapHistoricalPoolIndexedRecordFromBz(key []byte, value []byte) (TwapRecord, error) { - if len(key) == 0 { - return TwapRecord{}, fmt.Errorf("Invalid twap record key") - } - if len(value) == 0 { - return TwapRecord{}, fmt.Errorf("Invalid twap record value") - } - - keyStr := string(key) - twapRecordKeyComponent := strings.Split(keyStr, KeySeparator) - - poolId, err := strconv.ParseUint(twapRecordKeyComponent[1], 10, 64) - if err != nil { - return TwapRecord{}, fmt.Errorf("cannot parse poolId key") - } - - twapRecord, err := ParseTwapFromBz(value) - if err != nil { - return TwapRecord{}, fmt.Errorf("cannot parse TwapRecord value") - } - - twapRecord.PoolId = poolId - - return twapRecord, nil -} From fe7d3bd3079e38b54e74150f02efe7073be9b947 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Tue, 8 Aug 2023 17:03:05 +0000 Subject: [PATCH 17/21] nit --- x/twap/export_test.go | 4 ++++ x/twap/store.go | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/x/twap/export_test.go b/x/twap/export_test.go index 0b71c82df27..18ce015704e 100644 --- a/x/twap/export_test.go +++ b/x/twap/export_test.go @@ -28,6 +28,10 @@ func (k Keeper) TrackChangedPool(ctx sdk.Context, poolId uint64) { k.trackChangedPool(ctx, poolId) } +func (k Keeper) GetAllHistoricalPoolIndexedTWAPs(ctx sdk.Context) ([]types.TwapRecord, error) { + return k.getAllHistoricalPoolIndexedTWAPs(ctx) +} + func (k Keeper) GetChangedPools(ctx sdk.Context) []uint64 { return k.getChangedPools(ctx) } diff --git a/x/twap/store.go b/x/twap/store.go index f1f67f43f0b..b86872da12b 100644 --- a/x/twap/store.go +++ b/x/twap/store.go @@ -157,7 +157,7 @@ func (k Keeper) GetAllHistoricalTimeIndexedTWAPs(ctx sdk.Context) ([]types.TwapR } // getAllHistoricalPoolIndexedTWAPs returns all historical TWAPs indexed by pool id. -func (k Keeper) GetAllHistoricalPoolIndexedTWAPs(ctx sdk.Context) ([]types.TwapRecord, error) { +func (k Keeper) getAllHistoricalPoolIndexedTWAPs(ctx sdk.Context) ([]types.TwapRecord, error) { return osmoutils.GatherValuesFromStorePrefix(ctx.KVStore(k.storeKey), []byte(types.HistoricalTWAPPoolIndexPrefix), types.ParseTwapFromBz) } From fd6f19fcd6c0655505ad520a323045dc85065254 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Tue, 8 Aug 2023 17:55:52 +0000 Subject: [PATCH 18/21] romans comment for different twap request --- app/upgrades/v17/upgrades_test.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/app/upgrades/v17/upgrades_test.go b/app/upgrades/v17/upgrades_test.go index 35a8a827849..f6d8f97f2c4 100644 --- a/app/upgrades/v17/upgrades_test.go +++ b/app/upgrades/v17/upgrades_test.go @@ -151,12 +151,12 @@ func (suite *UpgradeTestSuite) TestUpgrade() { sdk.OneDec().MulInt64(3), sdk.ZeroDec()) - t2 := dummyTwapRecord(existingPool.GetId(), time.Now().Add(-time.Hour*24), "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", sdk.NewDec(30), + t2 := dummyTwapRecord(existingPool.GetId(), time.Now().Add(-time.Hour*10), "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", sdk.NewDec(30), sdk.OneDec().MulInt64(10*10+10), sdk.OneDec().MulInt64(5), sdk.ZeroDec()) - t3 := dummyTwapRecord(existingPool.GetId(), time.Now().Add(-time.Hour*24), "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", sdk.NewDec(20), + t3 := dummyTwapRecord(existingPool.GetId(), time.Now().Add(-time.Hour), "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", sdk.NewDec(20), sdk.OneDec().MulInt64(10*10+10*5), sdk.OneDec().MulInt64(10), sdk.ZeroDec()) @@ -166,7 +166,7 @@ func (suite *UpgradeTestSuite) TestUpgrade() { sdk.OneDec().MulInt64(5), sdk.ZeroDec()) - t5 := dummyTwapRecord(existingPool2.GetId(), time.Now().Add(-time.Hour*24), "akash", "uosmo", sdk.NewDec(20), + t5 := dummyTwapRecord(existingPool2.GetId(), time.Now().Add(-time.Hour), "akash", "uosmo", sdk.NewDec(20), sdk.OneDec().MulInt64(10), sdk.OneDec().MulInt64(2), sdk.ZeroDec()) @@ -238,27 +238,37 @@ func (suite *UpgradeTestSuite) TestUpgrade() { for i := range clPool1TwapRecordPostUpgrade { suite.Require().Equal(clPool1TwapRecordPreUpgrade[i].Asset0Denom, clPool1TwapRecordPostUpgrade[i].Asset1Denom) suite.Require().Equal(clPool1TwapRecordPreUpgrade[i].Asset1Denom, clPool1TwapRecordPostUpgrade[i].Asset0Denom) + suite.Require().Equal(clPool1TwapRecordPreUpgrade[i].P0LastSpotPrice, clPool1TwapRecordPostUpgrade[i].P1LastSpotPrice) + suite.Require().Equal(clPool1TwapRecordPreUpgrade[i].P1LastSpotPrice, clPool1TwapRecordPostUpgrade[i].P0LastSpotPrice) } for i := range clPool1TwapRecordHistoricalPoolIndexPostUpgrade { suite.Require().Equal(clPool1TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset0Denom, clPool1TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset1Denom) suite.Require().Equal(clPool1TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset1Denom, clPool1TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset0Denom) + suite.Require().Equal(clPool1TwapRecordHistoricalPoolIndexPreUpgrade[i].P0LastSpotPrice, clPool1TwapRecordHistoricalPoolIndexPostUpgrade[i].P1LastSpotPrice) + suite.Require().Equal(clPool1TwapRecordHistoricalPoolIndexPreUpgrade[i].P1LastSpotPrice, clPool1TwapRecordHistoricalPoolIndexPostUpgrade[i].P0LastSpotPrice) } for i := range clPool2TwapRecordPostUpgrade { suite.Require().Equal(clPool2TwapRecordPreUpgrade[i].Asset0Denom, clPool2TwapRecordPostUpgrade[i].Asset1Denom) suite.Require().Equal(clPool2TwapRecordPreUpgrade[i].Asset1Denom, clPool2TwapRecordPostUpgrade[i].Asset0Denom) + suite.Require().Equal(clPool2TwapRecordPreUpgrade[i].P0LastSpotPrice, clPool2TwapRecordPostUpgrade[i].P1LastSpotPrice) + suite.Require().Equal(clPool2TwapRecordPreUpgrade[i].P1LastSpotPrice, clPool2TwapRecordPostUpgrade[i].P0LastSpotPrice) } for i := range clPool2TwapRecordHistoricalPoolIndexPostUpgrade { suite.Require().Equal(clPool2TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset0Denom, clPool2TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset1Denom) suite.Require().Equal(clPool2TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset1Denom, clPool2TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset0Denom) + suite.Require().Equal(clPool2TwapRecordHistoricalPoolIndexPreUpgrade[i].P0LastSpotPrice, clPool2TwapRecordHistoricalPoolIndexPostUpgrade[i].P1LastSpotPrice) + suite.Require().Equal(clPool2TwapRecordHistoricalPoolIndexPreUpgrade[i].P1LastSpotPrice, clPool2TwapRecordHistoricalPoolIndexPostUpgrade[i].P0LastSpotPrice) } for i := range clPoolsTwapRecordHistoricalTimeIndexPostUpgrade { if (clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].PoolId == lastPoolID) || (clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].PoolId == lastPoolIdMinusOne) { suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i].Asset0Denom, clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].Asset1Denom) suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i].Asset1Denom, clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].Asset0Denom) + suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i].P0LastSpotPrice, clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].P1LastSpotPrice) + suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i].P1LastSpotPrice, clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].P0LastSpotPrice) } } From 500b303a57ef3c9bce8ba25c5b8a07d91813af14 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Tue, 8 Aug 2023 17:58:19 +0000 Subject: [PATCH 19/21] nit --- app/upgrades/v17/upgrades_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/upgrades/v17/upgrades_test.go b/app/upgrades/v17/upgrades_test.go index f6d8f97f2c4..c31f35ab365 100644 --- a/app/upgrades/v17/upgrades_test.go +++ b/app/upgrades/v17/upgrades_test.go @@ -231,9 +231,10 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.Require().NoError(err) suite.Require().NotEmpty(clPool1TwapRecordPostUpgrade, "Most recent TWAP records should not be empty after upgrade.") - suite.Require().NotEmpty(clPool1TwapRecordHistoricalPoolIndexPostUpgrade, "Historical Pool Index TWAP record should not be empty after upgrade") + suite.Require().NotEmpty(clPool1TwapRecordHistoricalPoolIndexPostUpgrade, "Historical Pool Index TWAP record should not be empty after upgrade.") suite.Require().NotEmpty(clPool2TwapRecordPostUpgrade, "Most recent TWAP records should not be empty after upgrade.") - suite.Require().NotEmpty(clPool2TwapRecordHistoricalPoolIndexPostUpgrade, "Historical Pool Index TWAP record should not be empty after upgrade") + suite.Require().NotEmpty(clPool2TwapRecordHistoricalPoolIndexPostUpgrade, "Historical Pool Index TWAP record should not be empty after upgrade.") + suite.Require().NotEmpty(clPoolsTwapRecordHistoricalTimeIndexPostUpgrade, "Historical Time Index TWAP record should not be empty after upgrade.") for i := range clPool1TwapRecordPostUpgrade { suite.Require().Equal(clPool1TwapRecordPreUpgrade[i].Asset0Denom, clPool1TwapRecordPostUpgrade[i].Asset1Denom) From 846051095d44e452282add2d464c4a0c8d452738 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Tue, 8 Aug 2023 18:56:18 +0000 Subject: [PATCH 20/21] roman suggestion --- app/upgrades/v17/upgrades_test.go | 68 ++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/app/upgrades/v17/upgrades_test.go b/app/upgrades/v17/upgrades_test.go index c31f35ab365..3f839fc14dc 100644 --- a/app/upgrades/v17/upgrades_test.go +++ b/app/upgrades/v17/upgrades_test.go @@ -87,12 +87,12 @@ func (suite *UpgradeTestSuite) TestUpgrade() { testCases := []struct { name string - pre_upgrade func(sdk.Context, *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord) - upgrade func(sdk.Context, *keepers.AppKeepers, sdk.Coins, uint64, []types.TwapRecord) + pre_upgrade func(sdk.Context, *keepers.AppKeepers) (sdk.Coins, uint64) + upgrade func(sdk.Context, *keepers.AppKeepers, sdk.Coins, uint64) }{ { "Test that the upgrade succeeds", - func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord) { + func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64) { upgradeSetup() var lastPoolID uint64 // To keep track of the last assigned pool ID @@ -144,6 +144,7 @@ func (suite *UpgradeTestSuite) TestUpgrade() { existingPool := suite.PrepareConcentratedPoolWithCoins("ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo") existingPool2 := suite.PrepareConcentratedPoolWithCoins("akash", "uosmo") + existingBalancerPoolId := suite.PrepareBalancerPoolWithCoins(sdk.NewCoin("atom", sdk.NewInt(10000000000)), sdk.NewCoin("uosmo", sdk.NewInt(10000000000))) // create few TWAP records for the pools t1 := dummyTwapRecord(existingPool.GetId(), time.Now().Add(-time.Hour*24), "ibc/1480B8FD20AD5FCAE81EA87584D269547DD4D436843C1D20F15E00EB64743EF4", "uosmo", sdk.NewDec(10), @@ -171,21 +172,31 @@ func (suite *UpgradeTestSuite) TestUpgrade() { sdk.OneDec().MulInt64(2), sdk.ZeroDec()) + t6 := dummyTwapRecord(existingBalancerPoolId, time.Now().Add(-time.Hour), "atom", "uosmo", sdk.NewDec(10), + sdk.OneDec().MulInt64(10), + sdk.OneDec().MulInt64(10), + sdk.ZeroDec()) + + t7 := dummyTwapRecord(existingBalancerPoolId, time.Now().Add(-time.Minute*20), "atom", "uosmo", sdk.NewDec(50), + sdk.OneDec().MulInt64(10*5), + sdk.OneDec().MulInt64(5), + sdk.ZeroDec()) + + // store TWAP records suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, t1) suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, t2) suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, t3) suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, t4) suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, t5) + suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, t6) + suite.App.TwapKeeper.StoreNewRecord(suite.Ctx, t7) - clPool2TwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, existingPool2.GetId()) - suite.Require().NoError(err) - - return expectedCoinsUsedInUpgradeHandler, lastPoolID, clPool2TwapRecordPreUpgrade + return expectedCoinsUsedInUpgradeHandler, existingBalancerPoolId }, - func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64, clPoolTwapRecordPreUpgrade []types.TwapRecord) { - lastPoolID = clPoolTwapRecordPreUpgrade[0].GetPoolId() + func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64) { lastPoolIdMinusOne := lastPoolID - 1 + lastPoolIdMinusTwo := lastPoolID - 2 stakingParams := suite.App.StakingKeeper.GetParams(suite.Ctx) stakingParams.BondDenom = "uosmo" suite.App.StakingKeeper.SetParams(suite.Ctx, stakingParams) @@ -194,16 +205,16 @@ func (suite *UpgradeTestSuite) TestUpgrade() { communityPoolAddress := suite.App.AccountKeeper.GetModuleAddress(distrtypes.ModuleName) communityPoolBalancePre := suite.App.BankKeeper.GetAllBalances(suite.Ctx, communityPoolAddress) - clPool1TwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, lastPoolIdMinusOne) + clPool1TwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, lastPoolIdMinusTwo) suite.Require().NoError(err) - clPool1TwapRecordHistoricalPoolIndexPreUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolIdMinusOne) + clPool1TwapRecordHistoricalPoolIndexPreUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolIdMinusTwo) suite.Require().NoError(err) - clPool2TwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, lastPoolID) + clPool2TwapRecordPreUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, lastPoolIdMinusOne) suite.Require().NoError(err) - clPool2TwapRecordHistoricalPoolIndexPreUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolID) + clPool2TwapRecordHistoricalPoolIndexPreUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolIdMinusOne) suite.Require().NoError(err) clPoolsTwapRecordHistoricalTimeIndexPreUpgrade, err := keepers.TwapKeeper.GetAllHistoricalTimeIndexedTWAPs(ctx) @@ -215,27 +226,29 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.App.BeginBlocker(suite.Ctx, abci.RequestBeginBlock{}) }) - clPool1TwapRecordPostUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, lastPoolIdMinusOne) + clPool1TwapRecordPostUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, lastPoolIdMinusTwo) suite.Require().NoError(err) - clPool1TwapRecordHistoricalPoolIndexPostUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolIdMinusOne) + clPool1TwapRecordHistoricalPoolIndexPostUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolIdMinusTwo) suite.Require().NoError(err) - clPool2TwapRecordPostUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, lastPoolID) + clPool2TwapRecordPostUpgrade, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, lastPoolIdMinusOne) suite.Require().NoError(err) - clPool2TwapRecordHistoricalPoolIndexPostUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolID) + clPool2TwapRecordHistoricalPoolIndexPostUpgrade, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, lastPoolIdMinusOne) suite.Require().NoError(err) clPoolsTwapRecordHistoricalTimeIndexPostUpgrade, err := keepers.TwapKeeper.GetAllHistoricalTimeIndexedTWAPs(ctx) suite.Require().NoError(err) + // check that all TWAP records aren't empty suite.Require().NotEmpty(clPool1TwapRecordPostUpgrade, "Most recent TWAP records should not be empty after upgrade.") suite.Require().NotEmpty(clPool1TwapRecordHistoricalPoolIndexPostUpgrade, "Historical Pool Index TWAP record should not be empty after upgrade.") suite.Require().NotEmpty(clPool2TwapRecordPostUpgrade, "Most recent TWAP records should not be empty after upgrade.") suite.Require().NotEmpty(clPool2TwapRecordHistoricalPoolIndexPostUpgrade, "Historical Pool Index TWAP record should not be empty after upgrade.") suite.Require().NotEmpty(clPoolsTwapRecordHistoricalTimeIndexPostUpgrade, "Historical Time Index TWAP record should not be empty after upgrade.") + // check that all most recent TWAP record has been flipped for pool1 for i := range clPool1TwapRecordPostUpgrade { suite.Require().Equal(clPool1TwapRecordPreUpgrade[i].Asset0Denom, clPool1TwapRecordPostUpgrade[i].Asset1Denom) suite.Require().Equal(clPool1TwapRecordPreUpgrade[i].Asset1Denom, clPool1TwapRecordPostUpgrade[i].Asset0Denom) @@ -243,6 +256,7 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.Require().Equal(clPool1TwapRecordPreUpgrade[i].P1LastSpotPrice, clPool1TwapRecordPostUpgrade[i].P0LastSpotPrice) } + // check that historical pool index TWAP record has been flipped for pool1 for i := range clPool1TwapRecordHistoricalPoolIndexPostUpgrade { suite.Require().Equal(clPool1TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset0Denom, clPool1TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset1Denom) suite.Require().Equal(clPool1TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset1Denom, clPool1TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset0Denom) @@ -250,6 +264,7 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.Require().Equal(clPool1TwapRecordHistoricalPoolIndexPreUpgrade[i].P1LastSpotPrice, clPool1TwapRecordHistoricalPoolIndexPostUpgrade[i].P0LastSpotPrice) } + // check that all most recent TWAP record has been flipped for pool2 for i := range clPool2TwapRecordPostUpgrade { suite.Require().Equal(clPool2TwapRecordPreUpgrade[i].Asset0Denom, clPool2TwapRecordPostUpgrade[i].Asset1Denom) suite.Require().Equal(clPool2TwapRecordPreUpgrade[i].Asset1Denom, clPool2TwapRecordPostUpgrade[i].Asset0Denom) @@ -257,6 +272,7 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.Require().Equal(clPool2TwapRecordPreUpgrade[i].P1LastSpotPrice, clPool2TwapRecordPostUpgrade[i].P0LastSpotPrice) } + // check that historical pool index TWAP record has been flipped for pool2 for i := range clPool2TwapRecordHistoricalPoolIndexPostUpgrade { suite.Require().Equal(clPool2TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset0Denom, clPool2TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset1Denom) suite.Require().Equal(clPool2TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset1Denom, clPool2TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset0Denom) @@ -264,12 +280,18 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.Require().Equal(clPool2TwapRecordHistoricalPoolIndexPreUpgrade[i].P1LastSpotPrice, clPool2TwapRecordHistoricalPoolIndexPostUpgrade[i].P0LastSpotPrice) } + // check that historical time index TWAP record has been flipped for pool1 and pool2 + // Also check that all the records is the same for the rest of the pools for i := range clPoolsTwapRecordHistoricalTimeIndexPostUpgrade { - if (clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].PoolId == lastPoolID) || (clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].PoolId == lastPoolIdMinusOne) { + if (clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].PoolId == lastPoolIdMinusOne) || (clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].PoolId == lastPoolIdMinusTwo) { suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i].Asset0Denom, clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].Asset1Denom) suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i].Asset1Denom, clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].Asset0Denom) suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i].P0LastSpotPrice, clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].P1LastSpotPrice) suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i].P1LastSpotPrice, clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].P0LastSpotPrice) + } else { + if clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].PoolId == lastPoolID { + suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i], clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i]) + } } } @@ -335,11 +357,11 @@ func (suite *UpgradeTestSuite) TestUpgrade() { }, { "Fails because CFMM pool is not found", - func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64, []types.TwapRecord) { + func(ctx sdk.Context, keepers *keepers.AppKeepers) (sdk.Coins, uint64) { upgradeSetup() - return sdk.NewCoins(), 0, nil + return sdk.NewCoins(), 0 }, - func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64, clPoolTwapRecordPreUpgrade []types.TwapRecord) { + func(ctx sdk.Context, keepers *keepers.AppKeepers, expectedCoinsUsedInUpgradeHandler sdk.Coins, lastPoolID uint64) { dummyUpgrade(suite) suite.Require().Panics(func() { suite.App.BeginBlocker(suite.Ctx, abci.RequestBeginBlock{}) @@ -352,8 +374,8 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.Run(fmt.Sprintf("Case %s", tc.name), func() { suite.SetupTest() // reset - expectedCoinsUsedInUpgradeHandler, lastPoolID, clPoolTwapRecordPreUpgrade := tc.pre_upgrade(suite.Ctx, &suite.App.AppKeepers) - tc.upgrade(suite.Ctx, &suite.App.AppKeepers, expectedCoinsUsedInUpgradeHandler, lastPoolID, clPoolTwapRecordPreUpgrade) + expectedCoinsUsedInUpgradeHandler, lastPoolID := tc.pre_upgrade(suite.Ctx, &suite.App.AppKeepers) + tc.upgrade(suite.Ctx, &suite.App.AppKeepers, expectedCoinsUsedInUpgradeHandler, lastPoolID) }) } } From 520d6b192beb2f806d60a74338dbddf1f2ad7bbd Mon Sep 17 00:00:00 2001 From: stackman27 Date: Wed, 9 Aug 2023 01:35:18 +0000 Subject: [PATCH 21/21] adams suggestion --- app/upgrades/v17/upgrades.go | 5 +- app/upgrades/v17/upgrades_test.go | 80 +++++++++++++------------------ 2 files changed, 36 insertions(+), 49 deletions(-) diff --git a/app/upgrades/v17/upgrades.go b/app/upgrades/v17/upgrades.go index 3e77493f1d6..4a72dde4191 100644 --- a/app/upgrades/v17/upgrades.go +++ b/app/upgrades/v17/upgrades.go @@ -146,7 +146,8 @@ func CreateUpgradeHandler( // FlipTwapSpotPriceRecords flips the denoms and spot price of twap record of a given pool. func FlipTwapSpotPriceRecords(ctx sdk.Context, pools []poolmanagertypes.PoolI, keepers *keepers.AppKeepers) error { for _, pool := range pools { - twapRecordHistoricalPoolIndexed, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, pool.GetId()) + poolId := pool.GetId() + twapRecordHistoricalPoolIndexed, err := keepers.TwapKeeper.GetAllHistoricalPoolIndexedTWAPsForPoolId(ctx, poolId) if err != nil { return err } @@ -160,7 +161,7 @@ func FlipTwapSpotPriceRecords(ctx sdk.Context, pools []poolmanagertypes.PoolI, k keepers.TwapKeeper.DeleteHistoricalRecord(ctx, oldRecord) } - clPoolTwapRecords, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, pool.GetId()) + clPoolTwapRecords, err := keepers.TwapKeeper.GetAllMostRecentRecordsForPool(ctx, poolId) if err != nil { return err } diff --git a/app/upgrades/v17/upgrades_test.go b/app/upgrades/v17/upgrades_test.go index 3f839fc14dc..a6ad8a33467 100644 --- a/app/upgrades/v17/upgrades_test.go +++ b/app/upgrades/v17/upgrades_test.go @@ -71,6 +71,17 @@ func dummyTwapRecord(poolId uint64, t time.Time, asset0 string, asset1 string, s } } +func assertTwapFlipped(suite *UpgradeTestSuite, pre, post types.TwapRecord) { + suite.Require().Equal(pre.Asset0Denom, post.Asset1Denom) + suite.Require().Equal(pre.Asset1Denom, post.Asset0Denom) + suite.Require().Equal(pre.P0LastSpotPrice, post.P1LastSpotPrice) + suite.Require().Equal(pre.P1LastSpotPrice, post.P0LastSpotPrice) +} + +func assertEqual(suite *UpgradeTestSuite, pre, post interface{}) { + suite.Require().Equal(pre, post) +} + func (suite *UpgradeTestSuite) TestUpgrade() { upgradeSetup := func() { // This is done to ensure that we run the InitGenesis() logic for the new modules @@ -242,56 +253,31 @@ func (suite *UpgradeTestSuite) TestUpgrade() { suite.Require().NoError(err) // check that all TWAP records aren't empty - suite.Require().NotEmpty(clPool1TwapRecordPostUpgrade, "Most recent TWAP records should not be empty after upgrade.") - suite.Require().NotEmpty(clPool1TwapRecordHistoricalPoolIndexPostUpgrade, "Historical Pool Index TWAP record should not be empty after upgrade.") - suite.Require().NotEmpty(clPool2TwapRecordPostUpgrade, "Most recent TWAP records should not be empty after upgrade.") - suite.Require().NotEmpty(clPool2TwapRecordHistoricalPoolIndexPostUpgrade, "Historical Pool Index TWAP record should not be empty after upgrade.") - suite.Require().NotEmpty(clPoolsTwapRecordHistoricalTimeIndexPostUpgrade, "Historical Time Index TWAP record should not be empty after upgrade.") - - // check that all most recent TWAP record has been flipped for pool1 - for i := range clPool1TwapRecordPostUpgrade { - suite.Require().Equal(clPool1TwapRecordPreUpgrade[i].Asset0Denom, clPool1TwapRecordPostUpgrade[i].Asset1Denom) - suite.Require().Equal(clPool1TwapRecordPreUpgrade[i].Asset1Denom, clPool1TwapRecordPostUpgrade[i].Asset0Denom) - suite.Require().Equal(clPool1TwapRecordPreUpgrade[i].P0LastSpotPrice, clPool1TwapRecordPostUpgrade[i].P1LastSpotPrice) - suite.Require().Equal(clPool1TwapRecordPreUpgrade[i].P1LastSpotPrice, clPool1TwapRecordPostUpgrade[i].P0LastSpotPrice) - } - - // check that historical pool index TWAP record has been flipped for pool1 - for i := range clPool1TwapRecordHistoricalPoolIndexPostUpgrade { - suite.Require().Equal(clPool1TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset0Denom, clPool1TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset1Denom) - suite.Require().Equal(clPool1TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset1Denom, clPool1TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset0Denom) - suite.Require().Equal(clPool1TwapRecordHistoricalPoolIndexPreUpgrade[i].P0LastSpotPrice, clPool1TwapRecordHistoricalPoolIndexPostUpgrade[i].P1LastSpotPrice) - suite.Require().Equal(clPool1TwapRecordHistoricalPoolIndexPreUpgrade[i].P1LastSpotPrice, clPool1TwapRecordHistoricalPoolIndexPostUpgrade[i].P0LastSpotPrice) - } - - // check that all most recent TWAP record has been flipped for pool2 - for i := range clPool2TwapRecordPostUpgrade { - suite.Require().Equal(clPool2TwapRecordPreUpgrade[i].Asset0Denom, clPool2TwapRecordPostUpgrade[i].Asset1Denom) - suite.Require().Equal(clPool2TwapRecordPreUpgrade[i].Asset1Denom, clPool2TwapRecordPostUpgrade[i].Asset0Denom) - suite.Require().Equal(clPool2TwapRecordPreUpgrade[i].P0LastSpotPrice, clPool2TwapRecordPostUpgrade[i].P1LastSpotPrice) - suite.Require().Equal(clPool2TwapRecordPreUpgrade[i].P1LastSpotPrice, clPool2TwapRecordPostUpgrade[i].P0LastSpotPrice) - } - - // check that historical pool index TWAP record has been flipped for pool2 - for i := range clPool2TwapRecordHistoricalPoolIndexPostUpgrade { - suite.Require().Equal(clPool2TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset0Denom, clPool2TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset1Denom) - suite.Require().Equal(clPool2TwapRecordHistoricalPoolIndexPreUpgrade[i].Asset1Denom, clPool2TwapRecordHistoricalPoolIndexPostUpgrade[i].Asset0Denom) - suite.Require().Equal(clPool2TwapRecordHistoricalPoolIndexPreUpgrade[i].P0LastSpotPrice, clPool2TwapRecordHistoricalPoolIndexPostUpgrade[i].P1LastSpotPrice) - suite.Require().Equal(clPool2TwapRecordHistoricalPoolIndexPreUpgrade[i].P1LastSpotPrice, clPool2TwapRecordHistoricalPoolIndexPostUpgrade[i].P0LastSpotPrice) + suite.Require().NotEmpty(clPool1TwapRecordPostUpgrade) + suite.Require().NotEmpty(clPool1TwapRecordHistoricalPoolIndexPostUpgrade) + suite.Require().NotEmpty(clPool2TwapRecordPostUpgrade) + suite.Require().NotEmpty(clPool2TwapRecordHistoricalPoolIndexPostUpgrade) + suite.Require().NotEmpty(clPoolsTwapRecordHistoricalTimeIndexPostUpgrade) + + for _, data := range []struct { + pre, post []types.TwapRecord + }{ + {clPool1TwapRecordPreUpgrade, clPool1TwapRecordPostUpgrade}, + {clPool1TwapRecordHistoricalPoolIndexPreUpgrade, clPool1TwapRecordHistoricalPoolIndexPostUpgrade}, + {clPool2TwapRecordPreUpgrade, clPool2TwapRecordPostUpgrade}, + {clPool2TwapRecordHistoricalPoolIndexPreUpgrade, clPool2TwapRecordHistoricalPoolIndexPostUpgrade}, + } { + for i := range data.post { + assertTwapFlipped(suite, data.pre[i], data.post[i]) + } } - // check that historical time index TWAP record has been flipped for pool1 and pool2 - // Also check that all the records is the same for the rest of the pools for i := range clPoolsTwapRecordHistoricalTimeIndexPostUpgrade { - if (clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].PoolId == lastPoolIdMinusOne) || (clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].PoolId == lastPoolIdMinusTwo) { - suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i].Asset0Denom, clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].Asset1Denom) - suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i].Asset1Denom, clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].Asset0Denom) - suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i].P0LastSpotPrice, clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].P1LastSpotPrice) - suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i].P1LastSpotPrice, clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].P0LastSpotPrice) - } else { - if clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i].PoolId == lastPoolID { - suite.Require().Equal(clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i], clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i]) - } + record := clPoolsTwapRecordHistoricalTimeIndexPostUpgrade[i] + if record.PoolId == lastPoolIdMinusOne || record.PoolId == lastPoolIdMinusTwo { + assertTwapFlipped(suite, clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i], record) + } else if record.PoolId == lastPoolID { + assertEqual(suite, clPoolsTwapRecordHistoricalTimeIndexPreUpgrade[i], record) } }