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:
co-authored by
Aaron Craelius
Aaron Craelius
blushi
Alexander Bezobchuk
colin axnér
Zaki Manian
Alessio Treglia
parent
6fa8330c31
commit
d9ede6551a
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
)
|
||||
@@ -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
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user