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 }