github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/genaccounts/legacy/v0_36/migrate.go (about) 1 // DONTCOVER 2 // nolint 3 package v0_36 4 5 import ( 6 "fmt" 7 8 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 9 v034distr "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/distribution/legacy/v0_34" 10 v034accounts "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/genaccounts/legacy/v0_34" 11 v034gov "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/gov/legacy/v0_34" 12 v034staking "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/staking/legacy/v0_34" 13 14 "github.com/fibonacci-chain/fbc/libs/tendermint/crypto" 15 ) 16 17 const ( 18 notBondedPoolName = "not_bonded_tokens_pool" 19 bondedPoolName = "bonded_tokens_pool" 20 feeCollectorName = "fee_collector" 21 mintModuleName = "mint" 22 23 basic = "basic" 24 minter = "minter" 25 burner = "burner" 26 staking = "staking" 27 ) 28 29 // Migrate accepts exported genesis state from v0.34 and migrates it to v0.36 30 // genesis state. It deletes the governance base accounts and creates the new module accounts. 31 // The remaining accounts are updated to the new GenesisAccount type from 0.36 32 func Migrate( 33 oldGenState v034accounts.GenesisState, fees sdk.Coins, communityPool sdk.DecCoins, 34 deposits []v034gov.DepositWithMetadata, vals v034staking.Validators, ubds []v034staking.UnbondingDelegation, 35 valOutRewards []v034distr.ValidatorOutstandingRewardsRecord, bondDenom, distrModuleName, govModuleName string, 36 ) GenesisState { 37 38 depositedCoinsAccAddr := sdk.AccAddress(crypto.AddressHash([]byte("govDepositedCoins"))) 39 burnedDepositCoinsAccAddr := sdk.AccAddress(crypto.AddressHash([]byte("govBurnedDepositCoins"))) 40 41 bondedAmt := sdk.ZeroInt() 42 notBondedAmt := sdk.ZeroInt() 43 44 // remove the two previous governance base accounts for deposits and burned 45 // coins from rejected proposals add six new module accounts: 46 // distribution, gov, mint, fee collector, bonded and not bonded pool 47 var ( 48 newGenState GenesisState 49 govCoins sdk.Coins 50 extraAccounts = 6 51 ) 52 53 for _, acc := range oldGenState { 54 switch { 55 case acc.Address.Equals(depositedCoinsAccAddr): 56 // remove gov deposits base account 57 govCoins = acc.Coins 58 extraAccounts -= 1 59 60 case acc.Address.Equals(burnedDepositCoinsAccAddr): 61 // remove gov burned deposits base account 62 extraAccounts -= 1 63 64 default: 65 newGenState = append( 66 newGenState, 67 NewGenesisAccount( 68 acc.Address, acc.Coins, acc.Sequence, 69 acc.OriginalVesting, acc.DelegatedFree, acc.DelegatedVesting, 70 acc.StartTime, acc.EndTime, "", []string{}, 71 ), 72 ) 73 } 74 } 75 76 var expDeposits sdk.Coins 77 for _, deposit := range deposits { 78 expDeposits = expDeposits.Add(deposit.Deposit.Amount...) 79 } 80 81 if !expDeposits.IsEqual(govCoins) { 82 panic( 83 fmt.Sprintf( 84 "pre migration deposit base account coins ≠ stored deposits coins (%s ≠ %s)", 85 expDeposits.String(), govCoins.String(), 86 ), 87 ) 88 } 89 90 // get staking module accounts coins 91 for _, validator := range vals { 92 switch validator.Status { 93 case sdk.Bonded: 94 bondedAmt = bondedAmt.Add(validator.Tokens) 95 96 case sdk.Unbonding, sdk.Unbonded: 97 notBondedAmt = notBondedAmt.Add(validator.Tokens) 98 99 default: 100 panic("invalid validator status") 101 } 102 } 103 104 for _, ubd := range ubds { 105 for _, entry := range ubd.Entries { 106 notBondedAmt = notBondedAmt.Add(entry.Balance) 107 } 108 } 109 110 bondedCoins := sdk.NewCoins(sdk.NewCoin(bondDenom, bondedAmt)) 111 notBondedCoins := sdk.NewCoins(sdk.NewCoin(bondDenom, notBondedAmt)) 112 113 // get distr module account coins 114 var distrDecCoins sdk.DecCoins 115 for _, reward := range valOutRewards { 116 distrDecCoins = distrDecCoins.Add(reward.OutstandingRewards...) 117 } 118 119 distrCoins, _ := distrDecCoins.Add(communityPool...).TruncateDecimal() 120 121 // get module account addresses 122 feeCollectorAddr := sdk.AccAddress(crypto.AddressHash([]byte(feeCollectorName))) 123 govAddr := sdk.AccAddress(crypto.AddressHash([]byte(govModuleName))) 124 bondedAddr := sdk.AccAddress(crypto.AddressHash([]byte(bondedPoolName))) 125 notBondedAddr := sdk.AccAddress(crypto.AddressHash([]byte(notBondedPoolName))) 126 distrAddr := sdk.AccAddress(crypto.AddressHash([]byte(distrModuleName))) 127 mintAddr := sdk.AccAddress(crypto.AddressHash([]byte(mintModuleName))) 128 129 // create module genesis accounts 130 feeCollectorModuleAcc := NewGenesisAccount( 131 feeCollectorAddr, fees, 0, 132 sdk.Coins{}, sdk.Coins{}, sdk.Coins{}, 133 0, 0, feeCollectorName, []string{basic}, 134 ) 135 govModuleAcc := NewGenesisAccount( 136 govAddr, govCoins, 0, 137 sdk.Coins{}, sdk.Coins{}, sdk.Coins{}, 138 0, 0, govModuleName, []string{burner}, 139 ) 140 distrModuleAcc := NewGenesisAccount( 141 distrAddr, distrCoins, 0, 142 sdk.Coins{}, sdk.Coins{}, sdk.Coins{}, 143 0, 0, distrModuleName, []string{basic}, 144 ) 145 bondedModuleAcc := NewGenesisAccount( 146 bondedAddr, bondedCoins, 0, 147 sdk.Coins{}, sdk.Coins{}, sdk.Coins{}, 148 0, 0, bondedPoolName, []string{burner, staking}, 149 ) 150 notBondedModuleAcc := NewGenesisAccount( 151 notBondedAddr, notBondedCoins, 0, 152 sdk.Coins{}, sdk.Coins{}, sdk.Coins{}, 153 0, 0, notBondedPoolName, []string{burner, staking}, 154 ) 155 mintModuleAcc := NewGenesisAccount( 156 mintAddr, sdk.Coins{}, 0, 157 sdk.Coins{}, sdk.Coins{}, sdk.Coins{}, 158 0, 0, mintModuleName, []string{minter}, 159 ) 160 161 newGenState = append( 162 newGenState, 163 []GenesisAccount{ 164 feeCollectorModuleAcc, govModuleAcc, distrModuleAcc, 165 bondedModuleAcc, notBondedModuleAcc, mintModuleAcc, 166 }..., 167 ) 168 169 // verify the total number of accounts is correct 170 if len(newGenState) != len(oldGenState)+extraAccounts { 171 panic( 172 fmt.Sprintf( 173 "invalid total number of genesis accounts; got: %d, expected: %d", 174 len(newGenState), len(oldGenState)+extraAccounts), 175 ) 176 } 177 178 return newGenState 179 }