diff --git a/x/genutil/client/cli/migrate.go b/x/genutil/client/cli/migrate.go index eeba89356a95..107d622971b9 100644 --- a/x/genutil/client/cli/migrate.go +++ b/x/genutil/client/cli/migrate.go @@ -120,7 +120,7 @@ $ %s migrate v0.36 /path/to/genesis.json --chain-id=cosmoshub-3 --genesis-time=2 return errors.Wrap(err, "failed to sort JSON genesis doc") } - fmt.Println(string(sortedBz)) + cmd.Println(string(sortedBz)) return nil }, } diff --git a/x/genutil/client/cli/migrate_test.go b/x/genutil/client/cli/migrate_test.go index d0dbf94a4764..acf307d85071 100644 --- a/x/genutil/client/cli/migrate_test.go +++ b/x/genutil/client/cli/migrate_test.go @@ -1,10 +1,20 @@ -package cli +package cli_test import ( "io/ioutil" + "os" "path" + "path/filepath" "testing" + abci "github.com/tendermint/tendermint/abci/types" + dbm "github.com/tendermint/tm-db" + + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/simapp" + sdk "github.com/cosmos/cosmos-sdk/types" + genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" + "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/stretchr/testify/require" @@ -17,6 +27,14 @@ import ( "github.com/cosmos/cosmos-sdk/tests" ) +// custom tx codec +func makeCodec() *codec.Codec { + var cdc = codec.New() + sdk.RegisterCodec(cdc) + codec.RegisterCrypto(cdc) + return cdc +} + func setupCmd(genesisTime string, chainID string) *cobra.Command { c := &cobra.Command{ Use: "c", @@ -24,15 +42,15 @@ func setupCmd(genesisTime string, chainID string) *cobra.Command { Run: func(_ *cobra.Command, args []string) {}, } - c.Flags().String(flagGenesisTime, genesisTime, "") - c.Flags().String(flagChainID, chainID, "") + c.Flags().String("genesis-time", genesisTime, "") + c.Flags().String("chain-id", chainID, "") return c } func TestGetMigrationCallback(t *testing.T) { - for _, version := range GetMigrationVersions() { - require.NotNil(t, GetMigrationCallback(version)) + for _, version := range genutilcli.GetMigrationVersions() { + require.NotNil(t, genutilcli.GetMigrationCallback(version)) } } @@ -52,13 +70,52 @@ func TestMigrateGenesis(t *testing.T) { defer cleanup() // Reject if we dont' have the right parameters or genesis does not exists - require.Error(t, MigrateGenesisCmd(ctx, cdc).RunE(nil, []string{target, genesisPath})) + require.Error(t, genutilcli.MigrateGenesisCmd(ctx, cdc).RunE(nil, []string{target, genesisPath})) // Noop migration with minimal genesis emptyGenesis := []byte(`{"chain_id":"test","app_state":{}}`) err = ioutil.WriteFile(genesisPath, emptyGenesis, 0600) require.Nil(t, err) cmd := setupCmd("", "test2") - require.NoError(t, MigrateGenesisCmd(ctx, cdc).RunE(cmd, []string{target, genesisPath})) + require.NoError(t, genutilcli.MigrateGenesisCmd(ctx, cdc).RunE(cmd, []string{target, genesisPath})) // Every migration function shuold tests its own module separately } + +func TestMigrateCommercioGenesisData(t *testing.T) { + home, cleanup := tests.NewTestCaseDir(t) + t.Cleanup(cleanup) + viper.Set(cli.HomeFlag, home) + viper.Set(flags.FlagName, "moniker") + logger := log.NewNopLogger() + cfg, err := tcmd.ParseConfig() + require.Nil(t, err) + ctx := server.NewContext(cfg, logger) + cdc := makeCodec() + + genesisPath := filepath.Join("testdata", "commercio-genesis.json") + require.NoError(t, err) + target := "v0.39" + + config := sdk.GetConfig() + config.SetBech32PrefixForAccount("did:com:", "did:com:pub") + config.Seal() + + // Migration with minimal genesis + cmd := setupCmd("2020-08-10T09:52:06.576222474Z", "test2") + _, newGenesisStream, _ := tests.ApplyMockIO(cmd) + require.NoError(t, genutilcli.MigrateGenesisCmd(ctx, cdc).RunE(cmd, []string{target, genesisPath})) + + db := dbm.NewMemDB() + app := simapp.NewSimApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, 0) + newGenesisBytes := newGenesisStream.Bytes() + + // Initialize the chain + require.NotPanics(t, func() { + app.InitChain( + abci.RequestInitChain{ + Validators: []abci.ValidatorUpdate{}, + AppStateBytes: newGenesisBytes, + }, + ) + }) +} diff --git a/x/genutil/client/cli/testdata/commercio-genesis.json b/x/genutil/client/cli/testdata/commercio-genesis.json new file mode 100644 index 000000000000..7ceefe9fa22d --- /dev/null +++ b/x/genutil/client/cli/testdata/commercio-genesis.json @@ -0,0 +1,244 @@ +{ + "genesis_time": "2020-08-06T09:52:06.576222474Z", + "chain_id": "testnet", + "consensus_params": { + "block": { + "max_bytes": "22020096", + "max_gas": "-1", + "time_iota_ms": "1000" + }, + "evidence": { + "max_age_num_blocks": "100000", + "max_age_duration": "172800000000000" + }, + "validator": { + "pub_key_types": [ + "ed25519" + ] + } + }, + "app_hash": "", + "app_state": { + "distribution": { + "params": { + "community_tax": "0.020000000000000000", + "base_proposer_reward": "0.010000000000000000", + "bonus_proposer_reward": "0.040000000000000000", + "withdraw_addr_enabled": true + }, + "fee_pool": { + "community_pool": [] + }, + "delegator_withdraw_infos": [], + "previous_proposer": "", + "outstanding_rewards": [], + "validator_accumulated_commissions": [], + "validator_historical_rewards": [], + "validator_current_rewards": [], + "delegator_starting_infos": [], + "validator_slash_events": [] + }, + "pricefeed": { + "oracles": [ + "did:com:1r93fsdxfthckptsz0wush4cx08t8c2fz4jhruw" + ], + "assets": [ + "ucommercio" + ], + "raw_prices": [ + { + "oracle": "did:com:1r93fsdxfthckptsz0wush4cx08t8c2fz4jhruw", + "price": { + "asset_name": "ucommercio", + "value": "1.000000000000000000", + "expiry": "100000000" + }, + "created": "0" + } + ], + "denom_blacklist": [ + "uccc" + ] + }, + "docs": { + "documents": null, + "receipts": null, + "supported_metadata_schemes": null, + "trusted_metadata_schema_proposers": null + }, + "accreditations": { + "liquidity_pool_amount": [], + "invites": null, + "trusted_service_providers": [ + "did:com:1r93fsdxfthckptsz0wush4cx08t8c2fz4jhruw", + "did:com:1zlr8yn5plplvf39zr7laj05e8dm8mqd7ljznhf" + ], + "stable_credits_denom": "uccc", + "memberships": [ + { + "owner": "did:com:1r93fsdxfthckptsz0wush4cx08t8c2fz4jhruw", + "membership_type": "black" + } + ] + }, + "params": null, + "vbr": { + "pool_amount": [ + { + "denom": "ucommercio", + "amount": "12500000000000.000000000000000000" + } + ], + "yearly_pool_amount": null, + "year_number": "0" + }, + "commerciomint": { + "positions": [], + "pool_amount": [], + "credits_denom": "uccc", + "collateral_rate": "2.000000000000000000" + }, + "slashing": { + "params": { + "signed_blocks_window": "100", + "min_signed_per_window": "0.500000000000000000", + "downtime_jail_duration": "600000000000", + "slash_fraction_double_sign": "0.050000000000000000", + "slash_fraction_downtime": "0.010000000000000000" + }, + "signing_infos": {}, + "missed_blocks": {} + }, + "creditrisk": { + "pool": [] + }, + "bank": { + "send_enabled": true, + "blocked_accounts": [] + }, + "id": { + "did_documents": null, + "power_up_requests": null + }, + "crisis": { + "constant_fee": { + "denom": "ucommercio", + "amount": "1000" + } + }, + "staking": { + "params": { + "unbonding_time": "1814400000000000", + "max_validators": 100, + "max_entries": 7, + "historical_entries": 0, + "bond_denom": "ucommercio" + }, + "last_total_power": "0", + "last_validator_powers": null, + "validators": null, + "delegations": null, + "unbonding_delegations": null, + "redelegations": null, + "exported": false + }, + "government": { + "government_address": "did:com:1r93fsdxfthckptsz0wush4cx08t8c2fz4jhruw", + "tumbler_address": "did:com:1ej6229ezfdn443ry72l964nle6ra0sc5sstyy3" + }, + "supply": { + "supply": [] + }, + "genutil": { + "gentxs": [ + { + "type": "cosmos-sdk/StdTx", + "value": { + "msg": [ + { + "type": "cosmos-sdk/MsgCreateValidator", + "value": { + "description": { + "moniker": "testchain", + "identity": "", + "website": "", + "security_contact": "", + "details": "" + }, + "commission": { + "rate": "0.100000000000000000", + "max_rate": "0.200000000000000000", + "max_change_rate": "0.010000000000000000" + }, + "min_self_delegation": "1", + "delegator_address": "did:com:1r93fsdxfthckptsz0wush4cx08t8c2fz4jhruw", + "validator_address": "did:com:valoper1r93fsdxfthckptsz0wush4cx08t8c2fzk3w93a", + "pubkey": "did:com:valconspub1zcjduepqt3k7lh6qledmay447gnfl3ns4ejjwrzqk9n6ydcmr5clka5yvjlsdhcpag", + "value": { + "denom": "ucommercio", + "amount": "100000000" + } + } + } + ], + "fee": { + "amount": [], + "gas": "200000" + }, + "signatures": [ + { + "pub_key": { + "type": "tendermint/PubKeySecp256k1", + "value": "A0ZymN/QXBkfyxQJjfxvjReNhZjHjdaKjBqmAs945S4f" + }, + "signature": "oqLK+EycP7E5Ikaacltz5WI8eg1mJQOKUNEKQa6AQIlqBN9oYX4BKlMXSNfbu8Y3JlUNTDYNfOJKA2oSw6nssw==" + } + ], + "memo": "e5ecfe387a5210f0e6798f63d37802db26a19868@192.168.1.6:26656" + } + } + ] + }, + "auth": { + "params": { + "max_memo_characters": "256", + "tx_sig_limit": "7", + "tx_size_cost_per_byte": "10", + "sig_verify_cost_ed25519": "590", + "sig_verify_cost_secp256k1": "1000" + }, + "accounts": [ + { + "type": "cosmos-sdk/Account", + "value": { + "address": "did:com:1r93fsdxfthckptsz0wush4cx08t8c2fz4jhruw", + "coins": [ + { + "denom": "ucommercio", + "amount": "10000000000000" + } + ], + "public_key": "", + "account_number": 0, + "sequence": 0 + } + }, + { + "type": "cosmos-sdk/Account", + "value": { + "address": "did:com:1zlr8yn5plplvf39zr7laj05e8dm8mqd7ljznhf", + "coins": [ + { + "denom": "uccc", + "amount": "10000000000" + } + ], + "public_key": "", + "account_number": 0, + "sequence": 0 + } + } + ] + } + } +} \ No newline at end of file