0.39->0.40 CLI migrate command (#6839)

* 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 <aaronc@users.noreply.github.com>
Co-authored-by: Aaron Craelius <aaron@regen.network>
Co-authored-by: blushi <marie.gauthier63@gmail.com>
Co-authored-by: Alexander Bezobchuk <alexanderbez@users.noreply.github.com>
Co-authored-by: colin axnér <25233464+colin-axner@users.noreply.github.com>
Co-authored-by: Zaki Manian <zaki@manian.org>
Co-authored-by: Alessio Treglia <alessio@tendermint.com>
This commit is contained in:
Amaury Martiny
2020-10-05 21:28:14 +00:00
committed by GitHub
co-authored by Aaron Craelius Aaron Craelius blushi Alexander Bezobchuk colin axnér Zaki Manian Alessio Treglia
parent 6fa8330c31
commit d9ede6551a
64 changed files with 1269 additions and 520 deletions
@@ -1,6 +1,6 @@
// DONTCOVER
// nolint
package v0_34
package v034
import (
sdk "github.com/cosmos/cosmos-sdk/types"
@@ -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
@@ -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"
)
@@ -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"
@@ -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
@@ -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{
@@ -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()
}
@@ -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
@@ -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()
}
+133
View File
@@ -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,
}
}
+258
View File
@@ -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))
}
@@ -1,8 +1,5 @@
package v040
// DONTCOVER
// nolint
const (
ModuleName = "auth"
)
-24
View File
@@ -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
}
-87
View File
@@ -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))
}
+5 -4
View File
@@ -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