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  }