From d9ede6551aaa09bb20a449e3864bbd9654846bdd Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 5 Oct 2020 23:28:14 +0200 Subject: [PATCH] 0.39->0.40 CLI `migrate` command (#6839) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * WIP on BaseAccount protobuf pub_key * WIP on BaseAccount.PubKey * Migrate supply * Change validator_slash_event * Add evidence * Add evidence to genutil migrate * Fix lint * Add println * No _ in package name * Add slashing migrate * Add tests for slashing * Add capacity to array * stray fmt.Prinlnt * WIP on BaseAccount pub key * Put current types in v0_40 * Add evidence old types * Remove useless impl * Add RegisterInterface * Add clientCtx to argument * Register evidence interfaces * Update PubKey * Update Account * Docs * WIP on protobuf keys * Use Type() and Bytes() in sr25519 pub key Equals * Add tests * Add few more tests * Update other pub/priv key types Equals * Fix PrivKey's Sign method * Rename variables in tests * Fix infinite recursive calls * Use tm ed25519 keys * Add Sign and VerifySignature tests * Remove ed25519 and sr25519 references * proto linting * Add proto crypto file * Implement some of the new multisig proto type methods * Add tests for MultisigThresholdPubKey * Add tests for pubkey pb/amino conversion functions * Move crypto types.go and register new proto pubkeys * Add missing pointer ref * Address review comments * panic in MultisigThresholdPubKey VerifySignature * Fix compile errors * Remove pk conversion in ante handler * Use internal crypto.PubKey in multisig * Add tests for MultisigThresholdPubKey VerifyMultisignature * Only keep LegacyAminoMultisigThresholdPubKey and move to proto keys to v1 * Remove conversion functions and introduce internal PubKey type * Override Amino marshaling for proto pubkeys * Merge master * Make proto-gen * Start removal of old PubKeyMultisigThreshold references * Fix tests * Fix solomachine * Fix ante handler tests * Pull latest go-amino * Remove ed25519 * Remove old secp256k1 PubKey and PrivKey * Uncomment test case * Fix linting issues * More linting * Revert tests keys values * Add Amino overrides to proto keys * Add pubkey test * Fix tests * Use threshold isntead of K * Standardize Type * Revert standardize types commit * Fix build * Fix lint * Fix lint * Add comment * Register crypto.PubKey * Add empty key in BuildSimTx * Simplify proto names * Unpack interfaces for signing desc * Fix IBC tests? * Format proto * Use secp256k1 in ibc * Fixed merge issues * Uncomment tests * Update x/ibc/testing/solomachine.go * UnpackInterfaces for solomachine types * Remove old multisig * Add amino marshal for multisig * Fix lint * Correctly register amino * One test left! * Remove old struct * Fix test * Fix test * Unpack into tmcrypto * Remove old threshold pubkey tests * Fix register amino * Fix lint * Use sdk crypto PubKey in multisig UnpackInterfaces * Potential fix? * Register LegacyAminoPubKey * Register our own PubKey * Register tmcrypto PubKey * Register both PubKeys * Register interfaces in test * Refactor fiels * Add comments * Remove old cosmos-sdk/crypto/keys reference * Use anil's suggestion * Add norace back * Use our own ed25519 * Fix pubkey types * Fix network tests * Fix more tests * Make ibc work? * Use TM pubkey in NewValidator * Fix lint * Put interface in tpyes * rerun CI * Better name register * Remove stray code * Add ed25519 tests * Check nil * Correct interface impl assert * rerun CI * Add fix for Bech32 * Address comments * FIx lint * Add tests for solomachine unpack interfaces * Fix query tx by hash * Better name in amino register * Fix lint * Add back ed25519 test (fixes #7352) * go mod tidy * Fix merge issues * Sort import * Add test for backwards-compatibility * Fix tests * Fix merge issue * Fix merge issues * Fix tests build * Fix tests * Marshal to proto * Fix 040 marshalling * Remove dontcover * Fix equivocation * Add vesting * Fix vesting * Fix slashing test * Fix evidence test * Remove pb.go files * Fix legacy auth tests * deterministic tests help * Fix auth tests * Remove useless code * Small cleanups * Add comment * Fix migrate hub * fmt.Println * No need to marshal indent * Update proto comment * Fix merge issues * Support nil pubkey * Use protobuf empty * Address comments * Fix tests * Unify legacy package names Co-authored-by: Aaron Craelius Co-authored-by: Aaron Craelius Co-authored-by: blushi Co-authored-by: Alexander Bezobchuk Co-authored-by: colin axnér <25233464+colin-axner@users.noreply.github.com> Co-authored-by: Zaki Manian Co-authored-by: Alessio Treglia --- .../cosmos/distribution/v1beta1/genesis.proto | 4 +- x/auth/legacy/{v0_34 => v034}/types.go | 2 +- x/auth/legacy/{v0_36 => v036}/migrate.go | 4 +- x/auth/legacy/{v0_36 => v036}/migrate_test.go | 4 +- x/auth/legacy/{v0_36 => v036}/types.go | 4 +- x/auth/legacy/{v0_38 => v038}/migrate.go | 4 +- x/auth/legacy/{v0_38 => v038}/migrate_test.go | 30 +- x/auth/legacy/{v0_38 => v038}/types.go | 7 +- x/auth/legacy/{v0_39 => v039}/migrate.go | 2 +- x/auth/legacy/{v0_39 => v039}/types.go | 9 +- x/auth/legacy/v040/migrate.go | 133 +++++++++ x/auth/legacy/v040/migrate_test.go | 258 ++++++++++++++++++ x/auth/legacy/{v0_40 => v040}/types.go | 3 - x/auth/legacy/v0_40/migrate.go | 24 -- x/auth/legacy/v0_40/migrate_test.go | 87 ------ x/auth/types/account.go | 9 +- x/bank/legacy/{v0_36 => v036}/types.go | 2 +- x/bank/legacy/{v0_38 => v038}/types.go | 0 x/bank/legacy/v040/migrate.go | 37 +++ x/bank/legacy/v040/migrate_test.go | 56 ++++ x/bank/legacy/v040/types.go | 5 + x/bank/legacy/v0_40/migrate.go | 22 -- x/bank/legacy/v0_40/migrate_test.go | 69 ----- x/bank/legacy/v0_40/types.go | 43 --- x/distribution/keeper/genesis.go | 10 +- .../legacy/{v0_34 => v034}/types.go | 2 +- .../legacy/{v0_36 => v036}/migrate.go | 4 +- .../legacy/{v0_36 => v036}/migrate_test.go | 4 +- .../legacy/{v0_36 => v036}/types.go | 4 +- .../legacy/{v0_38 => v038}/migrate.go | 4 +- .../legacy/{v0_38 => v038}/types.go | 6 +- x/distribution/types/genesis.pb.go | 143 +++++----- x/evidence/exported/evidence.go | 4 +- x/evidence/legacy/v038/types.go | 113 ++++++++ x/evidence/legacy/v040/migrate.go | 46 ++++ x/evidence/legacy/v040/migrate_test.go | 40 +++ x/evidence/legacy/v040/types.go | 6 + x/genaccounts/doc.go | 2 +- x/genaccounts/legacy/{v0_34 => v034}/types.go | 2 +- .../legacy/{v0_36 => v036}/migrate.go | 10 +- .../legacy/{v0_36 => v036}/migrate_test.go | 10 +- x/genaccounts/legacy/{v0_36 => v036}/types.go | 2 +- x/genutil/client/cli/migrate.go | 16 +- x/genutil/legacy/{v0_36 => v036}/migrate.go | 25 +- .../legacy/{v0_36 => v036}/migrate_test.go | 5 +- x/genutil/legacy/{v0_38 => v038}/migrate.go | 17 +- .../legacy/{v0_38 => v038}/migrate_test.go | 11 +- x/genutil/legacy/{v0_39 => v039}/migrate.go | 7 +- .../legacy/{v0_39 => v039}/migrate_test.go | 9 +- x/genutil/legacy/v040/migrate.go | 94 +++++++ x/genutil/legacy/v0_40/migrate.go | 55 ---- x/genutil/types/types.go | 4 +- x/gov/legacy/{v0_34 => v034}/types.go | 2 +- x/gov/legacy/{v0_36 => v036}/migrate.go | 4 +- x/gov/legacy/{v0_36 => v036}/types.go | 4 +- x/slashing/legacy/v039/types.go | 79 ++++++ x/slashing/legacy/v040/migrate.go | 62 +++++ x/slashing/legacy/v040/migrate_test.go | 140 ++++++++++ x/slashing/legacy/v040/types.go | 5 + x/staking/legacy/{v0_34 => v034}/types.go | 2 +- x/staking/legacy/{v0_36 => v036}/migrate.go | 4 +- x/staking/legacy/{v0_36 => v036}/types.go | 4 +- x/staking/legacy/{v0_38 => v038}/migrate.go | 4 +- x/staking/legacy/{v0_38 => v038}/types.go | 6 +- 64 files changed, 1269 insertions(+), 520 deletions(-) rename x/auth/legacy/{v0_34 => v034}/types.go (97%) rename x/auth/legacy/{v0_36 => v036}/migrate.go (81%) rename x/auth/legacy/{v0_36 => v036}/migrate_test.go (87%) rename x/auth/legacy/{v0_36 => v036}/types.go (73%) rename x/auth/legacy/{v0_38 => v038}/migrate.go (95%) rename x/auth/legacy/{v0_38 => v038}/migrate_test.go (82%) rename x/auth/legacy/{v0_38 => v038}/types.go (98%) rename x/auth/legacy/{v0_39 => v039}/migrate.go (96%) rename x/auth/legacy/{v0_39 => v039}/types.go (97%) create mode 100644 x/auth/legacy/v040/migrate.go create mode 100644 x/auth/legacy/v040/migrate_test.go rename x/auth/legacy/{v0_40 => v040}/types.go (65%) delete mode 100644 x/auth/legacy/v0_40/migrate.go delete mode 100644 x/auth/legacy/v0_40/migrate_test.go rename x/bank/legacy/{v0_36 => v036}/types.go (96%) rename x/bank/legacy/{v0_38 => v038}/types.go (100%) create mode 100644 x/bank/legacy/v040/migrate.go create mode 100644 x/bank/legacy/v040/migrate_test.go create mode 100644 x/bank/legacy/v040/types.go delete mode 100644 x/bank/legacy/v0_40/migrate.go delete mode 100644 x/bank/legacy/v0_40/migrate_test.go delete mode 100644 x/bank/legacy/v0_40/types.go rename x/distribution/legacy/{v0_34 => v034}/types.go (99%) rename x/distribution/legacy/{v0_36 => v036}/migrate.go (98%) rename x/distribution/legacy/{v0_36 => v036}/migrate_test.go (98%) rename x/distribution/legacy/{v0_36 => v036}/types.go (99%) rename x/distribution/legacy/{v0_38 => v038}/migrate.go (97%) rename x/distribution/legacy/{v0_38 => v038}/types.go (99%) create mode 100644 x/evidence/legacy/v038/types.go create mode 100644 x/evidence/legacy/v040/migrate.go create mode 100644 x/evidence/legacy/v040/migrate_test.go create mode 100644 x/evidence/legacy/v040/types.go rename x/genaccounts/legacy/{v0_34 => v034}/types.go (97%) rename x/genaccounts/legacy/{v0_36 => v036}/migrate.go (97%) rename x/genaccounts/legacy/{v0_36 => v036}/migrate_test.go (95%) rename x/genaccounts/legacy/{v0_36 => v036}/types.go (99%) rename x/genutil/legacy/{v0_36 => v036}/migrate.go (86%) rename x/genutil/legacy/{v0_36 => v036}/migrate_test.go (93%) rename x/genutil/legacy/{v0_38 => v038}/migrate.go (84%) rename x/genutil/legacy/{v0_38 => v038}/migrate_test.go (91%) rename x/genutil/legacy/{v0_39 => v039}/migrate.go (81%) rename x/genutil/legacy/{v0_39 => v039}/migrate_test.go (93%) create mode 100644 x/genutil/legacy/v040/migrate.go delete mode 100644 x/genutil/legacy/v0_40/migrate.go rename x/gov/legacy/{v0_34 => v034}/types.go (99%) rename x/gov/legacy/{v0_36 => v036}/migrate.go (95%) rename x/gov/legacy/{v0_36 => v036}/types.go (98%) create mode 100644 x/slashing/legacy/v039/types.go create mode 100644 x/slashing/legacy/v040/migrate.go create mode 100644 x/slashing/legacy/v040/migrate_test.go create mode 100644 x/slashing/legacy/v040/types.go rename x/staking/legacy/{v0_34 => v034}/types.go (99%) rename x/staking/legacy/{v0_36 => v036}/migrate.go (94%) rename x/staking/legacy/{v0_36 => v036}/types.go (98%) rename x/staking/legacy/{v0_38 => v038}/migrate.go (94%) rename x/staking/legacy/{v0_38 => v038}/types.go (97%) diff --git a/proto/cosmos/distribution/v1beta1/genesis.proto b/proto/cosmos/distribution/v1beta1/genesis.proto index 7fb6e7c541..c0b17cdf11 100644 --- a/proto/cosmos/distribution/v1beta1/genesis.proto +++ b/proto/cosmos/distribution/v1beta1/genesis.proto @@ -107,8 +107,8 @@ message ValidatorSlashEventRecord { uint64 height = 2; // period is the period of the slash event. uint64 period = 3; - // event describes the slash event. - ValidatorSlashEvent event = 4 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"event\""]; + // validator_slash_event describes the slash event. + ValidatorSlashEvent validator_slash_event = 4 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"event\""]; } // GenesisState defines the distribution module's genesis state. diff --git a/x/auth/legacy/v0_34/types.go b/x/auth/legacy/v034/types.go similarity index 97% rename from x/auth/legacy/v0_34/types.go rename to x/auth/legacy/v034/types.go index b5699838ee..c5df671017 100644 --- a/x/auth/legacy/v0_34/types.go +++ b/x/auth/legacy/v034/types.go @@ -1,6 +1,6 @@ // DONTCOVER // nolint -package v0_34 +package v034 import ( sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/auth/legacy/v0_36/migrate.go b/x/auth/legacy/v036/migrate.go similarity index 81% rename from x/auth/legacy/v0_36/migrate.go rename to x/auth/legacy/v036/migrate.go index 32003f1473..c651df6994 100644 --- a/x/auth/legacy/v0_36/migrate.go +++ b/x/auth/legacy/v036/migrate.go @@ -1,9 +1,9 @@ // DONTCOVER // nolint -package v0_36 +package v036 import ( - v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_34" + v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v034" ) // Migrate accepts exported genesis state from v0.34 and migrates it to v0.36 diff --git a/x/auth/legacy/v0_36/migrate_test.go b/x/auth/legacy/v036/migrate_test.go similarity index 87% rename from x/auth/legacy/v0_36/migrate_test.go rename to x/auth/legacy/v036/migrate_test.go index faa7238ffa..739c43223f 100644 --- a/x/auth/legacy/v0_36/migrate_test.go +++ b/x/auth/legacy/v036/migrate_test.go @@ -1,10 +1,10 @@ -package v0_36 +package v036 import ( "testing" "github.com/cosmos/cosmos-sdk/types" - v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_34" + v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v034" "github.com/stretchr/testify/require" ) diff --git a/x/auth/legacy/v0_36/types.go b/x/auth/legacy/v036/types.go similarity index 73% rename from x/auth/legacy/v0_36/types.go rename to x/auth/legacy/v036/types.go index 1b720dff2e..2490f4baa2 100644 --- a/x/auth/legacy/v0_36/types.go +++ b/x/auth/legacy/v036/types.go @@ -1,8 +1,8 @@ // DONTCOVER // nolint -package v0_36 +package v036 -import v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_34" +import v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v034" const ( ModuleName = "auth" diff --git a/x/auth/legacy/v0_38/migrate.go b/x/auth/legacy/v038/migrate.go similarity index 95% rename from x/auth/legacy/v0_38/migrate.go rename to x/auth/legacy/v038/migrate.go index f4a32b4454..46947075c8 100644 --- a/x/auth/legacy/v0_38/migrate.go +++ b/x/auth/legacy/v038/migrate.go @@ -1,8 +1,8 @@ package v038 import ( - v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_36" - v036genaccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_36" + v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v036" + v036genaccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v036" ) // Migrate accepts exported genesis state from v0.34 and migrates it to v0.38 diff --git a/x/auth/legacy/v0_38/migrate_test.go b/x/auth/legacy/v038/migrate_test.go similarity index 82% rename from x/auth/legacy/v0_38/migrate_test.go rename to x/auth/legacy/v038/migrate_test.go index 3afea8c87d..e83ccfe8e2 100644 --- a/x/auth/legacy/v0_38/migrate_test.go +++ b/x/auth/legacy/v038/migrate_test.go @@ -5,9 +5,9 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" - v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_34" - v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_36" - v036genaccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_36" + v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v034" + v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v036" + v036genaccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v036" "github.com/stretchr/testify/require" ) @@ -102,30 +102,6 @@ func TestMigrateInvalid(t *testing.T) { name string acc v036genaccounts.GenesisAccount }{ - { - "vesting account with no base coins", - v036genaccounts.GenesisAccount{ - Address: accAddressFromBech32(t, "cosmos17n9sztlhx32tfy0tg0zc2ttmkeeth50yyuv9he"), - Coins: sdk.Coins{}, - OriginalVesting: sdk.NewCoins(sdk.NewInt64Coin("stake", 10000205)), - StartTime: time.Now().Unix(), - EndTime: time.Now().Add(48 * time.Hour).Unix(), - Sequence: 5, - AccountNumber: 3, - }, - }, - { - "vesting account with base coins <= original vesting", - v036genaccounts.GenesisAccount{ - Address: accAddressFromBech32(t, "cosmos17n9sztlhx32tfy0tg0zc2ttmkeeth50yyuv9he"), - Coins: sdk.NewCoins(sdk.NewInt64Coin("stake", 10000205)), - OriginalVesting: sdk.NewCoins(sdk.NewInt64Coin("stake", 50000205)), - StartTime: time.Now().Unix(), - EndTime: time.Now().Add(48 * time.Hour).Unix(), - Sequence: 5, - AccountNumber: 3, - }, - }, { "module account with invalid name", v036genaccounts.GenesisAccount{ diff --git a/x/auth/legacy/v0_38/types.go b/x/auth/legacy/v038/types.go similarity index 98% rename from x/auth/legacy/v0_38/types.go rename to x/auth/legacy/v038/types.go index f576648279..aeb554eeea 100644 --- a/x/auth/legacy/v0_38/types.go +++ b/x/auth/legacy/v038/types.go @@ -15,7 +15,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_34" + v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v034" ) const ( @@ -223,11 +223,6 @@ func NewBaseVestingAccount( } func (bva BaseVestingAccount) Validate() error { - if (bva.Coins.IsZero() && !bva.OriginalVesting.IsZero()) || - bva.OriginalVesting.IsAnyGT(bva.Coins) { - return errors.New("vesting amount cannot be greater than total amount") - } - return bva.BaseAccount.Validate() } diff --git a/x/auth/legacy/v0_39/migrate.go b/x/auth/legacy/v039/migrate.go similarity index 96% rename from x/auth/legacy/v0_39/migrate.go rename to x/auth/legacy/v039/migrate.go index 410283dc93..c29048fca5 100644 --- a/x/auth/legacy/v0_39/migrate.go +++ b/x/auth/legacy/v039/migrate.go @@ -3,7 +3,7 @@ package v039 import ( "fmt" - v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_38" + v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v038" ) // Migrate accepts exported genesis state from v0.38 and migrates it to v0.39 diff --git a/x/auth/legacy/v0_39/types.go b/x/auth/legacy/v039/types.go similarity index 97% rename from x/auth/legacy/v0_39/types.go rename to x/auth/legacy/v039/types.go index ed5a790a5a..a75bc74a69 100644 --- a/x/auth/legacy/v0_39/types.go +++ b/x/auth/legacy/v039/types.go @@ -14,8 +14,8 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/legacy" sdk "github.com/cosmos/cosmos-sdk/types" - v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_34" - v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_38" + v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v034" + v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v038" ) const ( @@ -204,11 +204,6 @@ func (bva BaseVestingAccount) GetEndTime() int64 { } func (bva BaseVestingAccount) Validate() error { - if (bva.Coins.IsZero() && !bva.OriginalVesting.IsZero()) || - bva.OriginalVesting.IsAnyGT(bva.Coins) { - return errors.New("vesting amount cannot be greater than total amount") - } - return bva.BaseAccount.Validate() } diff --git a/x/auth/legacy/v040/migrate.go b/x/auth/legacy/v040/migrate.go new file mode 100644 index 0000000000..5e190ffeab --- /dev/null +++ b/x/auth/legacy/v040/migrate.go @@ -0,0 +1,133 @@ +package v040 + +import ( + pt "github.com/gogo/protobuf/types" + + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v039" + "github.com/cosmos/cosmos-sdk/x/auth/tx" + v040auth "github.com/cosmos/cosmos-sdk/x/auth/types" + v040vesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" +) + +// convertBaseAccount converts a 0.39 BaseAccount to a 0.40 BaseAccount. +func convertBaseAccount(old *v039auth.BaseAccount) *v040auth.BaseAccount { + // In `x/auth/legacy/v038/migrate.go`, when creating a BaseAccount, we + // explicitly set the PublicKey field to nil. This propagates until 0.40, + // and we don't know the PubKey for those accounts, so we just put an empty + // string inside the Any. + var any *codectypes.Any + var err error + if old.PubKey != nil { + any, err = tx.PubKeyToAny(old.PubKey) + } else { + s := pt.Empty{} + any, err = codectypes.NewAnyWithValue(&s) + } + if err != nil { + panic(err) + } + + return &v040auth.BaseAccount{ + Address: old.Address.String(), + PubKey: any, + AccountNumber: old.AccountNumber, + Sequence: old.Sequence, + } +} + +// convertBaseVestingAccount converts a 0.39 BaseVestingAccount to a 0.40 BaseVestingAccount. +func convertBaseVestingAccount(old *v039auth.BaseVestingAccount) *v040vesting.BaseVestingAccount { + baseAccount := convertBaseAccount(old.BaseAccount) + + return &v040vesting.BaseVestingAccount{ + BaseAccount: baseAccount, + OriginalVesting: old.OriginalVesting, + DelegatedFree: old.DelegatedFree, + DelegatedVesting: old.DelegatedVesting, + EndTime: old.EndTime, + } +} + +// Migrate accepts exported x/auth genesis state from v0.38/v0.39 and migrates +// it to v0.40 x/auth genesis state. The migration includes: +// +// - Removing coins from account encoding. +func Migrate(authGenState v039auth.GenesisState) *v040auth.GenesisState { + // Convert v0.39 accounts to v0.40 ones. + var v040Accounts = make([]v040auth.GenesisAccount, len(authGenState.Accounts)) + for i, v039Account := range authGenState.Accounts { + switch v039Account := v039Account.(type) { + case *v039auth.BaseAccount: + { + v040Accounts[i] = convertBaseAccount(v039Account) + } + case *v039auth.ModuleAccount: + { + v040Accounts[i] = &v040auth.ModuleAccount{ + BaseAccount: convertBaseAccount(v039Account.BaseAccount), + Name: v039Account.Name, + Permissions: v039Account.Permissions, + } + } + case *v039auth.BaseVestingAccount: + { + v040Accounts[i] = convertBaseVestingAccount(v039Account) + } + case *v039auth.ContinuousVestingAccount: + { + v040Accounts[i] = &v040vesting.ContinuousVestingAccount{ + BaseVestingAccount: convertBaseVestingAccount(v039Account.BaseVestingAccount), + StartTime: v039Account.StartTime, + } + } + case *v039auth.DelayedVestingAccount: + { + v040Accounts[i] = &v040vesting.DelayedVestingAccount{ + BaseVestingAccount: convertBaseVestingAccount(v039Account.BaseVestingAccount), + } + } + case *v039auth.PeriodicVestingAccount: + { + vestingPeriods := make([]v040vesting.Period, len(v039Account.VestingPeriods)) + for j, period := range v039Account.VestingPeriods { + vestingPeriods[j] = v040vesting.Period{ + Length: period.Length, + Amount: period.Amount, + } + } + v040Accounts[i] = &v040vesting.PeriodicVestingAccount{ + BaseVestingAccount: convertBaseVestingAccount(v039Account.BaseVestingAccount), + StartTime: v039Account.StartTime, + VestingPeriods: vestingPeriods, + } + } + default: + panic(sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "got invalid type %T", v039Account)) + } + + } + + // Convert v0.40 accounts into Anys. + anys := make([]*codectypes.Any, len(v040Accounts)) + for i, v040Account := range v040Accounts { + any, err := codectypes.NewAnyWithValue(v040Account) + if err != nil { + panic(err) + } + + anys[i] = any + } + + return &v040auth.GenesisState{ + Params: v040auth.Params{ + MaxMemoCharacters: authGenState.Params.MaxMemoCharacters, + TxSigLimit: authGenState.Params.TxSigLimit, + TxSizeCostPerByte: authGenState.Params.TxSizeCostPerByte, + SigVerifyCostED25519: authGenState.Params.SigVerifyCostED25519, + SigVerifyCostSecp256k1: authGenState.Params.SigVerifyCostSecp256k1, + }, + Accounts: anys, + } +} diff --git a/x/auth/legacy/v040/migrate_test.go b/x/auth/legacy/v040/migrate_test.go new file mode 100644 index 0000000000..f8994315b5 --- /dev/null +++ b/x/auth/legacy/v040/migrate_test.go @@ -0,0 +1,258 @@ +package v040_test + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + "github.com/cosmos/cosmos-sdk/simapp" + sdk "github.com/cosmos/cosmos-sdk/types" + v034 "github.com/cosmos/cosmos-sdk/x/auth/legacy/v034" + v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v038" + v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v039" + v040auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v040" +) + +func TestMigrate(t *testing.T) { + encodingConfig := simapp.MakeEncodingConfig() + clientCtx := client.Context{}. + WithInterfaceRegistry(encodingConfig.InterfaceRegistry). + WithTxConfig(encodingConfig.TxConfig). + WithLegacyAmino(encodingConfig.Amino). + WithJSONMarshaler(encodingConfig.Marshaler) + + coins := sdk.NewCoins(sdk.NewInt64Coin("stake", 50)) + + // BaseAccount + pk1 := secp256k1.GenPrivKeyFromSecret([]byte("acc1")).PubKey() + acc1 := v039auth.NewBaseAccount(sdk.AccAddress(pk1.Address()), coins, pk1, 1, 0) + + // ModuleAccount + pk2 := secp256k1.GenPrivKeyFromSecret([]byte("acc2")).PubKey() + acc2 := v039auth.NewModuleAccount( + v039auth.NewBaseAccount(sdk.AccAddress(pk2.Address()), coins, pk2, 1, 0), + "module2", + "permission2", + ) + + // BaseVestingAccount + pk3 := secp256k1.GenPrivKeyFromSecret([]byte("acc3")).PubKey() + acc3 := v039auth.NewBaseVestingAccount( + v039auth.NewBaseAccount(sdk.AccAddress(pk3.Address()), coins, pk3, 1, 0), + coins, coins, coins, + 1580309973, + ) + + // ContinuousVestingAccount + pk4 := secp256k1.GenPrivKeyFromSecret([]byte("acc4")).PubKey() + acc4 := v039auth.NewContinuousVestingAccountRaw( + v039auth.NewBaseVestingAccount(v039auth.NewBaseAccount(sdk.AccAddress(pk4.Address()), coins, pk4, 1, 0), coins, nil, nil, 3160620846), + 1580309974, + ) + + // PeriodicVestingAccount + pk5 := secp256k1.GenPrivKeyFromSecret([]byte("acc5")).PubKey() + acc5 := &v039auth.PeriodicVestingAccount{ + BaseVestingAccount: v039auth.NewBaseVestingAccount(v039auth.NewBaseAccount(sdk.AccAddress(pk5.Address()), coins, pk5, 1, 0), coins, nil, nil, 3160620846), + StartTime: 1580309975, + VestingPeriods: v039auth.Periods{v039auth.Period{Length: 32, Amount: coins}}, + } + + // DelayedVestingAccount + pk6 := secp256k1.GenPrivKeyFromSecret([]byte("acc6")).PubKey() + acc6 := &v039auth.DelayedVestingAccount{ + BaseVestingAccount: v039auth.NewBaseVestingAccount(v039auth.NewBaseAccount(sdk.AccAddress(pk6.Address()), coins, pk6, 1, 0), coins, nil, nil, 3160620846), + } + + // BaseAccount with nil pubkey (coming from older genesis). + pk7 := secp256k1.GenPrivKeyFromSecret([]byte("acc7")).PubKey() + acc7 := v039auth.NewBaseAccount(sdk.AccAddress(pk7.Address()), coins, nil, 1, 0) + + gs := v039auth.GenesisState{ + Params: v034.Params{ + MaxMemoCharacters: 10, + TxSigLimit: 20, + TxSizeCostPerByte: 30, + SigVerifyCostED25519: 40, + SigVerifyCostSecp256k1: 50, + }, + Accounts: v038auth.GenesisAccounts{acc1, acc2, acc3, acc4, acc5, acc6, acc7}, + } + + migrated := v040auth.Migrate(gs) + expected := `{ + "accounts": [ + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "1", + "address": "cosmos13syh7de9xndv9wmklccpfvc0d8dcyvay4s6z6l", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A8oWyJkohwy8XZ0Df92jFMBTtTPMvYJplYIrlEHTKPYk" + }, + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.ModuleAccount", + "base_account": { + "account_number": "1", + "address": "cosmos1v57fx2l2rt6ehujuu99u2fw05779m5e2ux4z2h", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AruDygh5HprMOpHOEato85dLgAsybMJVyxBGUa3KuWCr" + }, + "sequence": "0" + }, + "name": "module2", + "permissions": [ + "permission2" + ] + }, + { + "@type": "/cosmos.vesting.v1beta1.BaseVestingAccount", + "base_account": { + "account_number": "1", + "address": "cosmos18hnp9fjflrkeeqn4gmhjhzljusxzmjeartdckw", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A5aEFDIdQHh0OYmNXNv1sHBNURDWWgVkXC2IALcWLLwJ" + }, + "sequence": "0" + }, + "delegated_free": [ + { + "amount": "50", + "denom": "stake" + } + ], + "delegated_vesting": [ + { + "amount": "50", + "denom": "stake" + } + ], + "end_time": "1580309973", + "original_vesting": [ + { + "amount": "50", + "denom": "stake" + } + ] + }, + { + "@type": "/cosmos.vesting.v1beta1.ContinuousVestingAccount", + "base_vesting_account": { + "base_account": { + "account_number": "1", + "address": "cosmos1t9kvvejvk6hjtddx6antck39s206csqduq3ke3", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "AoXDzxwTnljemHxfnJcwrKqODBP6Q2l3K3U3UhVDzyah" + }, + "sequence": "0" + }, + "delegated_free": [], + "delegated_vesting": [], + "end_time": "3160620846", + "original_vesting": [ + { + "amount": "50", + "denom": "stake" + } + ] + }, + "start_time": "1580309974" + }, + { + "@type": "/cosmos.vesting.v1beta1.PeriodicVestingAccount", + "base_vesting_account": { + "base_account": { + "account_number": "1", + "address": "cosmos1s4ss9zquz7skvguechzlk3na635jdrecl0sgy2", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A2a4P4TQ1OKzpfu0eKnCoEtmTvoiclSx0G9higenUGws" + }, + "sequence": "0" + }, + "delegated_free": [], + "delegated_vesting": [], + "end_time": "3160620846", + "original_vesting": [ + { + "amount": "50", + "denom": "stake" + } + ] + }, + "start_time": "1580309975", + "vesting_periods": [ + { + "amount": [ + { + "amount": "50", + "denom": "stake" + } + ], + "length": "32" + } + ] + }, + { + "@type": "/cosmos.vesting.v1beta1.DelayedVestingAccount", + "base_vesting_account": { + "base_account": { + "account_number": "1", + "address": "cosmos1mcc6rwrj4hswf8p9ct82c7lmf77w9tuk07rha4", + "pub_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A4tuAfmZlhjK5cjp6ImR704miybHnITVNOyJORdDPFu3" + }, + "sequence": "0" + }, + "delegated_free": [], + "delegated_vesting": [], + "end_time": "3160620846", + "original_vesting": [ + { + "amount": "50", + "denom": "stake" + } + ] + } + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "account_number": "1", + "address": "cosmos16ydaqh0fcnh4qt7a3jme4mmztm2qel5axcpw00", + "pub_key": { + "@type": "/google.protobuf.Empty", + "value": {} + }, + "sequence": "0" + } + ], + "params": { + "max_memo_characters": "10", + "sig_verify_cost_ed25519": "40", + "sig_verify_cost_secp256k1": "50", + "tx_sig_limit": "20", + "tx_size_cost_per_byte": "30" + } +}` + + bz, err := clientCtx.JSONMarshaler.MarshalJSON(migrated) + require.NoError(t, err) + + // Indent the JSON bz correctly. + var jsonObj map[string]interface{} + err = json.Unmarshal(bz, &jsonObj) + require.NoError(t, err) + indentedBz, err := json.MarshalIndent(jsonObj, "", " ") + require.NoError(t, err) + + require.Equal(t, expected, string(indentedBz)) +} diff --git a/x/auth/legacy/v0_40/types.go b/x/auth/legacy/v040/types.go similarity index 65% rename from x/auth/legacy/v0_40/types.go rename to x/auth/legacy/v040/types.go index 9313a178b2..1e1f3eee97 100644 --- a/x/auth/legacy/v0_40/types.go +++ b/x/auth/legacy/v040/types.go @@ -1,8 +1,5 @@ package v040 -// DONTCOVER -// nolint - const ( ModuleName = "auth" ) diff --git a/x/auth/legacy/v0_40/migrate.go b/x/auth/legacy/v0_40/migrate.go deleted file mode 100644 index 1e1b7fea4e..0000000000 --- a/x/auth/legacy/v0_40/migrate.go +++ /dev/null @@ -1,24 +0,0 @@ -package v040 - -import ( - "fmt" - - v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_38" - v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_39" -) - -// Migrate accepts exported x/auth genesis state from v0.38/v0.39 and migrates -// it to v0.40 x/auth genesis state. The migration includes: -// -// - Removing coins from account encoding. -func Migrate(authGenState v039auth.GenesisState) v039auth.GenesisState { - for _, account := range authGenState.Accounts { - // set coins to nil and allow the JSON encoding to omit coins - if err := account.SetCoins(nil); err != nil { - panic(fmt.Sprintf("failed to set account coins to nil: %s", err)) - } - } - - authGenState.Accounts = v038auth.SanitizeGenesisAccounts(authGenState.Accounts) - return authGenState -} diff --git a/x/auth/legacy/v0_40/migrate_test.go b/x/auth/legacy/v0_40/migrate_test.go deleted file mode 100644 index 6aad03d340..0000000000 --- a/x/auth/legacy/v0_40/migrate_test.go +++ /dev/null @@ -1,87 +0,0 @@ -package v040_test - -import ( - "testing" - - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/codec" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_34" - v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_38" - v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_39" - v040 "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_40" -) - -func TestMigrate(t *testing.T) { - v039Codec := codec.NewLegacyAmino() - cryptocodec.RegisterCrypto(v039Codec) - v039auth.RegisterLegacyAminoCodec(v039Codec) - - coins := sdk.NewCoins(sdk.NewInt64Coin("stake", 50)) - addr1, _ := sdk.AccAddressFromBech32("cosmos1xxkueklal9vejv9unqu80w9vptyepfa95pd53u") - acc1 := v039auth.NewBaseAccount(addr1, coins, nil, 1, 0) - - addr2, _ := sdk.AccAddressFromBech32("cosmos15v50ymp6n5dn73erkqtmq0u8adpl8d3ujv2e74") - vaac := v039auth.NewContinuousVestingAccountRaw( - v039auth.NewBaseVestingAccount(v039auth.NewBaseAccount(addr2, coins, nil, 1, 0), coins, nil, nil, 3160620846), - 1580309972, - ) - - gs := v039auth.GenesisState{ - Params: v0_34.Params{ - MaxMemoCharacters: 10, - TxSigLimit: 10, - TxSizeCostPerByte: 10, - SigVerifyCostED25519: 10, - SigVerifyCostSecp256k1: 10, - }, - Accounts: v038auth.GenesisAccounts{acc1, vaac}, - } - - migrated := v040.Migrate(gs) - expected := `{ - "params": { - "max_memo_characters": "10", - "tx_sig_limit": "10", - "tx_size_cost_per_byte": "10", - "sig_verify_cost_ed25519": "10", - "sig_verify_cost_secp256k1": "10" - }, - "accounts": [ - { - "type": "cosmos-sdk/Account", - "value": { - "address": "cosmos1xxkueklal9vejv9unqu80w9vptyepfa95pd53u", - "public_key": null, - "account_number": "1", - "sequence": "0" - } - }, - { - "type": "cosmos-sdk/ContinuousVestingAccount", - "value": { - "address": "cosmos15v50ymp6n5dn73erkqtmq0u8adpl8d3ujv2e74", - "public_key": null, - "account_number": "1", - "sequence": "0", - "original_vesting": [ - { - "denom": "stake", - "amount": "50" - } - ], - "delegated_free": [], - "delegated_vesting": [], - "end_time": "3160620846", - "start_time": "1580309972" - } - } - ] -}` - - bz, err := v039Codec.MarshalJSONIndent(migrated, "", " ") - require.NoError(t, err) - require.Equal(t, expected, string(bz)) -} diff --git a/x/auth/types/account.go b/x/auth/types/account.go index 6c83b2075e..301a5af9e7 100644 --- a/x/auth/types/account.go +++ b/x/auth/types/account.go @@ -18,10 +18,11 @@ import ( ) var ( - _ AccountI = (*BaseAccount)(nil) - _ GenesisAccount = (*BaseAccount)(nil) - _ GenesisAccount = (*ModuleAccount)(nil) - _ ModuleAccountI = (*ModuleAccount)(nil) + _ AccountI = (*BaseAccount)(nil) + _ GenesisAccount = (*BaseAccount)(nil) + _ codectypes.UnpackInterfacesMessage = (*BaseAccount)(nil) + _ GenesisAccount = (*ModuleAccount)(nil) + _ ModuleAccountI = (*ModuleAccount)(nil) ) // NewBaseAccount creates a new BaseAccount object diff --git a/x/bank/legacy/v0_36/types.go b/x/bank/legacy/v036/types.go similarity index 96% rename from x/bank/legacy/v0_36/types.go rename to x/bank/legacy/v036/types.go index 7e4aa425be..1de8ffb9b7 100644 --- a/x/bank/legacy/v0_36/types.go +++ b/x/bank/legacy/v036/types.go @@ -1,6 +1,6 @@ // DONTCOVER // nolint -package v0_36 +package v036 import ( sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/bank/legacy/v0_38/types.go b/x/bank/legacy/v038/types.go similarity index 100% rename from x/bank/legacy/v0_38/types.go rename to x/bank/legacy/v038/types.go diff --git a/x/bank/legacy/v040/migrate.go b/x/bank/legacy/v040/migrate.go new file mode 100644 index 0000000000..ba61742764 --- /dev/null +++ b/x/bank/legacy/v040/migrate.go @@ -0,0 +1,37 @@ +package v040 + +import ( + v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v039" + v036supply "github.com/cosmos/cosmos-sdk/x/bank/legacy/v036" + v038bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v038" + v040bank "github.com/cosmos/cosmos-sdk/x/bank/types" +) + +// Migrate accepts exported v0.39 x/auth and v0.38 x/bank genesis state and +// migrates it to v0.40 x/bank genesis state. The migration includes: +// +// - Moving balances from x/auth to x/bank genesis state. +// - Moving supply from x/supply to x/bank genesis state. +func Migrate( + bankGenState v038bank.GenesisState, + authGenState v039auth.GenesisState, + supplyGenState v036supply.GenesisState, +) *v040bank.GenesisState { + balances := make([]v040bank.Balance, len(authGenState.Accounts)) + for i, acc := range authGenState.Accounts { + balances[i] = v040bank.Balance{ + Address: acc.GetAddress().String(), + Coins: acc.GetCoins(), + } + } + + return &v040bank.GenesisState{ + Params: v040bank.Params{ + SendEnabled: []*v040bank.SendEnabled{}, + DefaultSendEnabled: bankGenState.SendEnabled, + }, + Balances: balances, + Supply: supplyGenState.Supply, + DenomMetadata: []v040bank.Metadata{}, + } +} diff --git a/x/bank/legacy/v040/migrate_test.go b/x/bank/legacy/v040/migrate_test.go new file mode 100644 index 0000000000..99ea461ff7 --- /dev/null +++ b/x/bank/legacy/v040/migrate_test.go @@ -0,0 +1,56 @@ +package v040_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/simapp" + sdk "github.com/cosmos/cosmos-sdk/types" + v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v038" + v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v039" + v036supply "github.com/cosmos/cosmos-sdk/x/bank/legacy/v036" + v038bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v038" + v040bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v040" +) + +func TestMigrate(t *testing.T) { + encodingConfig := simapp.MakeEncodingConfig() + clientCtx := client.Context{}. + WithInterfaceRegistry(encodingConfig.InterfaceRegistry). + WithTxConfig(encodingConfig.TxConfig). + WithLegacyAmino(encodingConfig.Amino). + WithJSONMarshaler(encodingConfig.Marshaler) + + coins := sdk.NewCoins(sdk.NewInt64Coin("stake", 50)) + addr1, _ := sdk.AccAddressFromBech32("cosmos1xxkueklal9vejv9unqu80w9vptyepfa95pd53u") + acc1 := v038auth.NewBaseAccount(addr1, coins, nil, 1, 0) + + addr2, _ := sdk.AccAddressFromBech32("cosmos15v50ymp6n5dn73erkqtmq0u8adpl8d3ujv2e74") + vaac := v038auth.NewContinuousVestingAccountRaw( + v038auth.NewBaseVestingAccount( + v038auth.NewBaseAccount(addr2, coins, nil, 1, 0), coins, nil, nil, 3160620846, + ), + 1580309972, + ) + + supply := sdk.NewCoins(sdk.NewInt64Coin("stake", 1000)) + + bankGenState := v038bank.GenesisState{ + SendEnabled: true, + } + authGenState := v039auth.GenesisState{ + Accounts: v038auth.GenesisAccounts{acc1, vaac}, + } + supplyGenState := v036supply.GenesisState{ + Supply: supply, + } + + migrated := v040bank.Migrate(bankGenState, authGenState, supplyGenState) + expected := `{"params":{"send_enabled":[],"default_send_enabled":true},"balances":[{"address":"cosmos1xxkueklal9vejv9unqu80w9vptyepfa95pd53u","coins":[{"denom":"stake","amount":"50"}]},{"address":"cosmos15v50ymp6n5dn73erkqtmq0u8adpl8d3ujv2e74","coins":[{"denom":"stake","amount":"50"}]}],"supply":[{"denom":"stake","amount":"1000"}],"denom_metadata":[]}` + + bz, err := clientCtx.JSONMarshaler.MarshalJSON(migrated) + require.NoError(t, err) + require.Equal(t, expected, string(bz)) +} diff --git a/x/bank/legacy/v040/types.go b/x/bank/legacy/v040/types.go new file mode 100644 index 0000000000..04ac05f9fc --- /dev/null +++ b/x/bank/legacy/v040/types.go @@ -0,0 +1,5 @@ +package v040 + +const ( + ModuleName = "bank" +) diff --git a/x/bank/legacy/v0_40/migrate.go b/x/bank/legacy/v0_40/migrate.go deleted file mode 100644 index 66702d3c1e..0000000000 --- a/x/bank/legacy/v0_40/migrate.go +++ /dev/null @@ -1,22 +0,0 @@ -package v040 - -import ( - v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_39" - v038bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v0_38" -) - -// Migrate accepts exported v0.39 x/auth and v0.38 x/bank genesis state and -// migrates it to v0.40 x/bank genesis state. The migration includes: -// -// - Moving balances from x/auth to x/bank genesis state. -func Migrate(bankGenState v038bank.GenesisState, authGenState v039auth.GenesisState) GenesisState { - balances := make([]Balance, len(authGenState.Accounts)) - for i, acc := range authGenState.Accounts { - balances[i] = Balance{ - Address: acc.GetAddress(), - Coins: acc.GetCoins(), - } - } - - return NewGenesisState(bankGenState.SendEnabled, balances) -} diff --git a/x/bank/legacy/v0_40/migrate_test.go b/x/bank/legacy/v0_40/migrate_test.go deleted file mode 100644 index 41b79c4042..0000000000 --- a/x/bank/legacy/v0_40/migrate_test.go +++ /dev/null @@ -1,69 +0,0 @@ -package v040_test - -import ( - "testing" - - "github.com/cosmos/cosmos-sdk/codec" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_38" - v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_39" - v038bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v0_38" - v040bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v0_40" - - "github.com/stretchr/testify/require" -) - -func TestMigrate(t *testing.T) { - v040Codec := codec.NewLegacyAmino() - cryptocodec.RegisterCrypto(v040Codec) - v039auth.RegisterLegacyAminoCodec(v040Codec) - - coins := sdk.NewCoins(sdk.NewInt64Coin("stake", 50)) - addr1, _ := sdk.AccAddressFromBech32("cosmos1xxkueklal9vejv9unqu80w9vptyepfa95pd53u") - acc1 := v038auth.NewBaseAccount(addr1, coins, nil, 1, 0) - - addr2, _ := sdk.AccAddressFromBech32("cosmos15v50ymp6n5dn73erkqtmq0u8adpl8d3ujv2e74") - vaac := v038auth.NewContinuousVestingAccountRaw( - v038auth.NewBaseVestingAccount( - v038auth.NewBaseAccount(addr2, coins, nil, 1, 0), coins, nil, nil, 3160620846, - ), - 1580309972, - ) - - bankGenState := v038bank.GenesisState{ - SendEnabled: true, - } - authGenState := v039auth.GenesisState{ - Accounts: v038auth.GenesisAccounts{acc1, vaac}, - } - - migrated := v040bank.Migrate(bankGenState, authGenState) - expected := `{ - "send_enabled": true, - "balances": [ - { - "address": "cosmos1xxkueklal9vejv9unqu80w9vptyepfa95pd53u", - "coins": [ - { - "denom": "stake", - "amount": "50" - } - ] - }, - { - "address": "cosmos15v50ymp6n5dn73erkqtmq0u8adpl8d3ujv2e74", - "coins": [ - { - "denom": "stake", - "amount": "50" - } - ] - } - ] -}` - - bz, err := v040Codec.MarshalJSONIndent(migrated, "", " ") - require.NoError(t, err) - require.Equal(t, expected, string(bz)) -} diff --git a/x/bank/legacy/v0_40/types.go b/x/bank/legacy/v0_40/types.go deleted file mode 100644 index d40c4ed163..0000000000 --- a/x/bank/legacy/v0_40/types.go +++ /dev/null @@ -1,43 +0,0 @@ -package v040 - -// DONTCOVER -// nolint - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" -) - -const ( - ModuleName = "bank" -) - -var _ GenesisBalance = (*Balance)(nil) - -type ( - GenesisBalance interface { - GetAddress() sdk.AccAddress - GetCoins() sdk.Coins - } - - GenesisState struct { - SendEnabled bool `json:"send_enabled" yaml:"send_enabled"` - Balances []Balance `json:"balances" yaml:"balances"` - } - - Balance struct { - Address sdk.AccAddress `json:"address" yaml:"address"` - Coins sdk.Coins `json:"coins" yaml:"coins"` - } -) - -func NewGenesisState(sendEnabled bool, balances []Balance) GenesisState { - return GenesisState{SendEnabled: sendEnabled, Balances: balances} -} - -func (b Balance) GetAddress() sdk.AccAddress { - return b.Address -} - -func (b Balance) GetCoins() sdk.Coins { - return b.Coins -} diff --git a/x/distribution/keeper/genesis.go b/x/distribution/keeper/genesis.go index 27cc23c764..4aa25671a3 100644 --- a/x/distribution/keeper/genesis.go +++ b/x/distribution/keeper/genesis.go @@ -83,7 +83,7 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) { if err != nil { panic(err) } - k.SetValidatorSlashEvent(ctx, valAddr, evt.Height, evt.Period, evt.Event) + k.SetValidatorSlashEvent(ctx, valAddr, evt.Height, evt.Period, evt.ValidatorSlashEvent) } moduleHoldings = moduleHoldings.Add(data.FeePool.CommunityPool...) @@ -182,10 +182,10 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState { k.IterateValidatorSlashEvents(ctx, func(val sdk.ValAddress, height uint64, event types.ValidatorSlashEvent) (stop bool) { slashes = append(slashes, types.ValidatorSlashEventRecord{ - ValidatorAddress: val.String(), - Height: height, - Period: event.ValidatorPeriod, - Event: event, + ValidatorAddress: val.String(), + Height: height, + Period: event.ValidatorPeriod, + ValidatorSlashEvent: event, }) return false }, diff --git a/x/distribution/legacy/v0_34/types.go b/x/distribution/legacy/v034/types.go similarity index 99% rename from x/distribution/legacy/v0_34/types.go rename to x/distribution/legacy/v034/types.go index 84e1b4f0ad..3ef672f4af 100644 --- a/x/distribution/legacy/v0_34/types.go +++ b/x/distribution/legacy/v034/types.go @@ -1,6 +1,6 @@ // DONTCOVER // nolint -package v0_34 +package v034 import ( sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/distribution/legacy/v0_36/migrate.go b/x/distribution/legacy/v036/migrate.go similarity index 98% rename from x/distribution/legacy/v0_36/migrate.go rename to x/distribution/legacy/v036/migrate.go index e2f3c8119d..7cbe3b99cb 100644 --- a/x/distribution/legacy/v0_36/migrate.go +++ b/x/distribution/legacy/v036/migrate.go @@ -1,7 +1,7 @@ -package v0_36 +package v036 import ( - v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_34" + v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v034" ) // Migrate accepts exported genesis state from v0.34 and migrates it to v0.36 diff --git a/x/distribution/legacy/v0_36/migrate_test.go b/x/distribution/legacy/v036/migrate_test.go similarity index 98% rename from x/distribution/legacy/v0_36/migrate_test.go rename to x/distribution/legacy/v036/migrate_test.go index fcffc7fe9a..d0cd69e5e5 100644 --- a/x/distribution/legacy/v0_36/migrate_test.go +++ b/x/distribution/legacy/v036/migrate_test.go @@ -1,11 +1,11 @@ -package v0_36 +package v036 import ( "testing" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/types" - v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_34" + v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v034" "github.com/stretchr/testify/require" ) diff --git a/x/distribution/legacy/v0_36/types.go b/x/distribution/legacy/v036/types.go similarity index 99% rename from x/distribution/legacy/v0_36/types.go rename to x/distribution/legacy/v036/types.go index d1f02b6296..ed96ce7707 100644 --- a/x/distribution/legacy/v0_36/types.go +++ b/x/distribution/legacy/v036/types.go @@ -1,10 +1,10 @@ // DONTCOVER // nolint -package v0_36 +package v036 import ( sdk "github.com/cosmos/cosmos-sdk/types" - v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_34" + v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v034" ) // ---------------------------------------------------------------------------- diff --git a/x/distribution/legacy/v0_38/migrate.go b/x/distribution/legacy/v038/migrate.go similarity index 97% rename from x/distribution/legacy/v0_38/migrate.go rename to x/distribution/legacy/v038/migrate.go index fb1b1d2f8f..cd00668b1e 100644 --- a/x/distribution/legacy/v0_38/migrate.go +++ b/x/distribution/legacy/v038/migrate.go @@ -1,10 +1,10 @@ -package v0_38 +package v038 // DONTCOVER // nolint import ( - v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_36" + v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v036" ) // Migrate accepts exported genesis state from v0.36 or v0.37 and migrates it to diff --git a/x/distribution/legacy/v0_38/types.go b/x/distribution/legacy/v038/types.go similarity index 99% rename from x/distribution/legacy/v0_38/types.go rename to x/distribution/legacy/v038/types.go index 0b904372e6..af7146418d 100644 --- a/x/distribution/legacy/v0_38/types.go +++ b/x/distribution/legacy/v038/types.go @@ -1,9 +1,9 @@ -package v0_38 +package v038 import ( sdk "github.com/cosmos/cosmos-sdk/types" - v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_34" - v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_36" + v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v034" + v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v036" ) // DONTCOVER diff --git a/x/distribution/types/genesis.pb.go b/x/distribution/types/genesis.pb.go index fbeea0fd0f..b7c34c7386 100644 --- a/x/distribution/types/genesis.pb.go +++ b/x/distribution/types/genesis.pb.go @@ -5,7 +5,6 @@ package types import ( fmt "fmt" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" @@ -73,7 +72,7 @@ type ValidatorOutstandingRewardsRecord struct { // validator_address is the address of the validator. ValidatorAddress string `protobuf:"bytes,1,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` // outstanding_rewards represents the oustanding rewards of a validator. - OutstandingRewards github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,2,rep,name=outstanding_rewards,json=outstandingRewards,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"outstanding_rewards" yaml:"outstanding_rewards"` + OutstandingRewards []types.DecCoin `protobuf:"bytes,2,rep,name=outstanding_rewards,json=outstandingRewards,proto3" json:"outstanding_rewards" yaml:"outstanding_rewards"` } func (m *ValidatorOutstandingRewardsRecord) Reset() { *m = ValidatorOutstandingRewardsRecord{} } @@ -287,8 +286,8 @@ type ValidatorSlashEventRecord struct { Height uint64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` // period is the period of the slash event. Period uint64 `protobuf:"varint,3,opt,name=period,proto3" json:"period,omitempty"` - // event describes the slash event. - Event ValidatorSlashEvent `protobuf:"bytes,4,opt,name=event,proto3" json:"event" yaml:"event"` + // validator_slash_event describes the slash event. + ValidatorSlashEvent ValidatorSlashEvent `protobuf:"bytes,4,opt,name=validator_slash_event,json=validatorSlashEvent,proto3" json:"validator_slash_event" yaml:"event"` } func (m *ValidatorSlashEventRecord) Reset() { *m = ValidatorSlashEventRecord{} } @@ -397,71 +396,71 @@ func init() { } var fileDescriptor_76eed0f9489db580 = []byte{ - // 1022 bytes of a gzipped FileDescriptorProto + // 1024 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0xcd, 0x6f, 0x1b, 0x45, - 0x1c, 0xf5, 0x3a, 0x6d, 0x92, 0x8e, 0x53, 0x1a, 0x96, 0x34, 0x71, 0x9d, 0xd4, 0x9b, 0x4e, 0x8b, - 0x08, 0xaa, 0x58, 0x37, 0x01, 0x01, 0x0a, 0x02, 0x29, 0x9b, 0x52, 0xe8, 0xa9, 0x61, 0x22, 0x01, - 0x42, 0x48, 0xd6, 0x7a, 0x77, 0x6c, 0x8f, 0xb0, 0x77, 0xac, 0x99, 0xb1, 0x43, 0xfe, 0x02, 0x38, - 0x22, 0x21, 0x4e, 0xbd, 0xe4, 0x88, 0x10, 0xc7, 0xde, 0xb9, 0xf6, 0xd8, 0x23, 0x07, 0x14, 0x90, - 0x73, 0xe1, 0x9c, 0x03, 0x07, 0x0e, 0x08, 0xed, 0xcc, 0xec, 0x97, 0xbf, 0x70, 0x42, 0x72, 0x4a, - 0x3c, 0xfe, 0xed, 0x7b, 0xef, 0xf7, 0xe6, 0xf7, 0xb1, 0x06, 0xaf, 0x7b, 0x94, 0xb7, 0x29, 0xaf, - 0xf8, 0x84, 0x0b, 0x46, 0x6a, 0x5d, 0x41, 0x68, 0x50, 0xe9, 0x6d, 0xd6, 0xb0, 0x70, 0x37, 0x2b, - 0x0d, 0x1c, 0x60, 0x4e, 0xb8, 0xdd, 0x61, 0x54, 0x50, 0x73, 0x55, 0x85, 0xda, 0xe9, 0x50, 0x5b, - 0x87, 0x96, 0x96, 0x1a, 0xb4, 0x41, 0x65, 0x5c, 0x25, 0xfc, 0x4f, 0x3d, 0x52, 0x2a, 0x6b, 0xf4, - 0x9a, 0xcb, 0x71, 0x8c, 0xea, 0x51, 0x12, 0xe8, 0xef, 0xed, 0x49, 0xec, 0x19, 0x1e, 0x19, 0x0f, - 0x9f, 0x19, 0xe0, 0xe6, 0x43, 0xdc, 0xc2, 0x0d, 0x57, 0x50, 0xf6, 0x19, 0x11, 0x4d, 0x9f, 0xb9, - 0x07, 0x8f, 0x83, 0x3a, 0x35, 0x1f, 0x83, 0x97, 0xfd, 0xe8, 0x8b, 0xaa, 0xeb, 0xfb, 0x0c, 0x73, - 0x5e, 0x34, 0xd6, 0x8d, 0x8d, 0x6b, 0xce, 0xda, 0xe9, 0xb1, 0x55, 0x3c, 0x74, 0xdb, 0xad, 0x6d, - 0x38, 0x14, 0x02, 0xd1, 0x62, 0x7c, 0xb6, 0xa3, 0x8e, 0xcc, 0x47, 0x60, 0xf1, 0x40, 0x43, 0xc7, - 0x48, 0x79, 0x89, 0xb4, 0x7a, 0x7a, 0x6c, 0xad, 0x28, 0xa4, 0xc1, 0x08, 0x88, 0x6e, 0x44, 0x47, - 0x1a, 0x67, 0x7b, 0xfe, 0xdb, 0x23, 0x2b, 0xf7, 0xe7, 0x91, 0x95, 0x83, 0x4f, 0xf3, 0xe0, 0xce, - 0xa7, 0x6e, 0x8b, 0xf8, 0x21, 0xcd, 0x93, 0xae, 0xe0, 0xc2, 0x0d, 0x7c, 0x12, 0x34, 0x10, 0x3e, - 0x70, 0x99, 0xcf, 0x11, 0xf6, 0x28, 0xf3, 0xc3, 0x14, 0x7a, 0x51, 0xd0, 0xf8, 0x14, 0x86, 0x42, - 0x20, 0x5a, 0x8c, 0xcf, 0xa2, 0x14, 0x8e, 0x0c, 0xf0, 0x0a, 0x4d, 0x78, 0xaa, 0x4c, 0x11, 0x15, - 0xf3, 0xeb, 0x33, 0x1b, 0x85, 0xad, 0x35, 0x6d, 0xbb, 0x1d, 0x5e, 0x4b, 0x74, 0x83, 0xf6, 0x43, - 0xec, 0xed, 0x52, 0x12, 0x38, 0x9f, 0x3c, 0x3f, 0xb6, 0x72, 0xa7, 0xc7, 0x56, 0x49, 0xf1, 0x8d, - 0x80, 0x81, 0x3f, 0xfd, 0x6e, 0xdd, 0x6f, 0x10, 0xd1, 0xec, 0xd6, 0x6c, 0x8f, 0xb6, 0x2b, 0xfa, - 0x12, 0xd5, 0x9f, 0x37, 0xb8, 0xff, 0x55, 0x45, 0x1c, 0x76, 0x30, 0x8f, 0x10, 0x39, 0x32, 0xe9, - 0x50, 0xce, 0x29, 0x77, 0xfe, 0x32, 0xc0, 0xbd, 0xd8, 0x9d, 0x1d, 0xcf, 0xeb, 0xb6, 0xbb, 0x2d, - 0x57, 0x60, 0x7f, 0x97, 0xb6, 0xdb, 0x84, 0x73, 0x42, 0x83, 0x8b, 0x37, 0xe8, 0x10, 0x14, 0xdc, - 0x84, 0x49, 0x5e, 0x6f, 0x61, 0xeb, 0x3d, 0x7b, 0x42, 0x85, 0xdb, 0x93, 0x25, 0x3a, 0x25, 0x6d, - 0x9b, 0xa9, 0x54, 0xa4, 0xd0, 0x21, 0x4a, 0x73, 0xa5, 0x12, 0xff, 0xdb, 0x00, 0xeb, 0x31, 0xea, - 0xc7, 0x84, 0x0b, 0xca, 0x88, 0xe7, 0xb6, 0x2e, 0xad, 0x2a, 0x96, 0xc1, 0x6c, 0x07, 0x33, 0x42, - 0x55, 0xbe, 0x57, 0x90, 0xfe, 0x64, 0x12, 0x30, 0x17, 0x15, 0xc8, 0x8c, 0x34, 0xe2, 0x9d, 0xe9, - 0x8c, 0x18, 0x92, 0xec, 0x2c, 0x6b, 0x13, 0x5e, 0x52, 0xaa, 0xa2, 0x7a, 0x41, 0x11, 0x7e, 0x2a, - 0xf9, 0xdf, 0x0c, 0x70, 0x3b, 0x46, 0xda, 0xed, 0x32, 0x86, 0x03, 0x71, 0x69, 0x99, 0xd7, 0x93, - 0x0c, 0xd5, 0x55, 0xbf, 0x35, 0x5d, 0x86, 0x59, 0x5d, 0x67, 0x49, 0xef, 0x59, 0x1e, 0xac, 0xc6, - 0x93, 0x6a, 0x5f, 0xb8, 0x4c, 0x90, 0xa0, 0x11, 0x4e, 0xaa, 0x24, 0xb9, 0x8b, 0x9a, 0x57, 0x23, - 0x7d, 0xca, 0x9f, 0xcb, 0xa7, 0x2e, 0xb8, 0xce, 0xb5, 0xd6, 0x2a, 0x09, 0xea, 0x54, 0xd7, 0xc3, - 0xd6, 0x44, 0xb7, 0x46, 0xa6, 0xe9, 0xac, 0x69, 0xaf, 0x96, 0x14, 0x7d, 0x06, 0x16, 0xa2, 0x05, - 0x9e, 0x8a, 0x4d, 0xd9, 0xf6, 0x8f, 0x01, 0x6e, 0xc5, 0xee, 0xef, 0xb7, 0x5c, 0xde, 0xfc, 0xb0, - 0x27, 0x2f, 0xe0, 0x12, 0x7a, 0xa1, 0x89, 0x49, 0xa3, 0x29, 0xa2, 0x5e, 0x50, 0x9f, 0x52, 0x3d, - 0x32, 0x93, 0xe9, 0x91, 0x2f, 0xc1, 0x55, 0x1c, 0x2a, 0x29, 0x5e, 0x91, 0x8e, 0x3c, 0x98, 0xae, - 0x7e, 0x92, 0x0c, 0x9c, 0x25, 0xed, 0xc7, 0x82, 0x12, 0x29, 0xc1, 0x20, 0x52, 0xa0, 0x29, 0x03, - 0xbe, 0x29, 0x80, 0x85, 0x8f, 0xd4, 0xda, 0xdd, 0x17, 0xae, 0xc0, 0x26, 0x02, 0xb3, 0x1d, 0x97, - 0xb9, 0x6d, 0x95, 0x68, 0x61, 0xeb, 0xee, 0x44, 0xe6, 0x3d, 0x19, 0xea, 0xdc, 0xd4, 0x64, 0xd7, - 0x15, 0x99, 0x02, 0x80, 0x48, 0x23, 0x99, 0x9f, 0x83, 0xf9, 0x3a, 0xc6, 0xd5, 0x0e, 0xa5, 0x2d, - 0xdd, 0x0f, 0xf7, 0x26, 0xa2, 0x3e, 0xc2, 0x78, 0x8f, 0xd2, 0x96, 0xb3, 0xa2, 0x61, 0x6f, 0x28, - 0xd8, 0x08, 0x03, 0xa2, 0xb9, 0xba, 0x8a, 0x30, 0x7f, 0x30, 0x40, 0x31, 0x29, 0xda, 0x78, 0x49, - 0x86, 0x97, 0x1e, 0x0e, 0x97, 0x99, 0xe9, 0x8b, 0x29, 0xbd, 0xdd, 0x9d, 0xd7, 0x34, 0xb1, 0x35, - 0xd8, 0x16, 0x59, 0x06, 0x88, 0x96, 0xfd, 0x51, 0xcf, 0xcb, 0x1e, 0xe9, 0x30, 0xdc, 0x23, 0xb4, - 0xcb, 0xab, 0x1d, 0x46, 0x3b, 0x94, 0x63, 0x26, 0xaf, 0x32, 0x53, 0x39, 0x43, 0x21, 0x10, 0x2d, - 0x46, 0x67, 0x7b, 0xfa, 0xc8, 0xfc, 0x7e, 0xcc, 0x6e, 0xbd, 0x2a, 0xb3, 0xfb, 0x60, 0xba, 0xc2, - 0x18, 0xf7, 0x12, 0xe0, 0xc0, 0xff, 0xde, 0xbe, 0xa3, 0xd6, 0xa9, 0xf9, 0x8b, 0x01, 0xee, 0xa4, - 0x0a, 0x3f, 0xd9, 0x37, 0x55, 0x2f, 0xde, 0x51, 0xbc, 0x38, 0x2b, 0x35, 0xee, 0xfc, 0x8f, 0x3d, - 0xa7, 0x65, 0x3e, 0xd0, 0x32, 0x37, 0x86, 0x5a, 0x6e, 0x34, 0x33, 0x44, 0x56, 0x6f, 0x22, 0x2e, - 0x37, 0x7f, 0x36, 0xc0, 0x5a, 0x82, 0xd3, 0x8c, 0x77, 0x4b, 0x6c, 0xf0, 0x9c, 0x14, 0xff, 0xfe, - 0x39, 0x77, 0x93, 0x16, 0x7e, 0x5f, 0x0b, 0xbf, 0x3b, 0x28, 0x7c, 0x98, 0x10, 0xa2, 0x52, 0x6f, - 0x2c, 0x5c, 0xf8, 0x8a, 0x75, 0x2b, 0x79, 0xda, 0x53, 0x8b, 0x22, 0xd6, 0x3a, 0x2f, 0xb5, 0x6e, - 0x9f, 0x67, 0xcb, 0x68, 0xa1, 0x1b, 0x5a, 0xe8, 0xfa, 0xa0, 0xd0, 0x01, 0x2a, 0x88, 0x56, 0x7a, - 0xa3, 0x81, 0xcc, 0xa7, 0x99, 0x66, 0xcc, 0x4c, 0x60, 0x5e, 0xbc, 0x26, 0x15, 0xbe, 0x7b, 0xf6, - 0xc9, 0xae, 0xf5, 0x8d, 0x6d, 0xc9, 0x2c, 0x4f, 0xba, 0x25, 0xd3, 0x28, 0x3c, 0xec, 0xa3, 0xe5, - 0x24, 0x2b, 0x1e, 0x4e, 0xca, 0xaa, 0x9c, 0x86, 0xbc, 0x08, 0xa4, 0xb6, 0xb7, 0xcf, 0x3a, 0x63, - 0xb5, 0xb2, 0x57, 0xb5, 0xb2, 0xdb, 0x83, 0xce, 0xa5, 0x39, 0x20, 0x5a, 0xea, 0x0d, 0x23, 0xa4, - 0x36, 0xb8, 0xf3, 0xe4, 0xc7, 0x7e, 0xd9, 0x78, 0xde, 0x2f, 0x1b, 0x2f, 0xfa, 0x65, 0xe3, 0x8f, - 0x7e, 0xd9, 0xf8, 0xee, 0xa4, 0x9c, 0x7b, 0x71, 0x52, 0xce, 0xfd, 0x7a, 0x52, 0xce, 0x7d, 0xb1, - 0x39, 0xf1, 0xfd, 0xf7, 0xeb, 0xec, 0x2f, 0x1a, 0xf9, 0x3a, 0x5c, 0x9b, 0x95, 0xbf, 0x61, 0xde, - 0xfc, 0x37, 0x00, 0x00, 0xff, 0xff, 0x47, 0x6c, 0x1c, 0x49, 0x73, 0x0d, 0x00, 0x00, + 0x1c, 0xf5, 0x3a, 0x25, 0x49, 0x27, 0x29, 0x0d, 0xdb, 0x7c, 0xb8, 0x4e, 0xea, 0x4d, 0xa7, 0x45, + 0x04, 0x55, 0xac, 0x9b, 0x80, 0x00, 0x05, 0x81, 0x94, 0x4d, 0x29, 0xf4, 0xd4, 0x30, 0x91, 0x00, + 0x71, 0xb1, 0xd6, 0xbb, 0x63, 0x7b, 0x84, 0xbd, 0x63, 0xcd, 0x8c, 0x1d, 0xc2, 0x3f, 0x00, 0x47, + 0x24, 0xc4, 0xa9, 0x1c, 0x72, 0x44, 0x88, 0x63, 0xef, 0x5c, 0x7b, 0xec, 0x91, 0x03, 0x0a, 0x28, + 0xb9, 0x70, 0xce, 0x81, 0x03, 0x27, 0xb4, 0x33, 0xb3, 0x5f, 0xf6, 0xda, 0x38, 0xa1, 0x39, 0x25, + 0x1e, 0xff, 0xf6, 0xbd, 0xf7, 0x7b, 0xf3, 0xfb, 0x58, 0x83, 0xd7, 0x3d, 0xca, 0x3b, 0x94, 0x57, + 0x7d, 0xc2, 0x05, 0x23, 0xf5, 0x9e, 0x20, 0x34, 0xa8, 0xf6, 0x37, 0xeb, 0x58, 0xb8, 0x9b, 0xd5, + 0x26, 0x0e, 0x30, 0x27, 0xdc, 0xee, 0x32, 0x2a, 0xa8, 0xb9, 0xaa, 0x42, 0xed, 0x74, 0xa8, 0xad, + 0x43, 0xcb, 0x8b, 0x4d, 0xda, 0xa4, 0x32, 0xae, 0x1a, 0xfe, 0xa7, 0x1e, 0x29, 0x57, 0x34, 0x7a, + 0xdd, 0xe5, 0x38, 0x46, 0xf5, 0x28, 0x09, 0xf4, 0xf7, 0xf6, 0x38, 0xf6, 0x0c, 0x8f, 0x8c, 0x87, + 0x4f, 0x0d, 0xb0, 0xf4, 0x00, 0xb7, 0x71, 0xd3, 0x15, 0x94, 0x7d, 0x46, 0x44, 0xcb, 0x67, 0xee, + 0xc1, 0xa3, 0xa0, 0x41, 0xcd, 0x47, 0xe0, 0x15, 0x3f, 0xfa, 0xa2, 0xe6, 0xfa, 0x3e, 0xc3, 0x9c, + 0x97, 0x8c, 0x75, 0x63, 0xe3, 0xaa, 0xb3, 0x76, 0x76, 0x6c, 0x95, 0x0e, 0xdd, 0x4e, 0x7b, 0x1b, + 0x0e, 0x85, 0x40, 0xb4, 0x10, 0x9f, 0xed, 0xa8, 0x23, 0xf3, 0x21, 0x58, 0x38, 0xd0, 0xd0, 0x31, + 0x52, 0x51, 0x22, 0xad, 0x9e, 0x1d, 0x5b, 0x2b, 0x0a, 0x69, 0x30, 0x02, 0xa2, 0xeb, 0xd1, 0x91, + 0xc6, 0xd9, 0x9e, 0xfd, 0xf6, 0xc8, 0x2a, 0xfc, 0x75, 0x64, 0x15, 0xe0, 0x93, 0x22, 0xb8, 0xfd, + 0xa9, 0xdb, 0x26, 0x7e, 0x48, 0xf3, 0xb8, 0x27, 0xb8, 0x70, 0x03, 0x9f, 0x04, 0x4d, 0x84, 0x0f, + 0x5c, 0xe6, 0x73, 0x84, 0x3d, 0xca, 0xfc, 0x30, 0x85, 0x7e, 0x14, 0x34, 0x3a, 0x85, 0xa1, 0x10, + 0x88, 0x16, 0xe2, 0xb3, 0x28, 0x85, 0x23, 0x03, 0xdc, 0xa0, 0x09, 0x4f, 0x8d, 0x29, 0xa2, 0x52, + 0x71, 0x7d, 0x6a, 0x63, 0x6e, 0x6b, 0x4d, 0xdb, 0x6e, 0x87, 0xd7, 0x12, 0xdd, 0xa0, 0xfd, 0x00, + 0x7b, 0xbb, 0x94, 0x04, 0xce, 0x27, 0xcf, 0x8e, 0xad, 0xc2, 0xd9, 0xb1, 0x55, 0x56, 0x7c, 0x39, + 0x30, 0xf0, 0xe7, 0x3f, 0xac, 0x7b, 0x4d, 0x22, 0x5a, 0xbd, 0xba, 0xed, 0xd1, 0x4e, 0x55, 0x5f, + 0xa2, 0xfa, 0xf3, 0x06, 0xf7, 0xbf, 0xac, 0x8a, 0xc3, 0x2e, 0xe6, 0x11, 0x22, 0x47, 0x26, 0x1d, + 0xca, 0x39, 0xe5, 0xce, 0xdf, 0x06, 0xb8, 0x1b, 0xbb, 0xb3, 0xe3, 0x79, 0xbd, 0x4e, 0xaf, 0xed, + 0x0a, 0xec, 0xef, 0xd2, 0x4e, 0x87, 0x70, 0x4e, 0x68, 0xf0, 0xe2, 0x0d, 0x3a, 0x04, 0x73, 0x6e, + 0xc2, 0x24, 0xaf, 0x77, 0x6e, 0xeb, 0x3d, 0x7b, 0x4c, 0x85, 0xdb, 0xe3, 0x25, 0x3a, 0x65, 0x6d, + 0x9b, 0xa9, 0x54, 0xa4, 0xd0, 0x21, 0x4a, 0x73, 0xa5, 0x12, 0xff, 0xc7, 0x00, 0xeb, 0x31, 0xea, + 0xc7, 0x84, 0x0b, 0xca, 0x88, 0xe7, 0xb6, 0x2f, 0xad, 0x2a, 0x96, 0xc1, 0x74, 0x17, 0x33, 0x42, + 0x55, 0xbe, 0x57, 0x90, 0xfe, 0x64, 0x12, 0x30, 0x13, 0x15, 0xc8, 0x94, 0x34, 0xe2, 0x9d, 0xc9, + 0x8c, 0x18, 0x92, 0xec, 0x2c, 0x6b, 0x13, 0x5e, 0x56, 0xaa, 0xa2, 0x7a, 0x41, 0x11, 0x7e, 0x2a, + 0xf9, 0xdf, 0x0d, 0x70, 0x2b, 0x46, 0xda, 0xed, 0x31, 0x86, 0x03, 0x71, 0x69, 0x99, 0x37, 0x92, + 0x0c, 0xd5, 0x55, 0xbf, 0x35, 0x59, 0x86, 0x59, 0x5d, 0xe7, 0x49, 0xef, 0x69, 0x11, 0xac, 0xc6, + 0x93, 0x6a, 0x5f, 0xb8, 0x4c, 0x90, 0xa0, 0x19, 0x4e, 0xaa, 0x24, 0xb9, 0x17, 0x35, 0xaf, 0x72, + 0x7d, 0x2a, 0x5e, 0xc8, 0xa7, 0x1e, 0xb8, 0xc6, 0xb5, 0xd6, 0x1a, 0x09, 0x1a, 0x54, 0xd7, 0xc3, + 0xd6, 0x58, 0xb7, 0x72, 0xd3, 0x74, 0xd6, 0xb4, 0x57, 0x8b, 0x8a, 0x3e, 0x03, 0x0b, 0xd1, 0x3c, + 0x4f, 0xc5, 0xa6, 0x6c, 0xfb, 0xb1, 0x08, 0x6e, 0xc6, 0xee, 0xef, 0xb7, 0x5d, 0xde, 0xfa, 0xb0, + 0x2f, 0x2f, 0xe0, 0x12, 0x7a, 0xa1, 0x85, 0x49, 0xb3, 0x25, 0xa2, 0x5e, 0x50, 0x9f, 0x52, 0x3d, + 0x32, 0x95, 0xe9, 0x91, 0xaf, 0xc1, 0x52, 0x82, 0xcb, 0x43, 0x61, 0x35, 0x1c, 0x2a, 0x2b, 0x5d, + 0x91, 0x0e, 0xdd, 0x9f, 0xac, 0x9e, 0x92, 0x8c, 0x9c, 0x45, 0xed, 0xcf, 0xbc, 0x12, 0x2d, 0xc1, + 0x20, 0xba, 0xd1, 0x1f, 0x0e, 0x4d, 0xd9, 0xf3, 0xcd, 0x1c, 0x98, 0xff, 0x48, 0x2d, 0xe5, 0x7d, + 0xe1, 0x0a, 0x6c, 0x22, 0x30, 0xdd, 0x75, 0x99, 0xdb, 0x51, 0x36, 0xcc, 0x6d, 0xdd, 0x19, 0xab, + 0x63, 0x4f, 0x86, 0x3a, 0x4b, 0x9a, 0xfa, 0x9a, 0xa2, 0x56, 0x00, 0x10, 0x69, 0x24, 0xf3, 0x73, + 0x30, 0xdb, 0xc0, 0xb8, 0xd6, 0xa5, 0xb4, 0xad, 0xbb, 0xe5, 0xee, 0x58, 0xd4, 0x87, 0x18, 0xef, + 0x51, 0xda, 0x76, 0x56, 0x34, 0xec, 0x75, 0x05, 0x1b, 0x61, 0x40, 0x34, 0xd3, 0x50, 0x11, 0xe6, + 0x0f, 0x06, 0x28, 0x25, 0x25, 0x1d, 0xaf, 0xd0, 0xb0, 0x24, 0xc2, 0xd1, 0x33, 0x35, 0x79, 0xa9, + 0xa5, 0x77, 0xbf, 0xf3, 0x9a, 0x26, 0xb6, 0x06, 0x9b, 0x26, 0xcb, 0x00, 0xd1, 0xb2, 0x9f, 0xf7, + 0xbc, 0xec, 0xa0, 0x2e, 0xc3, 0x7d, 0x42, 0x7b, 0xbc, 0xd6, 0x65, 0xb4, 0x4b, 0x39, 0x66, 0xf2, + 0x62, 0x33, 0x75, 0x35, 0x14, 0x02, 0xd1, 0x42, 0x74, 0xb6, 0xa7, 0x8f, 0xcc, 0xef, 0x47, 0x6c, + 0xde, 0x97, 0x64, 0x76, 0x1f, 0x4c, 0x56, 0x26, 0xa3, 0x5e, 0x11, 0x1c, 0xf8, 0xdf, 0xbb, 0x39, + 0x6f, 0xd9, 0x9a, 0xbf, 0x1a, 0xe0, 0x76, 0xaa, 0x2d, 0x92, 0x6d, 0x54, 0xf3, 0xe2, 0x0d, 0xc6, + 0x4b, 0xd3, 0x52, 0xe3, 0xce, 0xff, 0xd8, 0x82, 0x5a, 0xe6, 0x7d, 0x2d, 0x73, 0x63, 0xa8, 0x21, + 0xf3, 0x99, 0x21, 0xb2, 0xfa, 0x63, 0x71, 0xb9, 0xf9, 0x8b, 0x01, 0xd6, 0x12, 0x9c, 0x56, 0xbc, + 0x79, 0x62, 0x83, 0x67, 0xa4, 0xf8, 0xf7, 0x2f, 0xb8, 0xb9, 0xb4, 0xf0, 0x7b, 0x5a, 0xf8, 0x9d, + 0x41, 0xe1, 0xc3, 0x84, 0x10, 0x95, 0xfb, 0x23, 0xe1, 0xc2, 0x17, 0xb0, 0x9b, 0xc9, 0xd3, 0x9e, + 0x5a, 0x23, 0xb1, 0xd6, 0x59, 0xa9, 0x75, 0xfb, 0x22, 0x3b, 0x48, 0x0b, 0xdd, 0xd0, 0x42, 0xd7, + 0x07, 0x85, 0x0e, 0x50, 0x41, 0xb4, 0xd2, 0xcf, 0x07, 0x32, 0x9f, 0x64, 0x9a, 0x31, 0x33, 0x9f, + 0x79, 0xe9, 0xaa, 0x54, 0xf8, 0xee, 0xf9, 0xe7, 0xbe, 0xd6, 0x37, 0xb2, 0x25, 0xb3, 0x3c, 0xe9, + 0x96, 0x4c, 0xa3, 0xf0, 0xb0, 0x8f, 0x96, 0x73, 0x07, 0x2e, 0x2f, 0x01, 0xa9, 0xed, 0xed, 0xf3, + 0x4e, 0x5c, 0xad, 0xec, 0x55, 0xad, 0xec, 0xd6, 0xa0, 0x73, 0x69, 0x0e, 0x88, 0x16, 0x73, 0x06, + 0x71, 0x6a, 0xbf, 0x3b, 0x8f, 0x7f, 0x3a, 0xa9, 0x18, 0xcf, 0x4e, 0x2a, 0xc6, 0xf3, 0x93, 0x8a, + 0xf1, 0xe7, 0x49, 0xc5, 0xf8, 0xee, 0xb4, 0x52, 0x78, 0x7e, 0x5a, 0x29, 0xfc, 0x76, 0x5a, 0x29, + 0x7c, 0xb1, 0x39, 0xf6, 0xed, 0xf8, 0xab, 0xec, 0xef, 0x1d, 0xf9, 0xb2, 0x5c, 0x9f, 0x96, 0xbf, + 0x70, 0xde, 0xfc, 0x37, 0x00, 0x00, 0xff, 0xff, 0xa8, 0xee, 0xfe, 0x4a, 0x91, 0x0d, 0x00, 0x00, } func (m *DelegatorWithdrawInfo) Marshal() (dAtA []byte, err error) { @@ -738,7 +737,7 @@ func (m *ValidatorSlashEventRecord) MarshalToSizedBuffer(dAtA []byte) (int, erro var l int _ = l { - size, err := m.Event.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ValidatorSlashEvent.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1045,7 +1044,7 @@ func (m *ValidatorSlashEventRecord) Size() (n int) { if m.Period != 0 { n += 1 + sovGenesis(uint64(m.Period)) } - l = m.Event.Size() + l = m.ValidatorSlashEvent.Size() n += 1 + l + sovGenesis(uint64(l)) return n } @@ -1975,7 +1974,7 @@ func (m *ValidatorSlashEventRecord) Unmarshal(dAtA []byte) error { } case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Event", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSlashEvent", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -2002,7 +2001,7 @@ func (m *ValidatorSlashEventRecord) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Event.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ValidatorSlashEvent.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/evidence/exported/evidence.go b/x/evidence/exported/evidence.go index 121529a7c9..0bba5fc487 100644 --- a/x/evidence/exported/evidence.go +++ b/x/evidence/exported/evidence.go @@ -1,9 +1,9 @@ package exported import ( - sdk "github.com/cosmos/cosmos-sdk/types" - tmbytes "github.com/tendermint/tendermint/libs/bytes" + + sdk "github.com/cosmos/cosmos-sdk/types" ) // Evidence defines the contract which concrete evidence types of misbehavior diff --git a/x/evidence/legacy/v038/types.go b/x/evidence/legacy/v038/types.go new file mode 100644 index 0000000000..f438e2bec5 --- /dev/null +++ b/x/evidence/legacy/v038/types.go @@ -0,0 +1,113 @@ +package v038 + +import ( + "fmt" + "time" + + "github.com/tendermint/tendermint/crypto/tmhash" + tmbytes "github.com/tendermint/tendermint/libs/bytes" + "gopkg.in/yaml.v2" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// Default parameter values +const ( + ModuleName = "evidence" + DefaultParamspace = ModuleName + DefaultMaxEvidenceAge = 60 * 2 * time.Second +) + +// Evidence type constants +const ( + RouteEquivocation = "equivocation" + TypeEquivocation = "equivocation" +) + +var ( + amino = codec.NewLegacyAmino() + + // ModuleCdc references the global x/evidence module codec. Note, the codec should + // ONLY be used in certain instances of tests and for JSON encoding as Amino is + // still used for that purpose. + // + // The actual codec used for serialization should be provided to x/evidence and + // defined at the application level. + ModuleCdc = codec.NewAminoCodec(amino) +) + +// Evidence defines the contract which concrete evidence types of misbehavior +// must implement. +type Evidence interface { + Route() string + Type() string + String() string + Hash() tmbytes.HexBytes + ValidateBasic() error + + // Height at which the infraction occurred + GetHeight() int64 +} + +// Params defines the total set of parameters for the evidence module +type Params struct { + MaxEvidenceAge time.Duration `json:"max_evidence_age" yaml:"max_evidence_age"` +} + +// GenesisState defines the evidence module's genesis state. +type GenesisState struct { + Params Params `json:"params" yaml:"params"` + Evidence []Evidence `json:"evidence" yaml:"evidence"` +} + +// Assert interface implementation. +var _ Evidence = Equivocation{} + +// Equivocation implements the Evidence interface and defines evidence of double +// signing misbehavior. +type Equivocation struct { + Height int64 `json:"height" yaml:"height"` + Time time.Time `json:"time" yaml:"time"` + Power int64 `json:"power" yaml:"power"` + ConsensusAddress sdk.ConsAddress `json:"consensus_address" yaml:"consensus_address"` +} + +// Route returns the Evidence Handler route for an Equivocation type. +func (e Equivocation) Route() string { return RouteEquivocation } + +// Type returns the Evidence Handler type for an Equivocation type. +func (e Equivocation) Type() string { return TypeEquivocation } + +func (e Equivocation) String() string { + bz, _ := yaml.Marshal(e) + return string(bz) +} + +// Hash returns the hash of an Equivocation object. +func (e Equivocation) Hash() tmbytes.HexBytes { + return tmhash.Sum(ModuleCdc.LegacyAmino.MustMarshalBinaryBare(e)) +} + +// ValidateBasic performs basic stateless validation checks on an Equivocation object. +func (e Equivocation) ValidateBasic() error { + if e.Time.IsZero() { + return fmt.Errorf("invalid equivocation time: %s", e.Time) + } + if e.Height < 1 { + return fmt.Errorf("invalid equivocation height: %d", e.Height) + } + if e.Power < 1 { + return fmt.Errorf("invalid equivocation validator power: %d", e.Power) + } + if e.ConsensusAddress.Empty() { + return fmt.Errorf("invalid equivocation validator consensus address: %s", e.ConsensusAddress) + } + + return nil +} + +// GetHeight returns the height at time of the Equivocation infraction. +func (e Equivocation) GetHeight() int64 { + return e.Height +} diff --git a/x/evidence/legacy/v040/migrate.go b/x/evidence/legacy/v040/migrate.go new file mode 100644 index 0000000000..7785cd12e7 --- /dev/null +++ b/x/evidence/legacy/v040/migrate.go @@ -0,0 +1,46 @@ +package v040 + +import ( + "github.com/cosmos/cosmos-sdk/client" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + v038evidence "github.com/cosmos/cosmos-sdk/x/evidence/legacy/v038" + v040evidence "github.com/cosmos/cosmos-sdk/x/evidence/types" +) + +// Migrate accepts exported v0.38 x/evidence genesis state and migrates it to +// v0.40 x/evidence genesis state. The migration includes: +// +// - Removing the `Params` field. +// - Converting Equivocations into Anys. +func Migrate(evidenceState v038evidence.GenesisState, _ client.Context) *v040evidence.GenesisState { + var newEquivocations = make([]v040evidence.Equivocation, len(evidenceState.Evidence)) + for i, evidence := range evidenceState.Evidence { + equivocation, ok := evidence.(v038evidence.Equivocation) + if !ok { + // There's only equivocation in 0.38. + continue + } + + newEquivocations[i] = v040evidence.Equivocation{ + Height: equivocation.Height, + Time: equivocation.Time, + Power: equivocation.Power, + ConsensusAddress: equivocation.ConsensusAddress.String(), + } + } + + // Then convert the equivocations into Any. + newEvidence := make([]*codectypes.Any, len(newEquivocations)) + for i := range newEquivocations { + any, err := codectypes.NewAnyWithValue(&newEquivocations[i]) + if err != nil { + panic(err) + } + + newEvidence[i] = any + } + + return &v040evidence.GenesisState{ + Evidence: newEvidence, + } +} diff --git a/x/evidence/legacy/v040/migrate_test.go b/x/evidence/legacy/v040/migrate_test.go new file mode 100644 index 0000000000..dcbe77e487 --- /dev/null +++ b/x/evidence/legacy/v040/migrate_test.go @@ -0,0 +1,40 @@ +package v040_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/simapp" + sdk "github.com/cosmos/cosmos-sdk/types" + v038evidence "github.com/cosmos/cosmos-sdk/x/evidence/legacy/v038" + v040evidence "github.com/cosmos/cosmos-sdk/x/evidence/legacy/v040" +) + +func TestMigrate(t *testing.T) { + encodingConfig := simapp.MakeEncodingConfig() + clientCtx := client.Context{}. + WithInterfaceRegistry(encodingConfig.InterfaceRegistry). + WithTxConfig(encodingConfig.TxConfig). + WithLegacyAmino(encodingConfig.Amino). + WithJSONMarshaler(encodingConfig.Marshaler) + + addr1, _ := sdk.AccAddressFromBech32("cosmos1xxkueklal9vejv9unqu80w9vptyepfa95pd53u") + + evidenceGenState := v038evidence.GenesisState{ + Params: v038evidence.Params{MaxEvidenceAge: v038evidence.DefaultMaxEvidenceAge}, + Evidence: []v038evidence.Evidence{v038evidence.Equivocation{ + Height: 20, + Power: 100, + ConsensusAddress: addr1.Bytes(), + }}, + } + + migrated := v040evidence.Migrate(evidenceGenState, clientCtx) + expected := `{"evidence":[{"@type":"/cosmos.evidence.v1beta1.Equivocation","height":"20","time":"0001-01-01T00:00:00Z","power":"100","consensus_address":"cosmosvalcons1xxkueklal9vejv9unqu80w9vptyepfa99x2a3w"}]}` + + bz, err := clientCtx.JSONMarshaler.MarshalJSON(migrated) + require.NoError(t, err) + require.Equal(t, expected, string(bz)) +} diff --git a/x/evidence/legacy/v040/types.go b/x/evidence/legacy/v040/types.go new file mode 100644 index 0000000000..41556b96b8 --- /dev/null +++ b/x/evidence/legacy/v040/types.go @@ -0,0 +1,6 @@ +package v040 + +// Default parameter values +const ( + ModuleName = "evidence" +) diff --git a/x/genaccounts/doc.go b/x/genaccounts/doc.go index ac2f1a8c1a..2d255ad465 100644 --- a/x/genaccounts/doc.go +++ b/x/genaccounts/doc.go @@ -6,7 +6,7 @@ The ADR can be found here: https://github.com/cosmos/cosmos-sdk/blob/master/docs Genesis accounts that existed in the genesis application state under `app_state.accounts` now exists under the x/auth module's genesis state under the `app_state.auth.accounts` key. -Migration can be performed via x/auth/legacy/v0_38/migrate.go. In addition, because genesis +Migration can be performed via x/auth/legacy/v038/migrate.go. In addition, because genesis accounts are now generalized via an interface, it is now up to the application to define the concrete types and the respective client logic to add them to a genesis state/file. For an example implementation of the `add-genesis-account` command please diff --git a/x/genaccounts/legacy/v0_34/types.go b/x/genaccounts/legacy/v034/types.go similarity index 97% rename from x/genaccounts/legacy/v0_34/types.go rename to x/genaccounts/legacy/v034/types.go index ee1bd419ab..080b534d8e 100644 --- a/x/genaccounts/legacy/v0_34/types.go +++ b/x/genaccounts/legacy/v034/types.go @@ -1,6 +1,6 @@ // DONTCOVER // nolint -package v0_34 +package v034 import ( sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/genaccounts/legacy/v0_36/migrate.go b/x/genaccounts/legacy/v036/migrate.go similarity index 97% rename from x/genaccounts/legacy/v0_36/migrate.go rename to x/genaccounts/legacy/v036/migrate.go index 7fea5fed3f..8dff3e4547 100644 --- a/x/genaccounts/legacy/v0_36/migrate.go +++ b/x/genaccounts/legacy/v036/migrate.go @@ -1,15 +1,15 @@ // DONTCOVER // nolint -package v0_36 +package v036 import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" - v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_34" - v034accounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_34" - v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v0_34" - v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_34" + v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v034" + v034accounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v034" + v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v034" + v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v034" "github.com/tendermint/tendermint/crypto" ) diff --git a/x/genaccounts/legacy/v0_36/migrate_test.go b/x/genaccounts/legacy/v036/migrate_test.go similarity index 95% rename from x/genaccounts/legacy/v0_36/migrate_test.go rename to x/genaccounts/legacy/v036/migrate_test.go index 7fbd9f66a4..09f6bb3e69 100644 --- a/x/genaccounts/legacy/v0_36/migrate_test.go +++ b/x/genaccounts/legacy/v036/migrate_test.go @@ -1,4 +1,4 @@ -package v0_36 +package v036 import ( "testing" @@ -7,10 +7,10 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/types" - v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_34" - v034accounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_34" - v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v0_34" - v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_34" + v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v034" + v034accounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v034" + v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v034" + v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v034" "github.com/stretchr/testify/require" ) diff --git a/x/genaccounts/legacy/v0_36/types.go b/x/genaccounts/legacy/v036/types.go similarity index 99% rename from x/genaccounts/legacy/v0_36/types.go rename to x/genaccounts/legacy/v036/types.go index 54596f0a63..8d143e69d2 100644 --- a/x/genaccounts/legacy/v0_36/types.go +++ b/x/genaccounts/legacy/v036/types.go @@ -1,6 +1,6 @@ // DONTCOVER // nolint -package v0_36 +package v036 import ( sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/genutil/client/cli/migrate.go b/x/genutil/client/cli/migrate.go index 151beef124..ab1e65f04a 100644 --- a/x/genutil/client/cli/migrate.go +++ b/x/genutil/client/cli/migrate.go @@ -8,15 +8,17 @@ import ( "github.com/pkg/errors" "github.com/spf13/cobra" + tmjson "github.com/tendermint/tendermint/libs/json" tmtypes "github.com/tendermint/tendermint/types" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" - v036 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v0_36" - v038 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v0_38" - v039 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v0_39" - v040 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v0_40" + v036 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v036" + v038 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v038" + v039 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v039" + v040 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v040" "github.com/cosmos/cosmos-sdk/x/genutil/types" ) @@ -65,6 +67,8 @@ $ %s migrate v0.36 /path/to/genesis.json --chain-id=cosmoshub-3 --genesis-time=2 `, version.AppName), Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + var err error target := args[0] @@ -86,7 +90,7 @@ $ %s migrate v0.36 /path/to/genesis.json --chain-id=cosmoshub-3 --genesis-time=2 } // TODO: handler error from migrationFunc call - newGenState := migrationFunc(initialState) + newGenState := migrationFunc(initialState, clientCtx) genDoc.AppState, err = json.Marshal(newGenState) if err != nil { @@ -110,7 +114,7 @@ $ %s migrate v0.36 /path/to/genesis.json --chain-id=cosmoshub-3 --genesis-time=2 genDoc.ChainID = chainID } - bz, err := json.MarshalIndent(genDoc, "", " ") + bz, err := tmjson.Marshal(genDoc) if err != nil { return errors.Wrap(err, "failed to marshal genesis doc") } diff --git a/x/genutil/legacy/v0_36/migrate.go b/x/genutil/legacy/v036/migrate.go similarity index 86% rename from x/genutil/legacy/v0_36/migrate.go rename to x/genutil/legacy/v036/migrate.go index 2be7806ef6..ea576c41e7 100644 --- a/x/genutil/legacy/v0_36/migrate.go +++ b/x/genutil/legacy/v036/migrate.go @@ -1,24 +1,25 @@ package v036 import ( + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_34" - v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_36" - v036bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v0_36" - v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_34" - v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_36" - v034genAccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_34" - v036genAccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_36" + v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v034" + v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v036" + v036bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v036" + v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v034" + v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v036" + v034genAccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v034" + v036genAccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v036" "github.com/cosmos/cosmos-sdk/x/genutil/types" - v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v0_34" - v036gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v0_36" - v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_34" - v036staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_36" + v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v034" + v036gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v036" + v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v034" + v036staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v036" ) // Migrate migrates exported state from v0.34 to a v0.36 genesis state. -func Migrate(appState types.AppMap) types.AppMap { +func Migrate(appState types.AppMap, _ client.Context) types.AppMap { v034Codec := codec.NewLegacyAmino() cryptocodec.RegisterCrypto(v034Codec) v034gov.RegisterLegacyAminoCodec(v034Codec) diff --git a/x/genutil/legacy/v0_36/migrate_test.go b/x/genutil/legacy/v036/migrate_test.go similarity index 93% rename from x/genutil/legacy/v0_36/migrate_test.go rename to x/genutil/legacy/v036/migrate_test.go index 47553ce162..bdd6c4f0ff 100644 --- a/x/genutil/legacy/v0_36/migrate_test.go +++ b/x/genutil/legacy/v036/migrate_test.go @@ -5,6 +5,7 @@ import ( "github.com/stretchr/testify/require" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/x/genutil/types" ) @@ -90,7 +91,7 @@ func TestDummyGenesis(t *testing.T) { "foo": {}, "bar": []byte(`{"custom": "module"}`), } - migratedDummy := Migrate(genesisDummy) + migratedDummy := Migrate(genesisDummy, client.Context{}) // We should not touch custom modules in the map require.Equal(t, genesisDummy["foo"], migratedDummy["foo"]) @@ -102,5 +103,5 @@ func TestGovGenesis(t *testing.T) { "gov": basic034Gov, } - require.NotPanics(t, func() { Migrate(genesis) }) + require.NotPanics(t, func() { Migrate(genesis, client.Context{}) }) } diff --git a/x/genutil/legacy/v0_38/migrate.go b/x/genutil/legacy/v038/migrate.go similarity index 84% rename from x/genutil/legacy/v0_38/migrate.go rename to x/genutil/legacy/v038/migrate.go index b0cf85229b..267dccda02 100644 --- a/x/genutil/legacy/v0_38/migrate.go +++ b/x/genutil/legacy/v038/migrate.go @@ -1,20 +1,21 @@ package v038 import ( + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_36" - v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_38" - v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_36" - v038distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_38" - v036genaccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_36" + v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v036" + v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v038" + v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v036" + v038distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v038" + v036genaccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v036" "github.com/cosmos/cosmos-sdk/x/genutil/types" - v036staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_36" - v038staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_38" + v036staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v036" + v038staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v038" ) // Migrate migrates exported state from v0.36/v0.37 to a v0.38 genesis state. -func Migrate(appState types.AppMap) types.AppMap { +func Migrate(appState types.AppMap, _ client.Context) types.AppMap { v036Codec := codec.NewLegacyAmino() cryptocodec.RegisterCrypto(v036Codec) diff --git a/x/genutil/legacy/v0_38/migrate_test.go b/x/genutil/legacy/v038/migrate_test.go similarity index 91% rename from x/genutil/legacy/v0_38/migrate_test.go rename to x/genutil/legacy/v038/migrate_test.go index d0c5e8293c..bbc8b476ed 100644 --- a/x/genutil/legacy/v0_38/migrate_test.go +++ b/x/genutil/legacy/v038/migrate_test.go @@ -3,11 +3,12 @@ package v038_test import ( "testing" - v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_36" - v036genaccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_36" - v038 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v0_38" + "github.com/cosmos/cosmos-sdk/client" + v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v036" + v036genaccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v036" + v038 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v038" "github.com/cosmos/cosmos-sdk/x/genutil/types" - v036staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_36" + v036staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v036" "github.com/stretchr/testify/require" ) @@ -138,5 +139,5 @@ func TestMigrate(t *testing.T) { v036staking.ModuleName: genStakingState, } - require.NotPanics(t, func() { v038.Migrate(genesis) }) + require.NotPanics(t, func() { v038.Migrate(genesis, client.Context{}) }) } diff --git a/x/genutil/legacy/v0_39/migrate.go b/x/genutil/legacy/v039/migrate.go similarity index 81% rename from x/genutil/legacy/v0_39/migrate.go rename to x/genutil/legacy/v039/migrate.go index d7be5583d0..3b427fd883 100644 --- a/x/genutil/legacy/v0_39/migrate.go +++ b/x/genutil/legacy/v039/migrate.go @@ -1,10 +1,11 @@ package v039 import ( + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_38" - v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_39" + v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v038" + v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v039" "github.com/cosmos/cosmos-sdk/x/genutil/types" ) @@ -12,7 +13,7 @@ import ( // // NOTE: No actual migration occurs since the types do not change, but JSON // serialization of accounts do change. -func Migrate(appState types.AppMap) types.AppMap { +func Migrate(appState types.AppMap, _ client.Context) types.AppMap { v038Codec := codec.NewLegacyAmino() cryptocodec.RegisterCrypto(v038Codec) v038auth.RegisterLegacyAminoCodec(v038Codec) diff --git a/x/genutil/legacy/v0_39/migrate_test.go b/x/genutil/legacy/v039/migrate_test.go similarity index 93% rename from x/genutil/legacy/v0_39/migrate_test.go rename to x/genutil/legacy/v039/migrate_test.go index c50434aead..65a7ec3df7 100644 --- a/x/genutil/legacy/v0_39/migrate_test.go +++ b/x/genutil/legacy/v039/migrate_test.go @@ -5,9 +5,10 @@ import ( "github.com/stretchr/testify/require" - v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_38" - v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_39" - v039 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v0_39" + "github.com/cosmos/cosmos-sdk/client" + v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v038" + v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v039" + v039 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v039" "github.com/cosmos/cosmos-sdk/x/genutil/types" ) @@ -115,6 +116,6 @@ func TestMigrate(t *testing.T) { } var migrated types.AppMap - require.NotPanics(t, func() { migrated = v039.Migrate(genesis) }) + require.NotPanics(t, func() { migrated = v039.Migrate(genesis, client.Context{}) }) require.Equal(t, string(expectedGenAuthState), string(migrated[v039auth.ModuleName])) } diff --git a/x/genutil/legacy/v040/migrate.go b/x/genutil/legacy/v040/migrate.go new file mode 100644 index 0000000000..121c24b0c1 --- /dev/null +++ b/x/genutil/legacy/v040/migrate.go @@ -0,0 +1,94 @@ +package v040 + +import ( + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v039" + v040auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v040" + v036supply "github.com/cosmos/cosmos-sdk/x/bank/legacy/v036" + v038bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v038" + v040bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v040" + v038evidence "github.com/cosmos/cosmos-sdk/x/evidence/legacy/v038" + v040evidence "github.com/cosmos/cosmos-sdk/x/evidence/legacy/v040" + "github.com/cosmos/cosmos-sdk/x/genutil/types" + v039slashing "github.com/cosmos/cosmos-sdk/x/slashing/legacy/v039" + v040slashing "github.com/cosmos/cosmos-sdk/x/slashing/legacy/v040" +) + +// Migrate migrates exported state from v0.39 to a v0.40 genesis state. +func Migrate(appState types.AppMap, clientCtx client.Context) types.AppMap { + v039Codec := codec.NewLegacyAmino() + cryptocodec.RegisterCrypto(v039Codec) + v039auth.RegisterLegacyAminoCodec(v039Codec) + + v040Codec := clientCtx.JSONMarshaler + + if appState[v038bank.ModuleName] != nil { + // unmarshal relative source genesis application state + var bankGenState v038bank.GenesisState + v039Codec.MustUnmarshalJSON(appState[v038bank.ModuleName], &bankGenState) + + // unmarshal x/auth genesis state to retrieve all account balances + var authGenState v039auth.GenesisState + v039Codec.MustUnmarshalJSON(appState[v039auth.ModuleName], &authGenState) + + // unmarshal x/supply genesis state to retrieve total supply + var supplyGenState v036supply.GenesisState + v039Codec.MustUnmarshalJSON(appState[v036supply.ModuleName], &supplyGenState) + + // delete deprecated x/bank genesis state + delete(appState, v038bank.ModuleName) + + // delete deprecated x/supply genesis state + delete(appState, v036supply.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[v040bank.ModuleName] = v040Codec.MustMarshalJSON(v040bank.Migrate(bankGenState, authGenState, supplyGenState)) + } + + // remove balances from existing accounts + if appState[v039auth.ModuleName] != nil { + // unmarshal relative source genesis application state + var authGenState v039auth.GenesisState + v039Codec.MustUnmarshalJSON(appState[v039auth.ModuleName], &authGenState) + + // delete deprecated x/auth genesis state + delete(appState, v039auth.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[v040auth.ModuleName] = v040Codec.MustMarshalJSON(v040auth.Migrate(authGenState)) + } + + // Migrate x/evidence. + if appState[v038evidence.ModuleName] != nil { + // unmarshal relative source genesis application state + var evidenceGenState v038evidence.GenesisState + v039Codec.MustUnmarshalJSON(appState[v038bank.ModuleName], &evidenceGenState) + + // delete deprecated x/evidence genesis state + delete(appState, v038evidence.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[v040evidence.ModuleName] = v040Codec.MustMarshalJSON(v040evidence.Migrate(evidenceGenState, clientCtx)) + } + + // Migrate x/slashing. + if appState[v039slashing.ModuleName] != nil { + // unmarshal relative source genesis application state + var slashingGenState v039slashing.GenesisState + v039Codec.MustUnmarshalJSON(appState[v039slashing.ModuleName], &slashingGenState) + + // delete deprecated x/evidence genesis state + delete(appState, v039slashing.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[v040slashing.ModuleName] = v040Codec.MustMarshalJSON(v040slashing.Migrate(slashingGenState)) + } + + return appState +} diff --git a/x/genutil/legacy/v0_40/migrate.go b/x/genutil/legacy/v0_40/migrate.go deleted file mode 100644 index 3e4c06ac5f..0000000000 --- a/x/genutil/legacy/v0_40/migrate.go +++ /dev/null @@ -1,55 +0,0 @@ -package v040 - -import ( - "github.com/cosmos/cosmos-sdk/codec" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_39" - v040auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_40" - v038bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v0_38" - v040bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v0_40" - "github.com/cosmos/cosmos-sdk/x/genutil/types" -) - -// Migrate migrates exported state from v0.39 to a v0.40 genesis state. -func Migrate(appState types.AppMap) types.AppMap { - v039Codec := codec.NewLegacyAmino() - cryptocodec.RegisterCrypto(v039Codec) - v039auth.RegisterLegacyAminoCodec(v039Codec) - - v040Codec := codec.NewLegacyAmino() - cryptocodec.RegisterCrypto(v040Codec) - v039auth.RegisterLegacyAminoCodec(v040Codec) - - // remove balances from existing accounts - if appState[v039auth.ModuleName] != nil { - // unmarshal relative source genesis application state - var authGenState v039auth.GenesisState - v039Codec.MustUnmarshalJSON(appState[v039auth.ModuleName], &authGenState) - - // delete deprecated x/auth genesis state - delete(appState, v039auth.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040auth.ModuleName] = v040Codec.MustMarshalJSON(v040auth.Migrate(authGenState)) - } - - if appState[v038bank.ModuleName] != nil { - // unmarshal relative source genesis application state - var bankGenState v038bank.GenesisState - v039Codec.MustUnmarshalJSON(appState[v038bank.ModuleName], &bankGenState) - - // unmarshal x/auth genesis state to retrieve all account balances - var authGenState v039auth.GenesisState - v039Codec.MustUnmarshalJSON(appState[v039auth.ModuleName], &authGenState) - - // delete deprecated x/bank genesis state - delete(appState, v038bank.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040bank.ModuleName] = v040Codec.MustMarshalJSON(v040bank.Migrate(bankGenState, authGenState)) - } - - return appState -} diff --git a/x/genutil/types/types.go b/x/genutil/types/types.go index 230fa156fd..d902d8ccb3 100644 --- a/x/genutil/types/types.go +++ b/x/genutil/types/types.go @@ -4,6 +4,8 @@ import ( "encoding/json" "github.com/tendermint/tendermint/crypto" + + "github.com/cosmos/cosmos-sdk/client" ) // DONTCOVER @@ -16,7 +18,7 @@ type ( // targeted one. // // TODO: MigrationCallback should also return an error upon failure. - MigrationCallback func(AppMap) AppMap + MigrationCallback func(AppMap, client.Context) AppMap // MigrationMap defines a mapping from a version to a MigrationCallback. MigrationMap map[string]MigrationCallback diff --git a/x/gov/legacy/v0_34/types.go b/x/gov/legacy/v034/types.go similarity index 99% rename from x/gov/legacy/v0_34/types.go rename to x/gov/legacy/v034/types.go index 4b78b6987f..dd98cca21b 100644 --- a/x/gov/legacy/v0_34/types.go +++ b/x/gov/legacy/v034/types.go @@ -1,6 +1,6 @@ // DONTCOVER // nolint -package v0_34 +package v034 import ( "encoding/json" diff --git a/x/gov/legacy/v0_36/migrate.go b/x/gov/legacy/v036/migrate.go similarity index 95% rename from x/gov/legacy/v0_36/migrate.go rename to x/gov/legacy/v036/migrate.go index 6b55a53ea4..d20df1d9c7 100644 --- a/x/gov/legacy/v0_36/migrate.go +++ b/x/gov/legacy/v036/migrate.go @@ -1,7 +1,7 @@ -package v0_36 +package v036 import ( - v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v0_34" + v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v034" ) // Migrate accepts exported genesis state from v0.34 and migrates it to v0.36 diff --git a/x/gov/legacy/v0_36/types.go b/x/gov/legacy/v036/types.go similarity index 98% rename from x/gov/legacy/v0_36/types.go rename to x/gov/legacy/v036/types.go index 54fd9d7480..d0bc4620bc 100644 --- a/x/gov/legacy/v0_36/types.go +++ b/x/gov/legacy/v036/types.go @@ -1,6 +1,6 @@ // DONTCOVER // nolint -package v0_36 +package v036 import ( "fmt" @@ -9,7 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v0_34" + v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v034" ) const ( diff --git a/x/slashing/legacy/v039/types.go b/x/slashing/legacy/v039/types.go new file mode 100644 index 0000000000..34eed33717 --- /dev/null +++ b/x/slashing/legacy/v039/types.go @@ -0,0 +1,79 @@ +package v039 + +import ( + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +const ( + ModuleName = "slashing" +) + +// Default parameter namespace +const ( + DefaultParamspace = ModuleName + DefaultSignedBlocksWindow = int64(100) + DefaultDowntimeJailDuration = 60 * 10 * time.Second +) + +var ( + DefaultMinSignedPerWindow = sdk.NewDecWithPrec(5, 1) + DefaultSlashFractionDoubleSign = sdk.NewDec(1).Quo(sdk.NewDec(20)) + DefaultSlashFractionDowntime = sdk.NewDec(1).Quo(sdk.NewDec(100)) +) + +// Params - used for initializing default parameter for slashing at genesis +type Params struct { + SignedBlocksWindow int64 `json:"signed_blocks_window" yaml:"signed_blocks_window"` + MinSignedPerWindow sdk.Dec `json:"min_signed_per_window" yaml:"min_signed_per_window"` + DowntimeJailDuration time.Duration `json:"downtime_jail_duration" yaml:"downtime_jail_duration"` + SlashFractionDoubleSign sdk.Dec `json:"slash_fraction_double_sign" yaml:"slash_fraction_double_sign"` + SlashFractionDowntime sdk.Dec `json:"slash_fraction_downtime" yaml:"slash_fraction_downtime"` +} + +// NewParams creates a new Params object +func NewParams( + signedBlocksWindow int64, minSignedPerWindow sdk.Dec, downtimeJailDuration time.Duration, + slashFractionDoubleSign, slashFractionDowntime sdk.Dec, +) Params { + + return Params{ + SignedBlocksWindow: signedBlocksWindow, + MinSignedPerWindow: minSignedPerWindow, + DowntimeJailDuration: downtimeJailDuration, + SlashFractionDoubleSign: slashFractionDoubleSign, + SlashFractionDowntime: slashFractionDowntime, + } +} + +// DefaultParams defines the parameters for this module +func DefaultParams() Params { + return NewParams( + DefaultSignedBlocksWindow, DefaultMinSignedPerWindow, DefaultDowntimeJailDuration, + DefaultSlashFractionDoubleSign, DefaultSlashFractionDowntime, + ) +} + +// ValidatorSigningInfo defines the signing info for a validator +type ValidatorSigningInfo struct { + Address sdk.ConsAddress `json:"address" yaml:"address"` // validator consensus address + StartHeight int64 `json:"start_height" yaml:"start_height"` // height at which validator was first a candidate OR was unjailed + IndexOffset int64 `json:"index_offset" yaml:"index_offset"` // index offset into signed block bit array + JailedUntil time.Time `json:"jailed_until" yaml:"jailed_until"` // timestamp validator cannot be unjailed until + Tombstoned bool `json:"tombstoned" yaml:"tombstoned"` // whether or not a validator has been tombstoned (killed out of validator set) + MissedBlocksCounter int64 `json:"missed_blocks_counter" yaml:"missed_blocks_counter"` // missed blocks counter (to avoid scanning the array every time) +} + +// MissedBlock +type MissedBlock struct { + Index int64 `json:"index" yaml:"index"` + Missed bool `json:"missed" yaml:"missed"` +} + +// GenesisState - all slashing state that must be provided at genesis +type GenesisState struct { + Params Params `json:"params" yaml:"params"` + SigningInfos map[string]ValidatorSigningInfo `json:"signing_infos" yaml:"signing_infos"` + MissedBlocks map[string][]MissedBlock `json:"missed_blocks" yaml:"missed_blocks"` +} diff --git a/x/slashing/legacy/v040/migrate.go b/x/slashing/legacy/v040/migrate.go new file mode 100644 index 0000000000..4f99af1446 --- /dev/null +++ b/x/slashing/legacy/v040/migrate.go @@ -0,0 +1,62 @@ +package v040 + +import ( + "sort" + + v039slashing "github.com/cosmos/cosmos-sdk/x/slashing/legacy/v039" + v040slashing "github.com/cosmos/cosmos-sdk/x/slashing/types" +) + +// Migrate accepts exported x/slashing genesis state from v0.39 and migrates it +// to v0.40 x/slashing genesis state. The migration includes: +// +// - Chaning SigningInfos and MissedBlocks from map to array. +func Migrate(oldGenState v039slashing.GenesisState) *v040slashing.GenesisState { + // Note that the two following `for` loop over a map's keys, so are not + // deterministic. + var newSigningInfos = make([]v040slashing.SigningInfo, 0, len(oldGenState.SigningInfos)) + for address, signingInfo := range oldGenState.SigningInfos { + newSigningInfos = append(newSigningInfos, v040slashing.SigningInfo{ + Address: address, + ValidatorSigningInfo: v040slashing.ValidatorSigningInfo{ + Address: signingInfo.Address.String(), + StartHeight: signingInfo.StartHeight, + IndexOffset: signingInfo.IndexOffset, + JailedUntil: signingInfo.JailedUntil, + Tombstoned: signingInfo.Tombstoned, + MissedBlocksCounter: signingInfo.MissedBlocksCounter, + }, + }) + } + var newValidatorMissedBlocks = make([]v040slashing.ValidatorMissedBlocks, 0, len(oldGenState.MissedBlocks)) + for address, validatorMissedBlocks := range oldGenState.MissedBlocks { + var newMissedBlocks = make([]v040slashing.MissedBlock, len(validatorMissedBlocks)) + for i, missedBlock := range validatorMissedBlocks { + newMissedBlocks[i] = v040slashing.MissedBlock{ + Index: missedBlock.Index, + Missed: missedBlock.Missed, + } + } + + newValidatorMissedBlocks = append(newValidatorMissedBlocks, v040slashing.ValidatorMissedBlocks{ + Address: address, + MissedBlocks: newMissedBlocks, + }) + } + + // We sort these two arrays by address, so that we get determinstic states. + sort.Slice(newSigningInfos, func(i, j int) bool { return newSigningInfos[i].Address < newSigningInfos[j].Address }) + sort.Slice(newValidatorMissedBlocks, func(i, j int) bool { return newValidatorMissedBlocks[i].Address < newValidatorMissedBlocks[j].Address }) + + return &v040slashing.GenesisState{ + Params: v040slashing.Params{ + SignedBlocksWindow: oldGenState.Params.SignedBlocksWindow, + MinSignedPerWindow: oldGenState.Params.MinSignedPerWindow, + DowntimeJailDuration: oldGenState.Params.DowntimeJailDuration, + SlashFractionDoubleSign: oldGenState.Params.SlashFractionDoubleSign, + SlashFractionDowntime: oldGenState.Params.SlashFractionDowntime, + }, + SigningInfos: newSigningInfos, + MissedBlocks: newValidatorMissedBlocks, + } +} diff --git a/x/slashing/legacy/v040/migrate_test.go b/x/slashing/legacy/v040/migrate_test.go new file mode 100644 index 0000000000..513627659d --- /dev/null +++ b/x/slashing/legacy/v040/migrate_test.go @@ -0,0 +1,140 @@ +package v040_test + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/simapp" + sdk "github.com/cosmos/cosmos-sdk/types" + v039slashing "github.com/cosmos/cosmos-sdk/x/slashing/legacy/v039" + v040slashing "github.com/cosmos/cosmos-sdk/x/slashing/legacy/v040" +) + +func TestMigrate(t *testing.T) { + encodingConfig := simapp.MakeEncodingConfig() + clientCtx := client.Context{}. + WithInterfaceRegistry(encodingConfig.InterfaceRegistry). + WithTxConfig(encodingConfig.TxConfig). + WithLegacyAmino(encodingConfig.Amino). + WithJSONMarshaler(encodingConfig.Marshaler) + + addr1, err := sdk.ConsAddressFromBech32("cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685") + require.NoError(t, err) + addr2, err := sdk.ConsAddressFromBech32("cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph") + require.NoError(t, err) + + gs := v039slashing.GenesisState{ + Params: v039slashing.DefaultParams(), + SigningInfos: map[string]v039slashing.ValidatorSigningInfo{ + "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph": { + Address: addr2, + IndexOffset: 615501, + MissedBlocksCounter: 1, + Tombstoned: false, + }, + "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685": { + Address: addr1, + IndexOffset: 2, + MissedBlocksCounter: 2, + Tombstoned: false, + }, + }, + MissedBlocks: map[string][]v039slashing.MissedBlock{ + "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph": { + { + Index: 2, + Missed: true, + }, + }, + "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685": { + { + Index: 3, + Missed: true, + }, + { + Index: 4, + Missed: true, + }, + }, + }, + } + + migrated := v040slashing.Migrate(gs) + // Check that in `signing_infos` and `missed_blocks`, the address + // cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685 + // should always come before the address + // cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph + // (in alphabetic order, basically). + expected := `{ + "missed_blocks": [ + { + "address": "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685", + "missed_blocks": [ + { + "index": "3", + "missed": true + }, + { + "index": "4", + "missed": true + } + ] + }, + { + "address": "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph", + "missed_blocks": [ + { + "index": "2", + "missed": true + } + ] + } + ], + "params": { + "downtime_jail_duration": "600s", + "min_signed_per_window": "0.500000000000000000", + "signed_blocks_window": "100", + "slash_fraction_double_sign": "0.050000000000000000", + "slash_fraction_downtime": "0.010000000000000000" + }, + "signing_infos": [ + { + "address": "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685", + "validator_signing_info": { + "address": "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685", + "index_offset": "2", + "jailed_until": "0001-01-01T00:00:00Z", + "missed_blocks_counter": "2", + "start_height": "0", + "tombstoned": false + } + }, + { + "address": "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph", + "validator_signing_info": { + "address": "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph", + "index_offset": "615501", + "jailed_until": "0001-01-01T00:00:00Z", + "missed_blocks_counter": "1", + "start_height": "0", + "tombstoned": false + } + } + ] +}` + + bz, err := clientCtx.JSONMarshaler.MarshalJSON(migrated) + require.NoError(t, err) + + // Indent the JSON bz correctly. + var jsonObj map[string]interface{} + err = json.Unmarshal(bz, &jsonObj) + require.NoError(t, err) + indentedBz, err := json.MarshalIndent(jsonObj, "", " ") + require.NoError(t, err) + + require.Equal(t, expected, string(indentedBz)) +} diff --git a/x/slashing/legacy/v040/types.go b/x/slashing/legacy/v040/types.go new file mode 100644 index 0000000000..b95fa6fe24 --- /dev/null +++ b/x/slashing/legacy/v040/types.go @@ -0,0 +1,5 @@ +package v040 + +const ( + ModuleName = "slashing" +) diff --git a/x/staking/legacy/v0_34/types.go b/x/staking/legacy/v034/types.go similarity index 99% rename from x/staking/legacy/v0_34/types.go rename to x/staking/legacy/v034/types.go index 062fb31760..f062ef2fa1 100644 --- a/x/staking/legacy/v0_34/types.go +++ b/x/staking/legacy/v034/types.go @@ -1,6 +1,6 @@ // DONTCOVER // nolint -package v0_34 +package v034 import ( "time" diff --git a/x/staking/legacy/v0_36/migrate.go b/x/staking/legacy/v036/migrate.go similarity index 94% rename from x/staking/legacy/v0_36/migrate.go rename to x/staking/legacy/v036/migrate.go index 0d1b0fa2e7..cc4d7a4089 100644 --- a/x/staking/legacy/v0_36/migrate.go +++ b/x/staking/legacy/v036/migrate.go @@ -1,9 +1,9 @@ // DONTCOVER // nolint -package v0_36 +package v036 import ( - v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_34" + v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v034" ) // Migrate accepts exported genesis state from v0.34 and migrates it to v0.36 diff --git a/x/staking/legacy/v0_36/types.go b/x/staking/legacy/v036/types.go similarity index 98% rename from x/staking/legacy/v0_36/types.go rename to x/staking/legacy/v036/types.go index 0f90d1de96..7adc446eb0 100644 --- a/x/staking/legacy/v0_36/types.go +++ b/x/staking/legacy/v036/types.go @@ -1,6 +1,6 @@ // DONTCOVER // nolint -package v0_36 +package v036 import ( "time" @@ -9,7 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec/legacy" sdk "github.com/cosmos/cosmos-sdk/types" - v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_34" + v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v034" ) const ( diff --git a/x/staking/legacy/v0_38/migrate.go b/x/staking/legacy/v038/migrate.go similarity index 94% rename from x/staking/legacy/v0_38/migrate.go rename to x/staking/legacy/v038/migrate.go index e7e368f762..21029881a3 100644 --- a/x/staking/legacy/v0_38/migrate.go +++ b/x/staking/legacy/v038/migrate.go @@ -1,9 +1,9 @@ // DONTCOVER // nolint -package v0_38 +package v038 import ( - v036staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_36" + v036staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v036" ) // Migrate accepts exported genesis state from v0.36 or v0.37 and migrates it to diff --git a/x/staking/legacy/v0_38/types.go b/x/staking/legacy/v038/types.go similarity index 97% rename from x/staking/legacy/v0_38/types.go rename to x/staking/legacy/v038/types.go index 86f07d8a7b..def28b31cb 100644 --- a/x/staking/legacy/v0_38/types.go +++ b/x/staking/legacy/v038/types.go @@ -1,6 +1,6 @@ // DONTCOVER // nolint -package v0_38 +package v038 import ( "time" @@ -9,8 +9,8 @@ import ( "github.com/cosmos/cosmos-sdk/codec/legacy" sdk "github.com/cosmos/cosmos-sdk/types" - v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_34" - v036staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_36" + v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v034" + v036staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v036" ) const (