Commit 4653313e authored by ValarDragon's avatar ValarDragon
Browse files

Comment out accumulation store

parent 3025a895
Showing with 175 additions and 175 deletions
+175 -175
......@@ -49,7 +49,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* Add ability for nodes to query the total amount locked for each denomination.
* Embedded seeds in init.go
* Added changelog and info about changelog format.
* Fix accumulation store only counting bonded tokens, not unbonding tokens, that prevented the front-end from using more correct APY estimates. (Previously, the front-end could only underestimate rewards)
* Disable the accumulation store until v5
## [v3.2.0](https://github.com/osmosis/osmosis-labs/releases/tag/v2.0.0) - 2021-06-28
......
......@@ -470,47 +470,47 @@ func (suite *KeeperTestSuite) TestAccountLockedLongerDurationDenom() {
suite.Require().Len(res.Locks, 0)
}
func (suite *KeeperTestSuite) TestLockedDenom() {
suite.SetupTest()
addr1 := sdk.AccAddress([]byte("addr1---------------"))
testTotalLockedDuration := func(durationStr string, expectedAmount int64) {
duration, _ := time.ParseDuration(durationStr)
res, err := suite.app.LockupKeeper.LockedDenom(
sdk.WrapSDKContext(suite.ctx),
&types.LockedDenomRequest{Denom: "stake", Duration: duration})
suite.Require().NoError(err)
suite.Require().Equal(res.Amount, sdk.NewInt(expectedAmount))
}
// lock coins
coins := sdk.Coins{sdk.NewInt64Coin("stake", 10)}
suite.LockTokens(addr1, coins, time.Hour)
// test with single lockup
testTotalLockedDuration("0s", 10)
testTotalLockedDuration("30m", 10)
testTotalLockedDuration("1h", 10)
testTotalLockedDuration("2h", 0)
// adds different account and lockup for testing
addr2 := sdk.AccAddress([]byte("addr2---------------"))
coins = sdk.Coins{sdk.NewInt64Coin("stake", 20)}
suite.LockTokens(addr2, coins, time.Hour*2)
testTotalLockedDuration("30m", 30)
testTotalLockedDuration("1h", 30)
testTotalLockedDuration("2h", 20)
// test unlocking
suite.BeginUnlocking(addr2)
testTotalLockedDuration("2h", 20)
// finish unlocking
duration, _ := time.ParseDuration("2h")
suite.ctx = suite.ctx.WithBlockTime(suite.ctx.BlockTime().Add(duration))
suite.WithdrawAllMaturedLocks()
testTotalLockedDuration("2h", 0)
testTotalLockedDuration("1h", 10)
}
// func (suite *KeeperTestSuite) TestLockedDenom() {
// suite.SetupTest()
// addr1 := sdk.AccAddress([]byte("addr1---------------"))
// testTotalLockedDuration := func(durationStr string, expectedAmount int64) {
// duration, _ := time.ParseDuration(durationStr)
// res, err := suite.app.LockupKeeper.LockedDenom(
// sdk.WrapSDKContext(suite.ctx),
// &types.LockedDenomRequest{Denom: "stake", Duration: duration})
// suite.Require().NoError(err)
// suite.Require().Equal(res.Amount, sdk.NewInt(expectedAmount))
// }
// // lock coins
// coins := sdk.Coins{sdk.NewInt64Coin("stake", 10)}
// suite.LockTokens(addr1, coins, time.Hour)
// // test with single lockup
// testTotalLockedDuration("0s", 10)
// testTotalLockedDuration("30m", 10)
// testTotalLockedDuration("1h", 10)
// testTotalLockedDuration("2h", 0)
// // adds different account and lockup for testing
// addr2 := sdk.AccAddress([]byte("addr2---------------"))
// coins = sdk.Coins{sdk.NewInt64Coin("stake", 20)}
// suite.LockTokens(addr2, coins, time.Hour*2)
// testTotalLockedDuration("30m", 30)
// testTotalLockedDuration("1h", 30)
// testTotalLockedDuration("2h", 20)
// // test unlocking
// suite.BeginUnlocking(addr2)
// testTotalLockedDuration("2h", 20)
// // finish unlocking
// duration, _ := time.ParseDuration("2h")
// suite.ctx = suite.ctx.WithBlockTime(suite.ctx.BlockTime().Add(duration))
// suite.WithdrawAllMaturedLocks()
// testTotalLockedDuration("2h", 0)
// testTotalLockedDuration("1h", 10)
// }
......@@ -2,7 +2,6 @@ package keeper
import (
"fmt"
"sort"
"time"
"github.com/cosmos/cosmos-sdk/store/prefix"
......@@ -301,9 +300,9 @@ func (k Keeper) addTokensToLock(ctx sdk.Context, lock *types.PeriodLock, coins s
}
// modifications to accumulation store
for _, coin := range coins {
k.accumulationStore(ctx, coin.Denom).Increase(accumulationKey(lock.Duration), coin.Amount)
}
// for _, coin := range coins {
// k.accumulationStore(ctx, coin.Denom).Increase(accumulationKey(lock.Duration), coin.Amount)
// }
return nil
}
......@@ -370,13 +369,14 @@ func (k Keeper) ClearAccumulationStores(ctx sdk.Context) {
// ResetAllLocks takes a set of locks, and initializes state to be storing
// them all correctly. This utilizes batch optimizations to improve efficiency,
// as this becomes a bottleneck at chain initialization & upgrades.
// UPDATE: accumulation store is disabled in the v4 upgrade.
func (k Keeper) ResetAllLocks(ctx sdk.Context, locks []types.PeriodLock) error {
// index by coin.Denom, them duration -> amt
// We accumulate the accumulation store entries separately,
// to avoid hitting the myriad of slowdowns in the SDK iterator creation process.
// We then save these once to the accumulation store at the end.
accumulationStoreEntries := make(map[string]map[time.Duration]sdk.Int)
denoms := []string{}
// accumulationStoreEntries := make(map[string]map[time.Duration]sdk.Int)
// denoms := []string{}
for i, lock := range locks {
if i%25000 == 0 {
msg := fmt.Sprintf("Reset %d lock refs, cur lock ID %d", i, lock.ID)
......@@ -388,44 +388,44 @@ func (k Keeper) ResetAllLocks(ctx sdk.Context, locks []types.PeriodLock) error {
}
// Add to the accumlation store cache
for _, coin := range lock.Coins {
// update or create the new map from duration -> Int for this denom.
var curDurationMap map[time.Duration]sdk.Int
if durationMap, ok := accumulationStoreEntries[coin.Denom]; ok {
curDurationMap = durationMap
// update or create new amount in the duration map
newAmt := coin.Amount
if curAmt, ok := durationMap[lock.Duration]; ok {
newAmt = newAmt.Add(curAmt)
}
curDurationMap[lock.Duration] = newAmt
} else {
denoms = append(denoms, coin.Denom)
curDurationMap = map[time.Duration]sdk.Int{lock.Duration: coin.Amount}
}
accumulationStoreEntries[coin.Denom] = curDurationMap
}
// for _, coin := range lock.Coins {
// // update or create the new map from duration -> Int for this denom.
// var curDurationMap map[time.Duration]sdk.Int
// if durationMap, ok := accumulationStoreEntries[coin.Denom]; ok {
// curDurationMap = durationMap
// // update or create new amount in the duration map
// newAmt := coin.Amount
// if curAmt, ok := durationMap[lock.Duration]; ok {
// newAmt = newAmt.Add(curAmt)
// }
// curDurationMap[lock.Duration] = newAmt
// } else {
// denoms = append(denoms, coin.Denom)
// curDurationMap = map[time.Duration]sdk.Int{lock.Duration: coin.Amount}
// }
// accumulationStoreEntries[coin.Denom] = curDurationMap
// }
}
// deterministically iterate over durationMap cache.
sort.Strings(denoms)
for _, denom := range denoms {
curDurationMap := accumulationStoreEntries[denom]
durations := make([]time.Duration, 0, len(curDurationMap))
for duration, _ := range curDurationMap {
durations = append(durations, duration)
}
sort.Slice(durations, func(i, j int) bool { return durations[i] < durations[j] })
// now that we have a sorted list of durations for this denom,
// add them all to accumulation store
msg := fmt.Sprintf("Setting accumulation entries for locks for %s, there are %d distinct durations",
denom, len(durations))
ctx.Logger().Info(msg)
for _, d := range durations {
amt := curDurationMap[d]
k.accumulationStore(ctx, denom).Increase(accumulationKey(d), amt)
}
}
// sort.Strings(denoms)
// for _, denom := range denoms {
// curDurationMap := accumulationStoreEntries[denom]
// durations := make([]time.Duration, 0, len(curDurationMap))
// for duration, _ := range curDurationMap {
// durations = append(durations, duration)
// }
// sort.Slice(durations, func(i, j int) bool { return durations[i] < durations[j] })
// // now that we have a sorted list of durations for this denom,
// // add them all to accumulation store
// msg := fmt.Sprintf("Setting accumulation entries for locks for %s, there are %d distinct durations",
// denom, len(durations))
// ctx.Logger().Info(msg)
// for _, d := range durations {
// amt := curDurationMap[d]
// k.accumulationStore(ctx, denom).Increase(accumulationKey(d), amt)
// }
// }
return nil
}
......@@ -482,9 +482,10 @@ func (k Keeper) Lock(ctx sdk.Context, lock types.PeriodLock) error {
}
// add to accumulation store
for _, coin := range lock.Coins {
k.accumulationStore(ctx, coin.Denom).Increase(accumulationKey(lock.Duration), coin.Amount)
}
// disabled in v4
// for _, coin := range lock.Coins {
// k.accumulationStore(ctx, coin.Denom).Increase(accumulationKey(lock.Duration), coin.Amount)
// }
k.hooks.OnTokenLocked(ctx, owner, lock.ID, lock.Coins, lock.Duration, lock.EndTime)
return nil
......@@ -548,9 +549,9 @@ func (k Keeper) Unlock(ctx sdk.Context, lock types.PeriodLock) error {
}
// remove from accumulation store
for _, coin := range lock.Coins {
k.accumulationStore(ctx, coin.Denom).Decrease(accumulationKey(lock.Duration), coin.Amount)
}
// for _, coin := range lock.Coins {
// k.accumulationStore(ctx, coin.Denom).Decrease(accumulationKey(lock.Duration), coin.Amount)
// }
k.hooks.OnTokenUnlocked(ctx, owner, lock.ID, lock.Coins, lock.Duration, lock.EndTime)
return nil
......
......@@ -288,12 +288,12 @@ func (suite *KeeperTestSuite) TestAddTokensToLock() {
suite.Require().Len(locks, 1)
suite.Require().Equal(locks[0].Coins, coins)
// check accumulation store is correctly updated
accum := suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, types.QueryCondition{
LockQueryType: types.ByDuration,
Denom: "stake",
Duration: time.Second,
})
suite.Require().Equal(accum.String(), "10")
// accum := suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, types.QueryCondition{
// LockQueryType: types.ByDuration,
// Denom: "stake",
// Duration: time.Second,
// })
// suite.Require().Equal(accum.String(), "10")
// add more tokens to lock
addCoins := sdk.Coins{sdk.NewInt64Coin("stake", 10)}
......@@ -308,12 +308,12 @@ func (suite *KeeperTestSuite) TestAddTokensToLock() {
suite.Require().Equal(locks[0].Coins, coins.Add(addCoins...))
// check accumulation store is correctly updated
accum = suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, types.QueryCondition{
LockQueryType: types.ByDuration,
Denom: "stake",
Duration: time.Second,
})
suite.Require().Equal(accum.String(), "20")
// accum = suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, types.QueryCondition{
// LockQueryType: types.ByDuration,
// Denom: "stake",
// Duration: time.Second,
// })
// suite.Require().Equal(accum.String(), "20")
// try to add tokens to unavailable lock
cacheCtx, _ := suite.ctx.CacheContext()
......@@ -408,53 +408,53 @@ func (suite *KeeperTestSuite) TestEndblockerWithdrawAllMaturedLockups() {
suite.Require().Len(locks, 0)
}
func (suite *KeeperTestSuite) TestLockAccumulationStore() {
suite.SetupTest()
// initial check
locks, err := suite.app.LockupKeeper.GetPeriodLocks(suite.ctx)
suite.Require().NoError(err)
suite.Require().Len(locks, 0)
// lock coins
addr := sdk.AccAddress([]byte("addr1---------------"))
// 1 * time.Second: 10 + 20
// 2 * time.Second: 20 + 30
// 3 * time.Second: 30
coins := sdk.Coins{sdk.NewInt64Coin("stake", 10)}
suite.LockTokens(addr, coins, time.Second)
coins = sdk.Coins{sdk.NewInt64Coin("stake", 20)}
suite.LockTokens(addr, coins, time.Second)
suite.LockTokens(addr, coins, time.Second*2)
coins = sdk.Coins{sdk.NewInt64Coin("stake", 30)}
suite.LockTokens(addr, coins, time.Second*2)
suite.LockTokens(addr, coins, time.Second*3)
// check accumulations
acc := suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, types.QueryCondition{
Denom: "stake",
Duration: 0,
})
suite.Require().Equal(int64(110), acc.Int64())
acc = suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, types.QueryCondition{
Denom: "stake",
Duration: time.Second*1,
})
suite.Require().Equal(int64(110), acc.Int64())
acc = suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, types.QueryCondition{
Denom: "stake",
Duration: time.Second*2,
})
suite.Require().Equal(int64(80), acc.Int64())
acc = suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, types.QueryCondition{
Denom: "stake",
Duration: time.Second*3,
})
suite.Require().Equal(int64(30), acc.Int64())
acc = suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, types.QueryCondition{
Denom: "stake",
Duration: time.Second*4,
})
suite.Require().Equal(int64(0), acc.Int64())
}
// func (suite *KeeperTestSuite) TestLockAccumulationStore() {
// suite.SetupTest()
// // initial check
// locks, err := suite.app.LockupKeeper.GetPeriodLocks(suite.ctx)
// suite.Require().NoError(err)
// suite.Require().Len(locks, 0)
// // lock coins
// addr := sdk.AccAddress([]byte("addr1---------------"))
// // 1 * time.Second: 10 + 20
// // 2 * time.Second: 20 + 30
// // 3 * time.Second: 30
// coins := sdk.Coins{sdk.NewInt64Coin("stake", 10)}
// suite.LockTokens(addr, coins, time.Second)
// coins = sdk.Coins{sdk.NewInt64Coin("stake", 20)}
// suite.LockTokens(addr, coins, time.Second)
// suite.LockTokens(addr, coins, time.Second*2)
// coins = sdk.Coins{sdk.NewInt64Coin("stake", 30)}
// suite.LockTokens(addr, coins, time.Second*2)
// suite.LockTokens(addr, coins, time.Second*3)
// // check accumulations
// acc := suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, types.QueryCondition{
// Denom: "stake",
// Duration: 0,
// })
// suite.Require().Equal(int64(110), acc.Int64())
// acc = suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, types.QueryCondition{
// Denom: "stake",
// Duration: time.Second*1,
// })
// suite.Require().Equal(int64(110), acc.Int64())
// acc = suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, types.QueryCondition{
// Denom: "stake",
// Duration: time.Second*2,
// })
// suite.Require().Equal(int64(80), acc.Int64())
// acc = suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, types.QueryCondition{
// Denom: "stake",
// Duration: time.Second*3,
// })
// suite.Require().Equal(int64(30), acc.Int64())
// acc = suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, types.QueryCondition{
// Denom: "stake",
// Duration: time.Second*4,
// })
// suite.Require().Equal(int64(0), acc.Int64())
// }
......@@ -6,7 +6,6 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
lockuptypes "github.com/osmosis-labs/osmosis/x/lockup/types"
"github.com/tendermint/tendermint/abci/types"
)
......@@ -128,26 +127,26 @@ func (suite *KeeperTestSuite) TestUpgradeStoreManagement() {
locks = suite.app.LockupKeeper.GetAccountPeriodLocks(suite.ctx, addr1)
suite.Require().Len(locks, 0)
accum := suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, lockuptypes.QueryCondition{
LockQueryType: lockuptypes.ByDuration,
Denom: "stake",
Duration: time.Second,
})
suite.Require().Equal(accum.String(), "20")
accum = suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, lockuptypes.QueryCondition{
LockQueryType: lockuptypes.ByDuration,
Denom: "stake",
Duration: 50 * time.Second,
})
suite.Require().Equal(accum.String(), "20")
accum = suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, lockuptypes.QueryCondition{
LockQueryType: lockuptypes.ByDuration,
Denom: "stake",
Duration: 200 * time.Second,
})
suite.Require().Equal(accum.String(), "10")
// accum := suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, lockuptypes.QueryCondition{
// LockQueryType: lockuptypes.ByDuration,
// Denom: "stake",
// Duration: time.Second,
// })
// suite.Require().Equal(accum.String(), "20")
// accum = suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, lockuptypes.QueryCondition{
// LockQueryType: lockuptypes.ByDuration,
// Denom: "stake",
// Duration: 50 * time.Second,
// })
// suite.Require().Equal(accum.String(), "20")
// accum = suite.app.LockupKeeper.GetPeriodLocksAccumulation(suite.ctx, lockuptypes.QueryCondition{
// LockQueryType: lockuptypes.ByDuration,
// Denom: "stake",
// Duration: 200 * time.Second,
// })
// suite.Require().Equal(accum.String(), "10")
},
true,
},
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment