Skip to content

Commit f18e2ae

Browse files
hard-netthard-nett
andauthored
v0.21.1 - correct upgrade handler (#268)
* dev: only remove negative delegations in store, improve logging * chore: bump various deps * dev: remove polytone and cosmwasm conformance (will replace & tested using integration) * chore: bump ict deps * chore: ict core application coverage * chore: ict deps * chore: ict deps * chore: ict deps * chore: ict bump * chore: remove ci ict test (will be added back in future) --------- Co-authored-by: hard-nett <hardnettt@proton.me>
1 parent 8928250 commit f18e2ae

File tree

15 files changed

+2777
-1395
lines changed

15 files changed

+2777
-1395
lines changed

.github/workflows/interchaintest-e2e.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ jobs:
6060
test:
6161
- "e2e-basic"
6262
- "e2e-pfm"
63-
- "e2e-polytone"
63+
# - "e2e-polytone"
6464
# - "e2e-upgrade"
6565
fail-fast: false
6666

app/upgrades/v020/upgrades.go

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -124,37 +124,45 @@ func V018ManualDelegationRewardsPatch(sdkCtx sdk.Context, rewardsRaw, outstandin
124124
// add coins to user account
125125
if !finalRewards.IsZero() {
126126
withdrawAddr, err := k.DistrKeeper.GetDelegatorWithdrawAddr(sdkCtx, sdk.AccAddress(del.GetDelegatorAddr()))
127+
if err != nil {
128+
return err
129+
}
127130
err = k.BankKeeper.SendCoinsFromModuleToAccount(sdkCtx, distrtypes.ModuleName, withdrawAddr, finalRewards)
128131
if err != nil {
129132
return err
130133
}
134+
sdkCtx.Logger().Info(fmt.Sprintf("Rewards %v manually claimed for: %q", finalRewards, del.GetDelegatorAddr()))
131135
}
132136

133137
// update the outstanding rewards and the community pool only if the
134138
// transaction was successful
135139
k.DistrKeeper.SetValidatorOutstandingRewards(sdkCtx, sdk.ValAddress(valAddr), distrtypes.ValidatorOutstandingRewards{Rewards: outstanding.Sub(rewards)})
136-
feePool, _ := k.DistrKeeper.FeePool.Get(sdkCtx)
140+
feePool, err := k.DistrKeeper.FeePool.Get(sdkCtx)
141+
if err != nil {
142+
return err
143+
}
137144
feePool.CommunityPool = feePool.CommunityPool.Add(remainder...)
138-
k.DistrKeeper.FeePool.Set(sdkCtx, feePool)
145+
err = k.DistrKeeper.FeePool.Set(sdkCtx, feePool)
146+
if err != nil {
147+
return err
148+
}
139149

140150
// decrement reference count of starting period
141-
startingInfo, _ := k.DistrKeeper.GetDelegatorStartingInfo(sdkCtx, sdk.ValAddress(del.GetValidatorAddr()), sdk.AccAddress(del.GetDelegatorAddr()))
151+
startingInfo, err := k.DistrKeeper.GetDelegatorStartingInfo(sdkCtx, sdk.ValAddress(del.GetValidatorAddr()), sdk.AccAddress(del.GetDelegatorAddr()))
152+
if err != nil {
153+
return err
154+
}
142155
startingPeriod := startingInfo.PreviousPeriod
143156
customDecrementReferenceCount(sdkCtx, k, sdk.ValAddress(del.GetValidatorAddr()), startingPeriod)
144157

145158
// remove delegator starting info
146159
k.DistrKeeper.DeleteDelegatorStartingInfo(sdkCtx, sdk.ValAddress(del.GetValidatorAddr()), sdk.AccAddress(del.GetDelegatorAddr()))
147160

148161
if finalRewards.IsZero() {
149-
baseDenom, _ := sdk.GetBaseDenom()
150-
if baseDenom == "" {
151-
baseDenom = sdk.DefaultBondDenom
152-
}
153-
154162
// Note, we do not call the NewCoins constructor as we do not want the zero
155163
// coin removed.
156-
finalRewards = sdk.Coins{sdk.NewCoin(baseDenom, math.ZeroInt())}
157-
sdkCtx.Logger().Info("No final rewards", finalRewards)
164+
sdkCtx.Logger().Info("~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~~=~=~=~=~")
165+
sdkCtx.Logger().Info(fmt.Sprintf("No final rewards: %q %v", val.GetOperator(), del.GetDelegatorAddr()))
158166
}
159167

160168
// reinitialize the delegation

app/upgrades/v021/upgrade_test.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
upgradetypes "cosmossdk.io/x/upgrade/types"
1313
apptesting "github.com/bitsongofficial/go-bitsong/app/testing"
1414
addresscodec "github.com/cosmos/cosmos-sdk/codec/address"
15-
distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
1615
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
1716

1817
sdktypes "github.com/cosmos/cosmos-sdk/types"
@@ -38,13 +37,13 @@ func TestUpgradeTestSuite(t *testing.T) {
3837
func (s *UpgradeTestSuite) TestUpgrade() {
3938
upgradeSetup := func(shares, slash math.LegacyDec, jailed bool) {
4039
vals, _ := s.App.AppKeepers.StakingKeeper.GetAllValidators(s.Ctx)
40+
fmt.Printf("# OF VALS: %d\n", len(vals))
4141
for _, val := range vals {
42-
// save delegation to distribution store
43-
err := s.App.AppKeepers.DistrKeeper.SetDelegatorStartingInfo(s.Ctx, sdktypes.ValAddress(val.OperatorAddress), s.TestAccs[0], distrtypes.NewDelegatorStartingInfo(1, shares, uint64(s.Ctx.BlockHeight())))
44-
s.Require().NoError(err)
42+
// delAddrStr, err := s.App.AppKeepers.AccountKeeper.AddressCodec().BytesToString(s.TestAccs[0])
4543

46-
// create delegation with smallest non 0 value
47-
s.App.AppKeepers.StakingKeeper.SetDelegation(s.Ctx, stakingtypes.NewDelegation(s.TestAccs[0].String(), val.OperatorAddress, shares))
44+
s.FundAcc(s.TestAccs[0], sdktypes.NewCoins(sdktypes.NewCoin("stake", math.NewInt(1000000))))
45+
_, err := s.App.AppKeepers.StakingKeeper.Delegate(s.Ctx, s.TestAccs[0], math.NewInt(1000000), stakingtypes.Unbonded, val, true)
46+
s.Require().NoError(err)
4847

4948
if !slash.IsZero() {
5049
val.Tokens = math.LegacyNewDecFromInt(val.Tokens).MulTruncate(math.LegacyOneDec().Sub(slash)).RoundInt() // 1 % slash
@@ -54,6 +53,13 @@ func (s *UpgradeTestSuite) TestUpgrade() {
5453
}
5554
err = s.App.AppKeepers.StakingKeeper.SetValidator(s.Ctx, val)
5655
s.Require().NoError(err)
56+
57+
// get delegations
58+
dels, err := s.App.AppKeepers.StakingKeeper.GetValidatorDelegations(s.Ctx, sdktypes.ValAddress(val.OperatorAddress))
59+
s.Require().NoError(err)
60+
fmt.Printf("# OF DELS: %d\n", len(dels))
61+
62+
// todo: fix staking helper to propoerly manage staking in simulation tests
5763
}
5864

5965
}
@@ -67,7 +73,7 @@ func (s *UpgradeTestSuite) TestUpgrade() {
6773
{
6874
"test app module params",
6975
func() {
70-
upgradeSetup(math.LegacyOneDec(), math.LegacyZeroDec(), true)
76+
upgradeSetup(math.LegacyOneDec(), math.LegacyZeroDec(), false)
7177
},
7278
func() {
7379
dummyUpgrade(s)

app/upgrades/v021/upgrades.go

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"fmt"
66
"time"
77

8-
"cosmossdk.io/errors"
98
"cosmossdk.io/math"
109
upgradetypes "cosmossdk.io/x/upgrade/types"
1110
"github.com/bitsongofficial/go-bitsong/app/keepers"
@@ -15,7 +14,6 @@ import (
1514
sca "github.com/bitsongofficial/go-bitsong/x/smart-account/types"
1615
cmtproto "github.com/cometbft/cometbft/proto/tendermint/types"
1716
sdk "github.com/cosmos/cosmos-sdk/types"
18-
sdkErr "github.com/cosmos/cosmos-sdk/types/errors"
1917
"github.com/cosmos/cosmos-sdk/types/module"
2018
icqkeeper "github.com/cosmos/ibc-apps/modules/async-icq/v8/keeper"
2119
wasmlctypes "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/types"
@@ -40,29 +38,32 @@ func CreateV021UpgradeHandler(mm *module.Manager, configurator module.Configurat
4038
for _, val := range vals {
4139
valAddr := sdk.ValAddress(val.OperatorAddress)
4240
dels, _ := k.StakingKeeper.GetValidatorDelegations(sdkCtx, valAddr)
43-
4441
for _, del := range dels {
45-
if del.Shares.LTE(math.LegacyNewDecWithPrec(13, -17)) {
42+
if del.Shares.LTE(math.LegacyZeroDec()) {
43+
sdkCtx.Logger().Info(fmt.Sprintf("removing negative delegation from store: %q %v", val.GetOperator(), del.GetDelegatorAddr())) // remove reward information from distribution store
44+
if exists, _ := k.DistrKeeper.HasDelegatorStartingInfo(sdkCtx, valAddr, sdk.AccAddress(del.DelegatorAddress)); exists {
45+
sdkCtx.Logger().Info("delegation info found, deleting...")
46+
if err := k.DistrKeeper.DeleteDelegatorStartingInfo(sdkCtx, valAddr, sdk.AccAddress(del.DelegatorAddress)); err != nil {
47+
return nil, err
48+
}
49+
sdkCtx.Logger().Info("removed negative delegation from store successfully!")
50+
}
4651
// remove delegation from staking store
52+
sdkCtx.Logger().Info("~-~-~~-~-~~-~-~~-~-~~-~-~~-~-~~-~-~")
53+
sdkCtx.Logger().Info("removing negative delegation from staking keeper store")
4754
if err := k.StakingKeeper.RemoveDelegation(sdkCtx, del); err != nil {
4855
return nil, err
49-
}
50-
// remove reward information from distribution store
51-
if exists, err := k.DistrKeeper.HasDelegatorStartingInfo(sdkCtx, valAddr, sdk.AccAddress(del.DelegatorAddress)); err != nil {
52-
return nil, err
53-
} else if !exists {
54-
return nil, errors.Wrapf(sdkErr.ErrNotFound, "delegator starting info not found for delegator %s", del.DelegatorAddress)
55-
}
56-
if err := k.DistrKeeper.DeleteDelegatorStartingInfo(sdkCtx, valAddr, sdk.AccAddress(del.DelegatorAddress)); err != nil {
57-
return nil, err
56+
} else {
57+
sdkCtx.Logger().Info("removed negative delegation store value successfully!")
5858
}
5959
} else {
60-
// check if we need to patch distribution by manually claiming rewards again
60+
// check if we need to patch distribution by manually claiming rewards for any impaced delegations once again...
6161
hasInfo, err := k.DistrKeeper.HasDelegatorStartingInfo(sdkCtx, sdk.ValAddress(valAddr), sdk.AccAddress(del.GetDelegatorAddr()))
6262
if err != nil {
6363
return nil, err
6464
}
6565
if !hasInfo {
66+
sdkCtx.Logger().Info(fmt.Sprintf("delegation does not have starting info: val: %q, del: %v", val.GetOperator(), del.GetDelegatorAddr()))
6667
continue
6768
}
6869
// calculate rewards
@@ -85,7 +86,28 @@ func CreateV021UpgradeHandler(mm *module.Manager, configurator module.Configurat
8586
}
8687
}
8788
}
89+
}
8890

91+
/* ensure no delegations exist without starting info*/
92+
allDels, err := k.StakingKeeper.GetAllDelegations(sdkCtx)
93+
if err != nil {
94+
panic(err)
95+
}
96+
for _, del := range allDels {
97+
/* ensure all rewards are patched */
98+
val, err := k.StakingKeeper.Validator(sdkCtx, sdk.ValAddress(del.GetValidatorAddr()))
99+
if err != nil {
100+
panic(err)
101+
}
102+
endingPeriod, err := k.DistrKeeper.IncrementValidatorPeriod(sdkCtx, val)
103+
if err != nil {
104+
panic(err)
105+
}
106+
/* will error if still broken */
107+
_, err = k.DistrKeeper.CalculateDelegationRewards(sdkCtx, val, del, endingPeriod)
108+
if err != nil {
109+
panic(err)
110+
}
89111
}
90112

91113
// setup vote extension

0 commit comments

Comments
 (0)