github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/genutil/gentx.go (about)

     1  package genutil
     2  
     3  // DONTCOVER
     4  
     5  import (
     6  	"encoding/json"
     7  	"fmt"
     8  
     9  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    10  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    11  	authexported "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/exported"
    12  	authtypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/types"
    13  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/genutil/types"
    14  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    15  	stakingtypes "github.com/fibonacci-chain/fbc/x/staking/types"
    16  )
    17  
    18  // ValidateAccountInGenesis checks that the provided key has sufficient coins in the genesis accounts
    19  func ValidateAccountInGenesis(appGenesisState map[string]json.RawMessage,
    20  	genAccIterator types.GenesisAccountsIterator,
    21  	key sdk.AccAddress, coins sdk.Coins, cdc *codec.Codec) error {
    22  
    23  	accountIsInGenesis := false
    24  
    25  	// TODO: refactor out bond denom to common state area
    26  	bondDenom := sdk.DefaultBondDenom
    27  
    28  	genUtilDataBz := appGenesisState[stakingtypes.ModuleName]
    29  	var genesisState GenesisState
    30  	cdc.MustUnmarshalJSON(genUtilDataBz, &genesisState)
    31  
    32  	var err error
    33  	genAccIterator.IterateGenesisAccounts(cdc, appGenesisState,
    34  		func(acc authexported.Account) (stop bool) {
    35  			accAddress := acc.GetAddress()
    36  			accCoins := acc.GetCoins()
    37  
    38  			// Ensure that account is in genesis
    39  			if accAddress.Equals(key) {
    40  
    41  				// Ensure account contains enough funds of default bond denom
    42  				if coins.AmountOf(bondDenom).GT(accCoins.AmountOf(bondDenom)) {
    43  					err = fmt.Errorf(
    44  						"account %v is in genesis, but it only has %v%v available to stake, not %v%v",
    45  						key.String(), accCoins.AmountOf(bondDenom), bondDenom, coins.AmountOf(bondDenom), bondDenom,
    46  					)
    47  					return true
    48  				}
    49  				accountIsInGenesis = true
    50  				return true
    51  			}
    52  			return false
    53  		},
    54  	)
    55  	if err != nil {
    56  		return err
    57  	}
    58  
    59  	if !accountIsInGenesis {
    60  		return fmt.Errorf("account %s in not in the app_state.accounts array of genesis.json", key)
    61  	}
    62  
    63  	return nil
    64  }
    65  
    66  type deliverTxfn func(abci.RequestDeliverTx) abci.ResponseDeliverTx
    67  
    68  // DeliverGenTxs - deliver a genesis transaction
    69  func DeliverGenTxs(ctx sdk.Context, cdc *codec.Codec, genTxs []json.RawMessage,
    70  	stakingKeeper types.StakingKeeper, deliverTx deliverTxfn) []abci.ValidatorUpdate {
    71  
    72  	for _, genTx := range genTxs {
    73  		var tx authtypes.StdTx
    74  		cdc.MustUnmarshalJSON(genTx, &tx)
    75  		bz := cdc.MustMarshalBinaryLengthPrefixed(tx)
    76  		res := deliverTx(abci.RequestDeliverTx{Tx: bz})
    77  		if !res.IsOK() {
    78  			panic(res.Log)
    79  		}
    80  	}
    81  	return stakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx)
    82  }