Skip to content

Commit 962ba81

Browse files
authored
fix v1.2.0 upgrade (#4850)
2 parents d2d1ac6 + b419601 commit 962ba81

File tree

1 file changed

+122
-26
lines changed

1 file changed

+122
-26
lines changed

uniond/app/upgrades/v1_2_0/upgrade.go

Lines changed: 122 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ import (
44
"context"
55
"math/big"
66

7+
errorsmod "cosmossdk.io/errors"
78
"cosmossdk.io/math"
89

910
upgradetypes "cosmossdk.io/x/upgrade/types"
1011
sdk "github.com/cosmos/cosmos-sdk/types"
1112
"github.com/cosmos/cosmos-sdk/types/module"
1213
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
1314
crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types"
14-
distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
1515
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
1616
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
1717
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
@@ -34,20 +34,21 @@ const DEVNET_SIG = "union1jk9psyhvgkrt2cumz8eytll2244m2nnz4yt2g2"
3434
const UNION_DEVNET = "union-minimal-devnet-1"
3535
const UNION_TESTNET = "union-testnet-10"
3636

37+
// NOTE: must expand map with mainnet address
38+
var unionFoundationSigMap = map[string]string{
39+
UNION_TESTNET: FOUNDATION_TESTNET_SIG,
40+
UNION_DEVNET: DEVNET_SIG,
41+
}
42+
3743
func CreateUpgradeHandler(mm *module.Manager, configurator module.Configurator, keepers *upgrades.AppKeepers) upgradetypes.UpgradeHandler {
3844
return func(ctx context.Context, plan upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
3945
migrations, err := mm.RunMigrations(ctx, configurator, vm)
4046
if err != nil {
4147
return nil, err
4248
}
4349

44-
// NOTE: must expand map with mainnet address
45-
unionFoundationSigMap := map[string]string{
46-
UNION_TESTNET: FOUNDATION_TESTNET_SIG,
47-
UNION_DEVNET: DEVNET_SIG,
48-
}
49-
5050
sdkCtx := sdk.UnwrapSDKContext(ctx)
51+
5152
unionFoundationMultiSig, err := sdk.AccAddressFromBech32(unionFoundationSigMap[sdkCtx.ChainID()])
5253
if err != nil {
5354
return nil, err
@@ -59,8 +60,18 @@ func CreateUpgradeHandler(mm *module.Manager, configurator module.Configurator,
5960
return nil, err
6061
}
6162

62-
for _, delegation := range delegations {
63-
accAddr, err := sdk.AccAddressFromBech32(delegation.DelegatorAddress)
63+
sdkCtx.Logger().Info("total delegations", "count", len(delegations))
64+
65+
for idx, delegation := range delegations {
66+
sdkCtx.Logger().Info(
67+
"delegation info",
68+
"idx", idx,
69+
"DelegatorAddress", delegation.DelegatorAddress,
70+
"ValidatorAddress", delegation.ValidatorAddress,
71+
"Shares", delegation.Shares,
72+
)
73+
74+
delegatorAddr, err := sdk.AccAddressFromBech32(delegation.DelegatorAddress)
6475
if err != nil {
6576
return nil, err
6677
}
@@ -69,26 +80,82 @@ func CreateUpgradeHandler(mm *module.Manager, configurator module.Configurator,
6980
return nil, err
7081
}
7182

72-
_, err = keepers.DistributionKeeper.WithdrawDelegationRewards(ctx, accAddr, valAddr)
83+
// Undelegate existing unbonding delegations
84+
// NOTE: Remove this first just in case it needs to read the state we manually delete after this
85+
unbondingDelegations, err := keepers.StakingKeeper.GetAllUnbondingDelegations(ctx, delegatorAddr)
7386
if err != nil {
7487
return nil, err
7588
}
76-
_, err = keepers.DistributionKeeper.WithdrawValidatorCommission(ctx, valAddr)
89+
90+
sdkCtx.Logger().Info("total unbonding delegations", "count", len(unbondingDelegations))
91+
92+
for idx, unbondingDelegation := range unbondingDelegations {
93+
sdkCtx.Logger().Info(
94+
"unbonding delegation info",
95+
"idx", idx,
96+
"DelegatorAddress", unbondingDelegation.DelegatorAddress,
97+
"ValidatorAddress", unbondingDelegation.ValidatorAddress,
98+
"Entries", len(unbondingDelegation.Entries),
99+
)
100+
101+
if err := keepers.StakingKeeper.RemoveUnbondingDelegation(ctx, unbondingDelegation); err != nil {
102+
return nil, err
103+
}
104+
}
105+
106+
// delete all information relating to the existing validator delegations and rewards/commission
107+
_ = keepers.DistributionKeeper.DeleteValidatorOutstandingRewards(ctx, valAddr)
108+
_ = keepers.DistributionKeeper.DeleteDelegatorStartingInfo(ctx, valAddr, delegatorAddr)
109+
_ = keepers.DistributionKeeper.DeleteValidatorAccumulatedCommission(ctx, valAddr)
110+
_ = keepers.DistributionKeeper.DeleteDelegatorWithdrawAddr(
111+
ctx,
112+
delegatorAddr,
113+
// this is actually unused and shouldn't need to be provided lol
114+
// this is passed here just to make it compile
115+
delegatorAddr,
116+
)
117+
rewards, err := keepers.DistributionKeeper.GetValidatorCurrentRewards(ctx, valAddr)
77118
if err != nil {
78119
return nil, err
79120
}
80-
81-
validator, err := keepers.StakingKeeper.GetValidator(ctx, valAddr)
121+
rewards.Rewards = sdk.DecCoins{}
122+
err = keepers.DistributionKeeper.SetValidatorCurrentRewards(ctx, valAddr, rewards)
82123
if err != nil {
83124
return nil, err
84125
}
85-
validator.MinSelfDelegation = math.NewInt(0)
86-
keepers.StakingKeeper.SetValidator(ctx, validator)
87126

88-
_, _, err = keepers.StakingKeeper.Undelegate(ctx, accAddr, valAddr, delegation.Shares)
127+
if err := keepers.StakingKeeper.RemoveDelegation(ctx, delegation); err != nil {
128+
return nil, err
129+
}
130+
}
131+
132+
validators, err := keepers.StakingKeeper.GetAllValidators(ctx)
133+
if err != nil {
134+
return nil, err
135+
}
136+
137+
for idx, validator := range validators {
138+
// the only delegation to validators is now via the foundation multisig
139+
validator.MinSelfDelegation = math.NewInt(0)
140+
// set tokens to zero as the delegate call at the end of the migration will set this
141+
// validator.Tokens = math.ZeroInt()
142+
validator, _ = validator.RemoveDelShares(validator.DelegatorShares)
143+
err = keepers.StakingKeeper.SetValidator(ctx, validator)
89144
if err != nil {
90145
return nil, err
91146
}
147+
148+
if validator.IsJailed() {
149+
valAddr, err := sdk.ValAddressFromBech32(validator.OperatorAddress)
150+
if err != nil {
151+
return nil, err
152+
}
153+
sdkCtx.Logger().Info("validator is jailed, removing from set", "idx", idx, "addr", validator.OperatorAddress)
154+
err = keepers.StakingKeeper.RemoveValidator(ctx, valAddr)
155+
if err != nil {
156+
return nil, errorsmod.Wrapf(err, "unable to remove validator %s", validator.OperatorAddress)
157+
}
158+
}
92159
}
93160

94161
// Mint U
@@ -108,6 +175,7 @@ func CreateUpgradeHandler(mm *module.Manager, configurator module.Configurator,
108175
return nil, err
109176
}
110177
stakingParams.BondDenom = U_BASE_DENOM
178+
// NOTE: *technically* this should be 0, but all commission will go to the community fund anyways since we set the community tax in x/distribution to 100%
111179
stakingParams.MinCommissionRate = math.LegacyMustNewDecFromStr("0.05")
112180
err = keepers.StakingKeeper.SetParams(ctx, stakingParams)
113181
if err != nil {
@@ -147,13 +215,12 @@ func CreateUpgradeHandler(mm *module.Manager, configurator module.Configurator,
147215
return nil, err
148216
}
149217

150-
sdkCtx = sdk.UnwrapSDKContext(ctx)
151-
152218
// Update x/distribution
153219
distrParams, err := keepers.DistributionKeeper.Params.Get(ctx)
154220
if err != nil {
155221
return nil, err
156222
}
223+
// set community tax to 100% to take all rewards
157224
distrParams.CommunityTax = math.LegacyMustNewDecFromStr("1")
158225
keepers.DistributionKeeper.Params.Set(ctx, distrParams)
159226

@@ -163,33 +230,62 @@ func CreateUpgradeHandler(mm *module.Manager, configurator module.Configurator,
163230
return nil, err
164231
}
165232
feeMarketParams.FeeDenom = U_BASE_DENOM
233+
// distribute fees rather than burning, the 100% community tax should intercept these before they're sent to the stakers (?)
166234
feeMarketParams.DistributeFees = true
167235
err = keepers.FeeMarketKeeper.SetParams(sdkCtx, feeMarketParams)
168236
if err != nil {
169237
return nil, err
170238
}
171239

172240
// Redelegate to validators from Union foundation account
173-
for _, delegation := range delegations {
241+
// NOTE: This is the original delegations list, since we want to reconstruct the same validator delegations but with the foundation account being the owner of all delegations
242+
for idx, delegation := range delegations {
243+
sdkCtx.Logger().Info(
244+
"re-delegating delegation info",
245+
"idx", idx,
246+
"DelegatorAddress", delegation.DelegatorAddress,
247+
"ValidatorAddress", delegation.ValidatorAddress,
248+
"Shares", delegation.Shares,
249+
)
250+
174251
valAddr, err := sdk.ValAddressFromBech32(delegation.ValidatorAddress)
175252
if err != nil {
176253
return nil, err
177254
}
178255
validator, err := keepers.StakingKeeper.GetValidator(ctx, valAddr)
179256
if err != nil {
180-
return nil, err
257+
if err == stakingtypes.ErrNoValidatorFound {
258+
sdkCtx.Logger().Info(
259+
"validator not found",
260+
"addr", valAddr,
261+
)
262+
continue
263+
}
181264
}
182265

183-
keepers.DistributionKeeper.SetValidatorOutstandingRewards(ctx, valAddr, distributiontypes.ValidatorOutstandingRewards{})
184-
185-
_, err = keepers.StakingKeeper.Delegate(ctx, unionFoundationMultiSig, delegation.Shares.RoundInt(), stakingtypes.Unbonded, validator, true)
186-
if err != nil {
187-
return nil, err
266+
if validator.IsJailed() {
267+
// this check is likely redundant since we removed jailed validators from the set above
268+
sdkCtx.Logger().Info(
269+
"validator is jailed",
270+
"addr", valAddr,
271+
)
272+
} else {
273+
_, err = keepers.StakingKeeper.Delegate(
274+
ctx,
275+
unionFoundationMultiSig,
276+
delegation.Shares.RoundInt(),
277+
stakingtypes.Unbonded,
278+
validator,
279+
true,
280+
)
281+
if err != nil {
282+
return nil, err
283+
}
188284
}
189285
}
190286

191287
// Burn old tokens
192-
burnToken(ctx, *keepers, "muno") // union-testnet-10 gas token
288+
burnToken(ctx, *keepers, "muno") // union-minimal-devnet-1 (local devnet) and union-testnet-10 gas token
193289
burnToken(ctx, *keepers, "upoa") // union-1 and union-testnet-10 PoA token
194290
burnToken(ctx, *keepers, "ugas") // union-1 gas token
195291

0 commit comments

Comments
 (0)