@@ -4,14 +4,14 @@ import (
4
4
"context"
5
5
"math/big"
6
6
7
+ errorsmod "cosmossdk.io/errors"
7
8
"cosmossdk.io/math"
8
9
9
10
upgradetypes "cosmossdk.io/x/upgrade/types"
10
11
sdk "github.com/cosmos/cosmos-sdk/types"
11
12
"github.com/cosmos/cosmos-sdk/types/module"
12
13
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
13
14
crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types"
14
- distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
15
15
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
16
16
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
17
17
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
@@ -34,20 +34,21 @@ const DEVNET_SIG = "union1jk9psyhvgkrt2cumz8eytll2244m2nnz4yt2g2"
34
34
const UNION_DEVNET = "union-minimal-devnet-1"
35
35
const UNION_TESTNET = "union-testnet-10"
36
36
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
+
37
43
func CreateUpgradeHandler (mm * module.Manager , configurator module.Configurator , keepers * upgrades.AppKeepers ) upgradetypes.UpgradeHandler {
38
44
return func (ctx context.Context , plan upgradetypes.Plan , vm module.VersionMap ) (module.VersionMap , error ) {
39
45
migrations , err := mm .RunMigrations (ctx , configurator , vm )
40
46
if err != nil {
41
47
return nil , err
42
48
}
43
49
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
-
50
50
sdkCtx := sdk .UnwrapSDKContext (ctx )
51
+
51
52
unionFoundationMultiSig , err := sdk .AccAddressFromBech32 (unionFoundationSigMap [sdkCtx .ChainID ()])
52
53
if err != nil {
53
54
return nil , err
@@ -59,8 +60,18 @@ func CreateUpgradeHandler(mm *module.Manager, configurator module.Configurator,
59
60
return nil , err
60
61
}
61
62
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 )
64
75
if err != nil {
65
76
return nil , err
66
77
}
@@ -69,26 +80,82 @@ func CreateUpgradeHandler(mm *module.Manager, configurator module.Configurator,
69
80
return nil , err
70
81
}
71
82
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 )
73
86
if err != nil {
74
87
return nil , err
75
88
}
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 )
77
118
if err != nil {
78
119
return nil , err
79
120
}
80
-
81
- validator , err : = keepers .StakingKeeper . GetValidator (ctx , valAddr )
121
+ rewards . Rewards = sdk. DecCoins {}
122
+ err = keepers .DistributionKeeper . SetValidatorCurrentRewards (ctx , valAddr , rewards )
82
123
if err != nil {
83
124
return nil , err
84
125
}
85
- validator .MinSelfDelegation = math .NewInt (0 )
86
- keepers .StakingKeeper .SetValidator (ctx , validator )
87
126
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 )
89
144
if err != nil {
90
145
return nil , err
91
146
}
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
+ }
92
159
}
93
160
94
161
// Mint U
@@ -108,6 +175,7 @@ func CreateUpgradeHandler(mm *module.Manager, configurator module.Configurator,
108
175
return nil , err
109
176
}
110
177
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%
111
179
stakingParams .MinCommissionRate = math .LegacyMustNewDecFromStr ("0.05" )
112
180
err = keepers .StakingKeeper .SetParams (ctx , stakingParams )
113
181
if err != nil {
@@ -147,13 +215,12 @@ func CreateUpgradeHandler(mm *module.Manager, configurator module.Configurator,
147
215
return nil , err
148
216
}
149
217
150
- sdkCtx = sdk .UnwrapSDKContext (ctx )
151
-
152
218
// Update x/distribution
153
219
distrParams , err := keepers .DistributionKeeper .Params .Get (ctx )
154
220
if err != nil {
155
221
return nil , err
156
222
}
223
+ // set community tax to 100% to take all rewards
157
224
distrParams .CommunityTax = math .LegacyMustNewDecFromStr ("1" )
158
225
keepers .DistributionKeeper .Params .Set (ctx , distrParams )
159
226
@@ -163,33 +230,62 @@ func CreateUpgradeHandler(mm *module.Manager, configurator module.Configurator,
163
230
return nil , err
164
231
}
165
232
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 (?)
166
234
feeMarketParams .DistributeFees = true
167
235
err = keepers .FeeMarketKeeper .SetParams (sdkCtx , feeMarketParams )
168
236
if err != nil {
169
237
return nil , err
170
238
}
171
239
172
240
// 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
+
174
251
valAddr , err := sdk .ValAddressFromBech32 (delegation .ValidatorAddress )
175
252
if err != nil {
176
253
return nil , err
177
254
}
178
255
validator , err := keepers .StakingKeeper .GetValidator (ctx , valAddr )
179
256
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
+ }
181
264
}
182
265
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
+ }
188
284
}
189
285
}
190
286
191
287
// 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
193
289
burnToken (ctx , * keepers , "upoa" ) // union-1 and union-testnet-10 PoA token
194
290
burnToken (ctx , * keepers , "ugas" ) // union-1 gas token
195
291
0 commit comments