-
Notifications
You must be signed in to change notification settings - Fork 3.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
560652a
commit 2f84c50
Showing
6 changed files
with
237 additions
and
160 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,182 @@ | ||
package sims | ||
|
||
import ( | ||
"context" | ||
"encoding/json" | ||
"fmt" | ||
"time" | ||
|
||
abci "github.com/tendermint/tendermint/abci/types" | ||
tmjson "github.com/tendermint/tendermint/libs/json" | ||
"github.com/tendermint/tendermint/libs/log" | ||
tmproto "github.com/tendermint/tendermint/proto/tendermint/types" | ||
tmtypes "github.com/tendermint/tendermint/types" | ||
dbm "github.com/tendermint/tm-db" | ||
|
||
"github.com/cosmos/cosmos-sdk/baseapp" | ||
"github.com/cosmos/cosmos-sdk/codec" | ||
codectypes "github.com/cosmos/cosmos-sdk/codec/types" | ||
cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" | ||
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" | ||
"github.com/cosmos/cosmos-sdk/depinject" | ||
"github.com/cosmos/cosmos-sdk/runtime" | ||
"github.com/cosmos/cosmos-sdk/testutil/mock" | ||
sdk "github.com/cosmos/cosmos-sdk/types" | ||
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" | ||
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" | ||
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" | ||
) | ||
|
||
// DefaultConsensusParams defines the default Tendermint consensus params used in | ||
// SimApp testing. | ||
var DefaultConsensusParams = &tmproto.ConsensusParams{ | ||
Block: &tmproto.BlockParams{ | ||
MaxBytes: 200000, | ||
MaxGas: 2000000, | ||
}, | ||
Evidence: &tmproto.EvidenceParams{ | ||
MaxAgeNumBlocks: 302400, | ||
MaxAgeDuration: 504 * time.Hour, // 3 weeks is the max duration | ||
MaxBytes: 10000, | ||
}, | ||
Validator: &tmproto.ValidatorParams{ | ||
PubKeyTypes: []string{ | ||
tmtypes.ABCIPubKeyTypeEd25519, | ||
}, | ||
}, | ||
} | ||
|
||
// Setup initializes a new runtime.App. A Nop logger is set in runtime.App. | ||
func Setup(appConfig depinject.Config, extraInject ...interface{}) (*runtime.App, error) { | ||
// | ||
// create app | ||
// | ||
var appBuilder *runtime.AppBuilder | ||
var msgServiceRouter *baseapp.MsgServiceRouter | ||
var codec codec.Codec | ||
|
||
if err := depinject.Inject( | ||
appConfig, | ||
append(extraInject, &appBuilder, &msgServiceRouter, &codec)..., | ||
); err != nil { | ||
return nil, fmt.Errorf("failed to inject dependencies: %w", err) | ||
} | ||
|
||
app := appBuilder.Build(log.NewNopLogger(), dbm.NewMemDB(), nil, msgServiceRouter) | ||
if err := app.Load(true); err != nil { | ||
return nil, fmt.Errorf("failed to load app: %w", err) | ||
} | ||
|
||
// | ||
// create genesis and validator | ||
// | ||
privVal := mock.NewPV() | ||
pubKey, err := privVal.GetPubKey(context.TODO()) | ||
if err != nil { | ||
return nil, fmt.Errorf("failed to get pub key: %w", err) | ||
} | ||
|
||
// create validator set with single validator | ||
validator := tmtypes.NewValidator(pubKey, 1) | ||
valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{validator}) | ||
|
||
// generate genesis account | ||
senderPrivKey := secp256k1.GenPrivKey() | ||
acc := authtypes.NewBaseAccount(senderPrivKey.PubKey().Address().Bytes(), senderPrivKey.PubKey(), 0, 0) | ||
balance := banktypes.Balance{ | ||
Address: acc.GetAddress().String(), | ||
Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100000000000000))), | ||
} | ||
|
||
genesisState, err := GenesisStateWithValSet(codec, appBuilder.DefaultGenesis(), valSet, []authtypes.GenesisAccount{acc}, balance) | ||
if err != nil { | ||
return nil, fmt.Errorf("failed to create genesis state: %w", err) | ||
} | ||
|
||
// init chain must be called to stop deliverState from being nil | ||
stateBytes, err := tmjson.MarshalIndent(genesisState, "", " ") | ||
if err != nil { | ||
return nil, fmt.Errorf("failed to marshal default genesis state: %w", err) | ||
} | ||
|
||
// init chain will set the validator set and initialize the genesis accounts | ||
app.InitChain( | ||
abci.RequestInitChain{ | ||
Validators: []abci.ValidatorUpdate{}, | ||
ConsensusParams: DefaultConsensusParams, | ||
AppStateBytes: stateBytes, | ||
}, | ||
) | ||
|
||
return app, nil | ||
} | ||
|
||
// GenesisStateWithValSet returns a new genesis state with the validator set | ||
func GenesisStateWithValSet(codec codec.Codec, genesisState map[string]json.RawMessage, | ||
valSet *tmtypes.ValidatorSet, genAccs []authtypes.GenesisAccount, | ||
balances ...banktypes.Balance, | ||
) (map[string]json.RawMessage, error) { | ||
// set genesis accounts | ||
authGenesis := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccs) | ||
genesisState[authtypes.ModuleName] = codec.MustMarshalJSON(authGenesis) | ||
|
||
validators := make([]stakingtypes.Validator, 0, len(valSet.Validators)) | ||
delegations := make([]stakingtypes.Delegation, 0, len(valSet.Validators)) | ||
|
||
bondAmt := sdk.DefaultPowerReduction | ||
|
||
for _, val := range valSet.Validators { | ||
pk, err := cryptocodec.FromTmPubKeyInterface(val.PubKey) | ||
if err != nil { | ||
return nil, fmt.Errorf("failed to convert pubkey: %w", err) | ||
} | ||
|
||
pkAny, err := codectypes.NewAnyWithValue(pk) | ||
if err != nil { | ||
return nil, fmt.Errorf("failed to create new any: %w", err) | ||
} | ||
|
||
validator := stakingtypes.Validator{ | ||
OperatorAddress: sdk.ValAddress(val.Address).String(), | ||
ConsensusPubkey: pkAny, | ||
Jailed: false, | ||
Status: stakingtypes.Bonded, | ||
Tokens: bondAmt, | ||
DelegatorShares: sdk.OneDec(), | ||
Description: stakingtypes.Description{}, | ||
UnbondingHeight: int64(0), | ||
UnbondingTime: time.Unix(0, 0).UTC(), | ||
Commission: stakingtypes.NewCommission(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), | ||
MinSelfDelegation: sdk.ZeroInt(), | ||
} | ||
validators = append(validators, validator) | ||
delegations = append(delegations, stakingtypes.NewDelegation(genAccs[0].GetAddress(), val.Address.Bytes(), sdk.OneDec())) | ||
|
||
} | ||
// set validators and delegations | ||
stakingGenesis := stakingtypes.NewGenesisState(stakingtypes.DefaultParams(), validators, delegations) | ||
genesisState[stakingtypes.ModuleName] = codec.MustMarshalJSON(stakingGenesis) | ||
|
||
totalSupply := sdk.NewCoins() | ||
for _, b := range balances { | ||
// add genesis acc tokens to total supply | ||
totalSupply = totalSupply.Add(b.Coins...) | ||
} | ||
|
||
for range delegations { | ||
// add delegated tokens to total supply | ||
totalSupply = totalSupply.Add(sdk.NewCoin(sdk.DefaultBondDenom, bondAmt)) | ||
} | ||
|
||
// add bonded amount to bonded pool module account | ||
balances = append(balances, banktypes.Balance{ | ||
Address: authtypes.NewModuleAddress(stakingtypes.BondedPoolName).String(), | ||
Coins: sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, bondAmt)}, | ||
}) | ||
|
||
// update total supply | ||
bankGenesis := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, totalSupply, []banktypes.Metadata{}) | ||
genesisState[banktypes.ModuleName] = codec.MustMarshalJSON(bankGenesis) | ||
|
||
return genesisState, nil | ||
} |
Oops, something went wrong.