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:
parent
6fa8330c31
commit
d9ede6551a
|
@ -107,8 +107,8 @@ message ValidatorSlashEventRecord {
|
||||||
uint64 height = 2;
|
uint64 height = 2;
|
||||||
// period is the period of the slash event.
|
// period is the period of the slash event.
|
||||||
uint64 period = 3;
|
uint64 period = 3;
|
||||||
// event describes the slash event.
|
// validator_slash_event describes the slash event.
|
||||||
ValidatorSlashEvent event = 4 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"event\""];
|
ValidatorSlashEvent validator_slash_event = 4 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"event\""];
|
||||||
}
|
}
|
||||||
|
|
||||||
// GenesisState defines the distribution module's genesis state.
|
// GenesisState defines the distribution module's genesis state.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
package v0_34
|
package v034
|
||||||
|
|
||||||
import (
|
import (
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
@ -1,9 +1,9 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
package v0_36
|
package v036
|
||||||
|
|
||||||
import (
|
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
|
// Migrate accepts exported genesis state from v0.34 and migrates it to v0.36
|
|
@ -1,10 +1,10 @@
|
||||||
package v0_36
|
package v036
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/types"
|
"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"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
|
@ -1,8 +1,8 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// 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 (
|
const (
|
||||||
ModuleName = "auth"
|
ModuleName = "auth"
|
|
@ -1,8 +1,8 @@
|
||||||
package v038
|
package v038
|
||||||
|
|
||||||
import (
|
import (
|
||||||
v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_36"
|
v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v036"
|
||||||
v036genaccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_36"
|
v036genaccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v036"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Migrate accepts exported genesis state from v0.34 and migrates it to v0.38
|
// Migrate accepts exported genesis state from v0.34 and migrates it to v0.38
|
|
@ -5,9 +5,9 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
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"
|
||||||
v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_36"
|
v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v036"
|
||||||
v036genaccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_36"
|
v036genaccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v036"
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
@ -102,30 +102,6 @@ func TestMigrateInvalid(t *testing.T) {
|
||||||
name string
|
name string
|
||||||
acc v036genaccounts.GenesisAccount
|
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",
|
"module account with invalid name",
|
||||||
v036genaccounts.GenesisAccount{
|
v036genaccounts.GenesisAccount{
|
|
@ -15,7 +15,7 @@ import (
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
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 (
|
const (
|
||||||
|
@ -223,11 +223,6 @@ func NewBaseVestingAccount(
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bva BaseVestingAccount) Validate() error {
|
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()
|
return bva.BaseAccount.Validate()
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ package v039
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"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
|
// 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"
|
||||||
"github.com/cosmos/cosmos-sdk/codec/legacy"
|
"github.com/cosmos/cosmos-sdk/codec/legacy"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
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"
|
||||||
v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_38"
|
v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v038"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -204,11 +204,6 @@ func (bva BaseVestingAccount) GetEndTime() int64 {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bva BaseVestingAccount) Validate() error {
|
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()
|
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
|
package v040
|
||||||
|
|
||||||
// DONTCOVER
|
|
||||||
// nolint
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
ModuleName = "auth"
|
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 (
|
var (
|
||||||
_ AccountI = (*BaseAccount)(nil)
|
_ AccountI = (*BaseAccount)(nil)
|
||||||
_ GenesisAccount = (*BaseAccount)(nil)
|
_ GenesisAccount = (*BaseAccount)(nil)
|
||||||
_ GenesisAccount = (*ModuleAccount)(nil)
|
_ codectypes.UnpackInterfacesMessage = (*BaseAccount)(nil)
|
||||||
_ ModuleAccountI = (*ModuleAccount)(nil)
|
_ GenesisAccount = (*ModuleAccount)(nil)
|
||||||
|
_ ModuleAccountI = (*ModuleAccount)(nil)
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewBaseAccount creates a new BaseAccount object
|
// NewBaseAccount creates a new BaseAccount object
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
package v0_36
|
package v036
|
||||||
|
|
||||||
import (
|
import (
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
@ -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{},
|
||||||
|
}
|
||||||
|
}
|
|
@ -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))
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
package v040
|
||||||
|
|
||||||
|
const (
|
||||||
|
ModuleName = "bank"
|
||||||
|
)
|
|
@ -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)
|
|
||||||
}
|
|
|
@ -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))
|
|
||||||
}
|
|
|
@ -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
|
|
||||||
}
|
|
|
@ -83,7 +83,7 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
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...)
|
moduleHoldings = moduleHoldings.Add(data.FeePool.CommunityPool...)
|
||||||
|
@ -182,10 +182,10 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState {
|
||||||
k.IterateValidatorSlashEvents(ctx,
|
k.IterateValidatorSlashEvents(ctx,
|
||||||
func(val sdk.ValAddress, height uint64, event types.ValidatorSlashEvent) (stop bool) {
|
func(val sdk.ValAddress, height uint64, event types.ValidatorSlashEvent) (stop bool) {
|
||||||
slashes = append(slashes, types.ValidatorSlashEventRecord{
|
slashes = append(slashes, types.ValidatorSlashEventRecord{
|
||||||
ValidatorAddress: val.String(),
|
ValidatorAddress: val.String(),
|
||||||
Height: height,
|
Height: height,
|
||||||
Period: event.ValidatorPeriod,
|
Period: event.ValidatorPeriod,
|
||||||
Event: event,
|
ValidatorSlashEvent: event,
|
||||||
})
|
})
|
||||||
return false
|
return false
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
package v0_34
|
package v034
|
||||||
|
|
||||||
import (
|
import (
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
@ -1,7 +1,7 @@
|
||||||
package v0_36
|
package v036
|
||||||
|
|
||||||
import (
|
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
|
// Migrate accepts exported genesis state from v0.34 and migrates it to v0.36
|
|
@ -1,11 +1,11 @@
|
||||||
package v0_36
|
package v036
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
||||||
"github.com/cosmos/cosmos-sdk/types"
|
"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"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
|
@ -1,10 +1,10 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
package v0_36
|
package v036
|
||||||
|
|
||||||
import (
|
import (
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
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"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
|
@ -1,10 +1,10 @@
|
||||||
package v0_38
|
package v038
|
||||||
|
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
|
|
||||||
import (
|
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
|
// Migrate accepts exported genesis state from v0.36 or v0.37 and migrates it to
|
|
@ -1,9 +1,9 @@
|
||||||
package v0_38
|
package v038
|
||||||
|
|
||||||
import (
|
import (
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
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"
|
||||||
v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_36"
|
v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v036"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DONTCOVER
|
// DONTCOVER
|
|
@ -5,7 +5,6 @@ package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
fmt "fmt"
|
fmt "fmt"
|
||||||
github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types"
|
|
||||||
types "github.com/cosmos/cosmos-sdk/types"
|
types "github.com/cosmos/cosmos-sdk/types"
|
||||||
_ "github.com/gogo/protobuf/gogoproto"
|
_ "github.com/gogo/protobuf/gogoproto"
|
||||||
proto "github.com/gogo/protobuf/proto"
|
proto "github.com/gogo/protobuf/proto"
|
||||||
|
@ -73,7 +72,7 @@ type ValidatorOutstandingRewardsRecord struct {
|
||||||
// validator_address is the address of the validator.
|
// 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"`
|
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.
|
// 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{} }
|
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"`
|
Height uint64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"`
|
||||||
// period is the period of the slash event.
|
// period is the period of the slash event.
|
||||||
Period uint64 `protobuf:"varint,3,opt,name=period,proto3" json:"period,omitempty"`
|
Period uint64 `protobuf:"varint,3,opt,name=period,proto3" json:"period,omitempty"`
|
||||||
// event describes the slash event.
|
// validator_slash_event describes the slash event.
|
||||||
Event ValidatorSlashEvent `protobuf:"bytes,4,opt,name=event,proto3" json:"event" yaml:"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{} }
|
func (m *ValidatorSlashEventRecord) Reset() { *m = ValidatorSlashEventRecord{} }
|
||||||
|
@ -397,71 +396,71 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
var fileDescriptor_76eed0f9489db580 = []byte{
|
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,
|
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,
|
0x1c, 0xf5, 0x3a, 0x25, 0x49, 0x27, 0x29, 0x0d, 0xdb, 0x7c, 0xb8, 0x4e, 0xea, 0x4d, 0xa7, 0x45,
|
||||||
0x08, 0xaa, 0x58, 0x37, 0x01, 0x01, 0x0a, 0x02, 0x29, 0x9b, 0x52, 0xe8, 0xa9, 0x61, 0x22, 0x01,
|
0x04, 0x55, 0xac, 0x9b, 0x80, 0x00, 0x05, 0x81, 0x94, 0x4d, 0x29, 0xf4, 0xd4, 0x30, 0x91, 0x00,
|
||||||
0x42, 0x48, 0xd6, 0x7a, 0x77, 0x6c, 0x8f, 0xb0, 0x77, 0xac, 0x99, 0xb1, 0x43, 0xfe, 0x02, 0x38,
|
0x71, 0xb1, 0xd6, 0xbb, 0x63, 0x7b, 0x84, 0xbd, 0x63, 0xcd, 0x8c, 0x1d, 0xc2, 0x3f, 0x00, 0x47,
|
||||||
0x22, 0x21, 0x4e, 0xbd, 0xe4, 0x88, 0x10, 0xc7, 0xde, 0xb9, 0xf6, 0xd8, 0x23, 0x07, 0x14, 0x90,
|
0x24, 0xc4, 0xa9, 0x1c, 0x72, 0x44, 0x88, 0x63, 0xef, 0x5c, 0x7b, 0xec, 0x91, 0x03, 0x0a, 0x28,
|
||||||
0x73, 0xe1, 0x9c, 0x03, 0x07, 0x0e, 0x08, 0xed, 0xcc, 0xec, 0x97, 0xbf, 0x70, 0x42, 0x72, 0x4a,
|
0xb9, 0x70, 0xce, 0x81, 0x03, 0x27, 0xb4, 0x33, 0xb3, 0x5f, 0xf6, 0xda, 0x38, 0xa1, 0x39, 0x25,
|
||||||
0x3c, 0xfe, 0xed, 0x7b, 0xef, 0xf7, 0xe6, 0xf7, 0xb1, 0x06, 0xaf, 0x7b, 0x94, 0xb7, 0x29, 0xaf,
|
0x1e, 0xff, 0xf6, 0xbd, 0xf7, 0x7b, 0xf3, 0xfb, 0x58, 0x83, 0xd7, 0x3d, 0xca, 0x3b, 0x94, 0x57,
|
||||||
0xf8, 0x84, 0x0b, 0x46, 0x6a, 0x5d, 0x41, 0x68, 0x50, 0xe9, 0x6d, 0xd6, 0xb0, 0x70, 0x37, 0x2b,
|
0x7d, 0xc2, 0x05, 0x23, 0xf5, 0x9e, 0x20, 0x34, 0xa8, 0xf6, 0x37, 0xeb, 0x58, 0xb8, 0x9b, 0xd5,
|
||||||
0x0d, 0x1c, 0x60, 0x4e, 0xb8, 0xdd, 0x61, 0x54, 0x50, 0x73, 0x55, 0x85, 0xda, 0xe9, 0x50, 0x5b,
|
0x26, 0x0e, 0x30, 0x27, 0xdc, 0xee, 0x32, 0x2a, 0xa8, 0xb9, 0xaa, 0x42, 0xed, 0x74, 0xa8, 0xad,
|
||||||
0x87, 0x96, 0x96, 0x1a, 0xb4, 0x41, 0x65, 0x5c, 0x25, 0xfc, 0x4f, 0x3d, 0x52, 0x2a, 0x6b, 0xf4,
|
0x43, 0xcb, 0x8b, 0x4d, 0xda, 0xa4, 0x32, 0xae, 0x1a, 0xfe, 0xa7, 0x1e, 0x29, 0x57, 0x34, 0x7a,
|
||||||
0x9a, 0xcb, 0x71, 0x8c, 0xea, 0x51, 0x12, 0xe8, 0xef, 0xed, 0x49, 0xec, 0x19, 0x1e, 0x19, 0x0f,
|
0xdd, 0xe5, 0x38, 0x46, 0xf5, 0x28, 0x09, 0xf4, 0xf7, 0xf6, 0x38, 0xf6, 0x0c, 0x8f, 0x8c, 0x87,
|
||||||
0x9f, 0x19, 0xe0, 0xe6, 0x43, 0xdc, 0xc2, 0x0d, 0x57, 0x50, 0xf6, 0x19, 0x11, 0x4d, 0x9f, 0xb9,
|
0x4f, 0x0d, 0xb0, 0xf4, 0x00, 0xb7, 0x71, 0xd3, 0x15, 0x94, 0x7d, 0x46, 0x44, 0xcb, 0x67, 0xee,
|
||||||
0x07, 0x8f, 0x83, 0x3a, 0x35, 0x1f, 0x83, 0x97, 0xfd, 0xe8, 0x8b, 0xaa, 0xeb, 0xfb, 0x0c, 0x73,
|
0xc1, 0xa3, 0xa0, 0x41, 0xcd, 0x47, 0xe0, 0x15, 0x3f, 0xfa, 0xa2, 0xe6, 0xfa, 0x3e, 0xc3, 0x9c,
|
||||||
0x5e, 0x34, 0xd6, 0x8d, 0x8d, 0x6b, 0xce, 0xda, 0xe9, 0xb1, 0x55, 0x3c, 0x74, 0xdb, 0xad, 0x6d,
|
0x97, 0x8c, 0x75, 0x63, 0xe3, 0xaa, 0xb3, 0x76, 0x76, 0x6c, 0x95, 0x0e, 0xdd, 0x4e, 0x7b, 0x1b,
|
||||||
0x38, 0x14, 0x02, 0xd1, 0x62, 0x7c, 0xb6, 0xa3, 0x8e, 0xcc, 0x47, 0x60, 0xf1, 0x40, 0x43, 0xc7,
|
0x0e, 0x85, 0x40, 0xb4, 0x10, 0x9f, 0xed, 0xa8, 0x23, 0xf3, 0x21, 0x58, 0x38, 0xd0, 0xd0, 0x31,
|
||||||
0x48, 0x79, 0x89, 0xb4, 0x7a, 0x7a, 0x6c, 0xad, 0x28, 0xa4, 0xc1, 0x08, 0x88, 0x6e, 0x44, 0x47,
|
0x52, 0x51, 0x22, 0xad, 0x9e, 0x1d, 0x5b, 0x2b, 0x0a, 0x69, 0x30, 0x02, 0xa2, 0xeb, 0xd1, 0x91,
|
||||||
0x1a, 0x67, 0x7b, 0xfe, 0xdb, 0x23, 0x2b, 0xf7, 0xe7, 0x91, 0x95, 0x83, 0x4f, 0xf3, 0xe0, 0xce,
|
0xc6, 0xd9, 0x9e, 0xfd, 0xf6, 0xc8, 0x2a, 0xfc, 0x75, 0x64, 0x15, 0xe0, 0x93, 0x22, 0xb8, 0xfd,
|
||||||
0xa7, 0x6e, 0x8b, 0xf8, 0x21, 0xcd, 0x93, 0xae, 0xe0, 0xc2, 0x0d, 0x7c, 0x12, 0x34, 0x10, 0x3e,
|
0xa9, 0xdb, 0x26, 0x7e, 0x48, 0xf3, 0xb8, 0x27, 0xb8, 0x70, 0x03, 0x9f, 0x04, 0x4d, 0x84, 0x0f,
|
||||||
0x70, 0x99, 0xcf, 0x11, 0xf6, 0x28, 0xf3, 0xc3, 0x14, 0x7a, 0x51, 0xd0, 0xf8, 0x14, 0x86, 0x42,
|
0x5c, 0xe6, 0x73, 0x84, 0x3d, 0xca, 0xfc, 0x30, 0x85, 0x7e, 0x14, 0x34, 0x3a, 0x85, 0xa1, 0x10,
|
||||||
0x20, 0x5a, 0x8c, 0xcf, 0xa2, 0x14, 0x8e, 0x0c, 0xf0, 0x0a, 0x4d, 0x78, 0xaa, 0x4c, 0x11, 0x15,
|
0x88, 0x16, 0xe2, 0xb3, 0x28, 0x85, 0x23, 0x03, 0xdc, 0xa0, 0x09, 0x4f, 0x8d, 0x29, 0xa2, 0x52,
|
||||||
0xf3, 0xeb, 0x33, 0x1b, 0x85, 0xad, 0x35, 0x6d, 0xbb, 0x1d, 0x5e, 0x4b, 0x74, 0x83, 0xf6, 0x43,
|
0x71, 0x7d, 0x6a, 0x63, 0x6e, 0x6b, 0x4d, 0xdb, 0x6e, 0x87, 0xd7, 0x12, 0xdd, 0xa0, 0xfd, 0x00,
|
||||||
0xec, 0xed, 0x52, 0x12, 0x38, 0x9f, 0x3c, 0x3f, 0xb6, 0x72, 0xa7, 0xc7, 0x56, 0x49, 0xf1, 0x8d,
|
0x7b, 0xbb, 0x94, 0x04, 0xce, 0x27, 0xcf, 0x8e, 0xad, 0xc2, 0xd9, 0xb1, 0x55, 0x56, 0x7c, 0x39,
|
||||||
0x80, 0x81, 0x3f, 0xfd, 0x6e, 0xdd, 0x6f, 0x10, 0xd1, 0xec, 0xd6, 0x6c, 0x8f, 0xb6, 0x2b, 0xfa,
|
0x30, 0xf0, 0xe7, 0x3f, 0xac, 0x7b, 0x4d, 0x22, 0x5a, 0xbd, 0xba, 0xed, 0xd1, 0x4e, 0x55, 0x5f,
|
||||||
0x12, 0xd5, 0x9f, 0x37, 0xb8, 0xff, 0x55, 0x45, 0x1c, 0x76, 0x30, 0x8f, 0x10, 0x39, 0x32, 0xe9,
|
0xa2, 0xfa, 0xf3, 0x06, 0xf7, 0xbf, 0xac, 0x8a, 0xc3, 0x2e, 0xe6, 0x11, 0x22, 0x47, 0x26, 0x1d,
|
||||||
0x50, 0xce, 0x29, 0x77, 0xfe, 0x32, 0xc0, 0xbd, 0xd8, 0x9d, 0x1d, 0xcf, 0xeb, 0xb6, 0xbb, 0x2d,
|
0xca, 0x39, 0xe5, 0xce, 0xdf, 0x06, 0xb8, 0x1b, 0xbb, 0xb3, 0xe3, 0x79, 0xbd, 0x4e, 0xaf, 0xed,
|
||||||
0x57, 0x60, 0x7f, 0x97, 0xb6, 0xdb, 0x84, 0x73, 0x42, 0x83, 0x8b, 0x37, 0xe8, 0x10, 0x14, 0xdc,
|
0x0a, 0xec, 0xef, 0xd2, 0x4e, 0x87, 0x70, 0x4e, 0x68, 0xf0, 0xe2, 0x0d, 0x3a, 0x04, 0x73, 0x6e,
|
||||||
0x84, 0x49, 0x5e, 0x6f, 0x61, 0xeb, 0x3d, 0x7b, 0x42, 0x85, 0xdb, 0x93, 0x25, 0x3a, 0x25, 0x6d,
|
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, 0xdb, 0x00, 0xeb, 0x31, 0xea,
|
0x9b, 0xa9, 0x54, 0xa4, 0xd0, 0x21, 0x4a, 0x73, 0xa5, 0x12, 0xff, 0xc7, 0x00, 0xeb, 0x31, 0xea,
|
||||||
0xc7, 0x84, 0x0b, 0xca, 0x88, 0xe7, 0xb6, 0x2e, 0xad, 0x2a, 0x96, 0xc1, 0x6c, 0x07, 0x33, 0x42,
|
0xc7, 0x84, 0x0b, 0xca, 0x88, 0xe7, 0xb6, 0x2f, 0xad, 0x2a, 0x96, 0xc1, 0x74, 0x17, 0x33, 0x42,
|
||||||
0x55, 0xbe, 0x57, 0x90, 0xfe, 0x64, 0x12, 0x30, 0x17, 0x15, 0xc8, 0x8c, 0x34, 0xe2, 0x9d, 0xe9,
|
0x55, 0xbe, 0x57, 0x90, 0xfe, 0x64, 0x12, 0x30, 0x13, 0x15, 0xc8, 0x94, 0x34, 0xe2, 0x9d, 0xc9,
|
||||||
0x8c, 0x18, 0x92, 0xec, 0x2c, 0x6b, 0x13, 0x5e, 0x52, 0xaa, 0xa2, 0x7a, 0x41, 0x11, 0x7e, 0x2a,
|
0x8c, 0x18, 0x92, 0xec, 0x2c, 0x6b, 0x13, 0x5e, 0x56, 0xaa, 0xa2, 0x7a, 0x41, 0x11, 0x7e, 0x2a,
|
||||||
0xf9, 0xdf, 0x0c, 0x70, 0x3b, 0x46, 0xda, 0xed, 0x32, 0x86, 0x03, 0x71, 0x69, 0x99, 0xd7, 0x93,
|
0xf9, 0xdf, 0x0d, 0x70, 0x2b, 0x46, 0xda, 0xed, 0x31, 0x86, 0x03, 0x71, 0x69, 0x99, 0x37, 0x92,
|
||||||
0x0c, 0xd5, 0x55, 0xbf, 0x35, 0x5d, 0x86, 0x59, 0x5d, 0x67, 0x49, 0xef, 0x59, 0x1e, 0xac, 0xc6,
|
0x0c, 0xd5, 0x55, 0xbf, 0x35, 0x59, 0x86, 0x59, 0x5d, 0xe7, 0x49, 0xef, 0x69, 0x11, 0xac, 0xc6,
|
||||||
0x93, 0x6a, 0x5f, 0xb8, 0x4c, 0x90, 0xa0, 0x11, 0x4e, 0xaa, 0x24, 0xb9, 0x8b, 0x9a, 0x57, 0x23,
|
0x93, 0x6a, 0x5f, 0xb8, 0x4c, 0x90, 0xa0, 0x19, 0x4e, 0xaa, 0x24, 0xb9, 0x17, 0x35, 0xaf, 0x72,
|
||||||
0x7d, 0xca, 0x9f, 0xcb, 0xa7, 0x2e, 0xb8, 0xce, 0xb5, 0xd6, 0x2a, 0x09, 0xea, 0x54, 0xd7, 0xc3,
|
0x7d, 0x2a, 0x5e, 0xc8, 0xa7, 0x1e, 0xb8, 0xc6, 0xb5, 0xd6, 0x1a, 0x09, 0x1a, 0x54, 0xd7, 0xc3,
|
||||||
0xd6, 0x44, 0xb7, 0x46, 0xa6, 0xe9, 0xac, 0x69, 0xaf, 0x96, 0x14, 0x7d, 0x06, 0x16, 0xa2, 0x05,
|
0xd6, 0x58, 0xb7, 0x72, 0xd3, 0x74, 0xd6, 0xb4, 0x57, 0x8b, 0x8a, 0x3e, 0x03, 0x0b, 0xd1, 0x3c,
|
||||||
0x9e, 0x8a, 0x4d, 0xd9, 0xf6, 0x8f, 0x01, 0x6e, 0xc5, 0xee, 0xef, 0xb7, 0x5c, 0xde, 0xfc, 0xb0,
|
0x4f, 0xc5, 0xa6, 0x6c, 0xfb, 0xb1, 0x08, 0x6e, 0xc6, 0xee, 0xef, 0xb7, 0x5d, 0xde, 0xfa, 0xb0,
|
||||||
0x27, 0x2f, 0xe0, 0x12, 0x7a, 0xa1, 0x89, 0x49, 0xa3, 0x29, 0xa2, 0x5e, 0x50, 0x9f, 0x52, 0x3d,
|
0x2f, 0x2f, 0xe0, 0x12, 0x7a, 0xa1, 0x85, 0x49, 0xb3, 0x25, 0xa2, 0x5e, 0x50, 0x9f, 0x52, 0x3d,
|
||||||
0x32, 0x93, 0xe9, 0x91, 0x2f, 0xc1, 0x55, 0x1c, 0x2a, 0x29, 0x5e, 0x91, 0x8e, 0x3c, 0x98, 0xae,
|
0x32, 0x95, 0xe9, 0x91, 0xaf, 0xc1, 0x52, 0x82, 0xcb, 0x43, 0x61, 0x35, 0x1c, 0x2a, 0x2b, 0x5d,
|
||||||
0x7e, 0x92, 0x0c, 0x9c, 0x25, 0xed, 0xc7, 0x82, 0x12, 0x29, 0xc1, 0x20, 0x52, 0xa0, 0x29, 0x03,
|
0x91, 0x0e, 0xdd, 0x9f, 0xac, 0x9e, 0x92, 0x8c, 0x9c, 0x45, 0xed, 0xcf, 0xbc, 0x12, 0x2d, 0xc1,
|
||||||
0xbe, 0x29, 0x80, 0x85, 0x8f, 0xd4, 0xda, 0xdd, 0x17, 0xae, 0xc0, 0x26, 0x02, 0xb3, 0x1d, 0x97,
|
0x20, 0xba, 0xd1, 0x1f, 0x0e, 0x4d, 0xd9, 0xf3, 0xcd, 0x1c, 0x98, 0xff, 0x48, 0x2d, 0xe5, 0x7d,
|
||||||
0xb9, 0x6d, 0x95, 0x68, 0x61, 0xeb, 0xee, 0x44, 0xe6, 0x3d, 0x19, 0xea, 0xdc, 0xd4, 0x64, 0xd7,
|
0xe1, 0x0a, 0x6c, 0x22, 0x30, 0xdd, 0x75, 0x99, 0xdb, 0x51, 0x36, 0xcc, 0x6d, 0xdd, 0x19, 0xab,
|
||||||
0x15, 0x99, 0x02, 0x80, 0x48, 0x23, 0x99, 0x9f, 0x83, 0xf9, 0x3a, 0xc6, 0xd5, 0x0e, 0xa5, 0x2d,
|
0x63, 0x4f, 0x86, 0x3a, 0x4b, 0x9a, 0xfa, 0x9a, 0xa2, 0x56, 0x00, 0x10, 0x69, 0x24, 0xf3, 0x73,
|
||||||
0xdd, 0x0f, 0xf7, 0x26, 0xa2, 0x3e, 0xc2, 0x78, 0x8f, 0xd2, 0x96, 0xb3, 0xa2, 0x61, 0x6f, 0x28,
|
0x30, 0xdb, 0xc0, 0xb8, 0xd6, 0xa5, 0xb4, 0xad, 0xbb, 0xe5, 0xee, 0x58, 0xd4, 0x87, 0x18, 0xef,
|
||||||
0xd8, 0x08, 0x03, 0xa2, 0xb9, 0xba, 0x8a, 0x30, 0x7f, 0x30, 0x40, 0x31, 0x29, 0xda, 0x78, 0x49,
|
0x51, 0xda, 0x76, 0x56, 0x34, 0xec, 0x75, 0x05, 0x1b, 0x61, 0x40, 0x34, 0xd3, 0x50, 0x11, 0xe6,
|
||||||
0x86, 0x97, 0x1e, 0x0e, 0x97, 0x99, 0xe9, 0x8b, 0x29, 0xbd, 0xdd, 0x9d, 0xd7, 0x34, 0xb1, 0x35,
|
0x0f, 0x06, 0x28, 0x25, 0x25, 0x1d, 0xaf, 0xd0, 0xb0, 0x24, 0xc2, 0xd1, 0x33, 0x35, 0x79, 0xa9,
|
||||||
0xd8, 0x16, 0x59, 0x06, 0x88, 0x96, 0xfd, 0x51, 0xcf, 0xcb, 0x1e, 0xe9, 0x30, 0xdc, 0x23, 0xb4,
|
0xa5, 0x77, 0xbf, 0xf3, 0x9a, 0x26, 0xb6, 0x06, 0x9b, 0x26, 0xcb, 0x00, 0xd1, 0xb2, 0x9f, 0xf7,
|
||||||
0xcb, 0xab, 0x1d, 0x46, 0x3b, 0x94, 0x63, 0x26, 0xaf, 0x32, 0x53, 0x39, 0x43, 0x21, 0x10, 0x2d,
|
0xbc, 0xec, 0xa0, 0x2e, 0xc3, 0x7d, 0x42, 0x7b, 0xbc, 0xd6, 0x65, 0xb4, 0x4b, 0x39, 0x66, 0xf2,
|
||||||
0x46, 0x67, 0x7b, 0xfa, 0xc8, 0xfc, 0x7e, 0xcc, 0x6e, 0xbd, 0x2a, 0xb3, 0xfb, 0x60, 0xba, 0xc2,
|
0x62, 0x33, 0x75, 0x35, 0x14, 0x02, 0xd1, 0x42, 0x74, 0xb6, 0xa7, 0x8f, 0xcc, 0xef, 0x47, 0x6c,
|
||||||
0x18, 0xf7, 0x12, 0xe0, 0xc0, 0xff, 0xde, 0xbe, 0xa3, 0xd6, 0xa9, 0xf9, 0x8b, 0x01, 0xee, 0xa4,
|
0xde, 0x97, 0x64, 0x76, 0x1f, 0x4c, 0x56, 0x26, 0xa3, 0x5e, 0x11, 0x1c, 0xf8, 0xdf, 0xbb, 0x39,
|
||||||
0x0a, 0x3f, 0xd9, 0x37, 0x55, 0x2f, 0xde, 0x51, 0xbc, 0x38, 0x2b, 0x35, 0xee, 0xfc, 0x8f, 0x3d,
|
0x6f, 0xd9, 0x9a, 0xbf, 0x1a, 0xe0, 0x76, 0xaa, 0x2d, 0x92, 0x6d, 0x54, 0xf3, 0xe2, 0x0d, 0xc6,
|
||||||
0xa7, 0x65, 0x3e, 0xd0, 0x32, 0x37, 0x86, 0x5a, 0x6e, 0x34, 0x33, 0x44, 0x56, 0x6f, 0x22, 0x2e,
|
0x4b, 0xd3, 0x52, 0xe3, 0xce, 0xff, 0xd8, 0x82, 0x5a, 0xe6, 0x7d, 0x2d, 0x73, 0x63, 0xa8, 0x21,
|
||||||
0x37, 0x7f, 0x36, 0xc0, 0x5a, 0x82, 0xd3, 0x8c, 0x77, 0x4b, 0x6c, 0xf0, 0x9c, 0x14, 0xff, 0xfe,
|
0xf3, 0x99, 0x21, 0xb2, 0xfa, 0x63, 0x71, 0xb9, 0xf9, 0x8b, 0x01, 0xd6, 0x12, 0x9c, 0x56, 0xbc,
|
||||||
0x39, 0x77, 0x93, 0x16, 0x7e, 0x5f, 0x0b, 0xbf, 0x3b, 0x28, 0x7c, 0x98, 0x10, 0xa2, 0x52, 0x6f,
|
0x79, 0x62, 0x83, 0x67, 0xa4, 0xf8, 0xf7, 0x2f, 0xb8, 0xb9, 0xb4, 0xf0, 0x7b, 0x5a, 0xf8, 0x9d,
|
||||||
0x2c, 0x5c, 0xf8, 0x8a, 0x75, 0x2b, 0x79, 0xda, 0x53, 0x8b, 0x22, 0xd6, 0x3a, 0x2f, 0xb5, 0x6e,
|
0x41, 0xe1, 0xc3, 0x84, 0x10, 0x95, 0xfb, 0x23, 0xe1, 0xc2, 0x17, 0xb0, 0x9b, 0xc9, 0xd3, 0x9e,
|
||||||
0x9f, 0x67, 0xcb, 0x68, 0xa1, 0x1b, 0x5a, 0xe8, 0xfa, 0xa0, 0xd0, 0x01, 0x2a, 0x88, 0x56, 0x7a,
|
0x5a, 0x23, 0xb1, 0xd6, 0x59, 0xa9, 0x75, 0xfb, 0x22, 0x3b, 0x48, 0x0b, 0xdd, 0xd0, 0x42, 0xd7,
|
||||||
0xa3, 0x81, 0xcc, 0xa7, 0x99, 0x66, 0xcc, 0x4c, 0x60, 0x5e, 0xbc, 0x26, 0x15, 0xbe, 0x7b, 0xf6,
|
0x07, 0x85, 0x0e, 0x50, 0x41, 0xb4, 0xd2, 0xcf, 0x07, 0x32, 0x9f, 0x64, 0x9a, 0x31, 0x33, 0x9f,
|
||||||
0xc9, 0xae, 0xf5, 0x8d, 0x6d, 0xc9, 0x2c, 0x4f, 0xba, 0x25, 0xd3, 0x28, 0x3c, 0xec, 0xa3, 0xe5,
|
0x79, 0xe9, 0xaa, 0x54, 0xf8, 0xee, 0xf9, 0xe7, 0xbe, 0xd6, 0x37, 0xb2, 0x25, 0xb3, 0x3c, 0xe9,
|
||||||
0x24, 0x2b, 0x1e, 0x4e, 0xca, 0xaa, 0x9c, 0x86, 0xbc, 0x08, 0xa4, 0xb6, 0xb7, 0xcf, 0x3a, 0x63,
|
0x96, 0x4c, 0xa3, 0xf0, 0xb0, 0x8f, 0x96, 0x73, 0x07, 0x2e, 0x2f, 0x01, 0xa9, 0xed, 0xed, 0xf3,
|
||||||
0xb5, 0xb2, 0x57, 0xb5, 0xb2, 0xdb, 0x83, 0xce, 0xa5, 0x39, 0x20, 0x5a, 0xea, 0x0d, 0x23, 0xa4,
|
0x4e, 0x5c, 0xad, 0xec, 0x55, 0xad, 0xec, 0xd6, 0xa0, 0x73, 0x69, 0x0e, 0x88, 0x16, 0x73, 0x06,
|
||||||
0x36, 0xb8, 0xf3, 0xe4, 0xc7, 0x7e, 0xd9, 0x78, 0xde, 0x2f, 0x1b, 0x2f, 0xfa, 0x65, 0xe3, 0x8f,
|
0x71, 0x6a, 0xbf, 0x3b, 0x8f, 0x7f, 0x3a, 0xa9, 0x18, 0xcf, 0x4e, 0x2a, 0xc6, 0xf3, 0x93, 0x8a,
|
||||||
0x7e, 0xd9, 0xf8, 0xee, 0xa4, 0x9c, 0x7b, 0x71, 0x52, 0xce, 0xfd, 0x7a, 0x52, 0xce, 0x7d, 0xb1,
|
0xf1, 0xe7, 0x49, 0xc5, 0xf8, 0xee, 0xb4, 0x52, 0x78, 0x7e, 0x5a, 0x29, 0xfc, 0x76, 0x5a, 0x29,
|
||||||
0x39, 0xf1, 0xfd, 0xf7, 0xeb, 0xec, 0x2f, 0x1a, 0xf9, 0x3a, 0x5c, 0x9b, 0x95, 0xbf, 0x61, 0xde,
|
0x7c, 0xb1, 0x39, 0xf6, 0xed, 0xf8, 0xab, 0xec, 0xef, 0x1d, 0xf9, 0xb2, 0x5c, 0x9f, 0x96, 0xbf,
|
||||||
0xfc, 0x37, 0x00, 0x00, 0xff, 0xff, 0x47, 0x6c, 0x1c, 0x49, 0x73, 0x0d, 0x00, 0x00,
|
0x70, 0xde, 0xfc, 0x37, 0x00, 0x00, 0xff, 0xff, 0xa8, 0xee, 0xfe, 0x4a, 0x91, 0x0d, 0x00, 0x00,
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *DelegatorWithdrawInfo) Marshal() (dAtA []byte, err error) {
|
func (m *DelegatorWithdrawInfo) Marshal() (dAtA []byte, err error) {
|
||||||
|
@ -738,7 +737,7 @@ func (m *ValidatorSlashEventRecord) MarshalToSizedBuffer(dAtA []byte) (int, erro
|
||||||
var l int
|
var l int
|
||||||
_ = l
|
_ = l
|
||||||
{
|
{
|
||||||
size, err := m.Event.MarshalToSizedBuffer(dAtA[:i])
|
size, err := m.ValidatorSlashEvent.MarshalToSizedBuffer(dAtA[:i])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
@ -1045,7 +1044,7 @@ func (m *ValidatorSlashEventRecord) Size() (n int) {
|
||||||
if m.Period != 0 {
|
if m.Period != 0 {
|
||||||
n += 1 + sovGenesis(uint64(m.Period))
|
n += 1 + sovGenesis(uint64(m.Period))
|
||||||
}
|
}
|
||||||
l = m.Event.Size()
|
l = m.ValidatorSlashEvent.Size()
|
||||||
n += 1 + l + sovGenesis(uint64(l))
|
n += 1 + l + sovGenesis(uint64(l))
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
@ -1975,7 +1974,7 @@ func (m *ValidatorSlashEventRecord) Unmarshal(dAtA []byte) error {
|
||||||
}
|
}
|
||||||
case 4:
|
case 4:
|
||||||
if wireType != 2 {
|
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
|
var msglen int
|
||||||
for shift := uint(0); ; shift += 7 {
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
@ -2002,7 +2001,7 @@ func (m *ValidatorSlashEventRecord) Unmarshal(dAtA []byte) error {
|
||||||
if postIndex > l {
|
if postIndex > l {
|
||||||
return io.ErrUnexpectedEOF
|
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
|
return err
|
||||||
}
|
}
|
||||||
iNdEx = postIndex
|
iNdEx = postIndex
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package exported
|
package exported
|
||||||
|
|
||||||
import (
|
import (
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
||||||
|
|
||||||
tmbytes "github.com/tendermint/tendermint/libs/bytes"
|
tmbytes "github.com/tendermint/tendermint/libs/bytes"
|
||||||
|
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Evidence defines the contract which concrete evidence types of misbehavior
|
// Evidence defines the contract which concrete evidence types of misbehavior
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
|
@ -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))
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
package v040
|
||||||
|
|
||||||
|
// Default parameter values
|
||||||
|
const (
|
||||||
|
ModuleName = "evidence"
|
||||||
|
)
|
|
@ -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`
|
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.
|
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
|
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
|
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
|
state/file. For an example implementation of the `add-genesis-account` command please
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
package v0_34
|
package v034
|
||||||
|
|
||||||
import (
|
import (
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
@ -1,15 +1,15 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
package v0_36
|
package v036
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
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"
|
||||||
v034accounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_34"
|
v034accounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v034"
|
||||||
v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v0_34"
|
v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v034"
|
||||||
v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_34"
|
v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v034"
|
||||||
|
|
||||||
"github.com/tendermint/tendermint/crypto"
|
"github.com/tendermint/tendermint/crypto"
|
||||||
)
|
)
|
|
@ -1,4 +1,4 @@
|
||||||
package v0_36
|
package v036
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -7,10 +7,10 @@ import (
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
||||||
"github.com/cosmos/cosmos-sdk/types"
|
"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"
|
||||||
v034accounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_34"
|
v034accounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v034"
|
||||||
v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v0_34"
|
v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v034"
|
||||||
v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_34"
|
v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v034"
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
|
@ -1,6 +1,6 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
package v0_36
|
package v036
|
||||||
|
|
||||||
import (
|
import (
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
@ -8,15 +8,17 @@ import (
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
tmjson "github.com/tendermint/tendermint/libs/json"
|
||||||
tmtypes "github.com/tendermint/tendermint/types"
|
tmtypes "github.com/tendermint/tendermint/types"
|
||||||
|
|
||||||
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
"github.com/cosmos/cosmos-sdk/client/flags"
|
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/cosmos/cosmos-sdk/version"
|
"github.com/cosmos/cosmos-sdk/version"
|
||||||
v036 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v0_36"
|
v036 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v036"
|
||||||
v038 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v0_38"
|
v038 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v038"
|
||||||
v039 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v0_39"
|
v039 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v039"
|
||||||
v040 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v0_40"
|
v040 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v040"
|
||||||
"github.com/cosmos/cosmos-sdk/x/genutil/types"
|
"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),
|
`, version.AppName),
|
||||||
Args: cobra.ExactArgs(2),
|
Args: cobra.ExactArgs(2),
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
clientCtx := client.GetClientContextFromCmd(cmd)
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
target := args[0]
|
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
|
// TODO: handler error from migrationFunc call
|
||||||
newGenState := migrationFunc(initialState)
|
newGenState := migrationFunc(initialState, clientCtx)
|
||||||
|
|
||||||
genDoc.AppState, err = json.Marshal(newGenState)
|
genDoc.AppState, err = json.Marshal(newGenState)
|
||||||
if err != nil {
|
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
|
genDoc.ChainID = chainID
|
||||||
}
|
}
|
||||||
|
|
||||||
bz, err := json.MarshalIndent(genDoc, "", " ")
|
bz, err := tmjson.Marshal(genDoc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to marshal genesis doc")
|
return errors.Wrap(err, "failed to marshal genesis doc")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +1,25 @@
|
||||||
package v036
|
package v036
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
|
cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
|
||||||
v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_34"
|
v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v034"
|
||||||
v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_36"
|
v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v036"
|
||||||
v036bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v0_36"
|
v036bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v036"
|
||||||
v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_34"
|
v034distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v034"
|
||||||
v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_36"
|
v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v036"
|
||||||
v034genAccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_34"
|
v034genAccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v034"
|
||||||
v036genAccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_36"
|
v036genAccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v036"
|
||||||
"github.com/cosmos/cosmos-sdk/x/genutil/types"
|
"github.com/cosmos/cosmos-sdk/x/genutil/types"
|
||||||
v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v0_34"
|
v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v034"
|
||||||
v036gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v0_36"
|
v036gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v036"
|
||||||
v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_34"
|
v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v034"
|
||||||
v036staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_36"
|
v036staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v036"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Migrate migrates exported state from v0.34 to a v0.36 genesis state.
|
// 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()
|
v034Codec := codec.NewLegacyAmino()
|
||||||
cryptocodec.RegisterCrypto(v034Codec)
|
cryptocodec.RegisterCrypto(v034Codec)
|
||||||
v034gov.RegisterLegacyAminoCodec(v034Codec)
|
v034gov.RegisterLegacyAminoCodec(v034Codec)
|
|
@ -5,6 +5,7 @@ import (
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
"github.com/cosmos/cosmos-sdk/x/genutil/types"
|
"github.com/cosmos/cosmos-sdk/x/genutil/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -90,7 +91,7 @@ func TestDummyGenesis(t *testing.T) {
|
||||||
"foo": {},
|
"foo": {},
|
||||||
"bar": []byte(`{"custom": "module"}`),
|
"bar": []byte(`{"custom": "module"}`),
|
||||||
}
|
}
|
||||||
migratedDummy := Migrate(genesisDummy)
|
migratedDummy := Migrate(genesisDummy, client.Context{})
|
||||||
|
|
||||||
// We should not touch custom modules in the map
|
// We should not touch custom modules in the map
|
||||||
require.Equal(t, genesisDummy["foo"], migratedDummy["foo"])
|
require.Equal(t, genesisDummy["foo"], migratedDummy["foo"])
|
||||||
|
@ -102,5 +103,5 @@ func TestGovGenesis(t *testing.T) {
|
||||||
"gov": basic034Gov,
|
"gov": basic034Gov,
|
||||||
}
|
}
|
||||||
|
|
||||||
require.NotPanics(t, func() { Migrate(genesis) })
|
require.NotPanics(t, func() { Migrate(genesis, client.Context{}) })
|
||||||
}
|
}
|
|
@ -1,20 +1,21 @@
|
||||||
package v038
|
package v038
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
|
cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
|
||||||
v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_36"
|
v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v036"
|
||||||
v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_38"
|
v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v038"
|
||||||
v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_36"
|
v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v036"
|
||||||
v038distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v0_38"
|
v038distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v038"
|
||||||
v036genaccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_36"
|
v036genaccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v036"
|
||||||
"github.com/cosmos/cosmos-sdk/x/genutil/types"
|
"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"
|
||||||
v038staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_38"
|
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.
|
// 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()
|
v036Codec := codec.NewLegacyAmino()
|
||||||
cryptocodec.RegisterCrypto(v036Codec)
|
cryptocodec.RegisterCrypto(v036Codec)
|
||||||
|
|
|
@ -3,11 +3,12 @@ package v038_test
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_36"
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
v036genaccounts "github.com/cosmos/cosmos-sdk/x/genaccounts/legacy/v0_36"
|
v036auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v036"
|
||||||
v038 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v0_38"
|
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"
|
"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"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
@ -138,5 +139,5 @@ func TestMigrate(t *testing.T) {
|
||||||
v036staking.ModuleName: genStakingState,
|
v036staking.ModuleName: genStakingState,
|
||||||
}
|
}
|
||||||
|
|
||||||
require.NotPanics(t, func() { v038.Migrate(genesis) })
|
require.NotPanics(t, func() { v038.Migrate(genesis, client.Context{}) })
|
||||||
}
|
}
|
|
@ -1,10 +1,11 @@
|
||||||
package v039
|
package v039
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
|
cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
|
||||||
v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_38"
|
v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v038"
|
||||||
v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_39"
|
v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v039"
|
||||||
"github.com/cosmos/cosmos-sdk/x/genutil/types"
|
"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
|
// NOTE: No actual migration occurs since the types do not change, but JSON
|
||||||
// serialization of accounts do change.
|
// serialization of accounts do change.
|
||||||
func Migrate(appState types.AppMap) types.AppMap {
|
func Migrate(appState types.AppMap, _ client.Context) types.AppMap {
|
||||||
v038Codec := codec.NewLegacyAmino()
|
v038Codec := codec.NewLegacyAmino()
|
||||||
cryptocodec.RegisterCrypto(v038Codec)
|
cryptocodec.RegisterCrypto(v038Codec)
|
||||||
v038auth.RegisterLegacyAminoCodec(v038Codec)
|
v038auth.RegisterLegacyAminoCodec(v038Codec)
|
|
@ -5,9 +5,10 @@ import (
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_38"
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v0_39"
|
v038auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v038"
|
||||||
v039 "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v0_39"
|
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"
|
"github.com/cosmos/cosmos-sdk/x/genutil/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -115,6 +116,6 @@ func TestMigrate(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var migrated types.AppMap
|
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]))
|
require.Equal(t, string(expectedGenAuthState), string(migrated[v039auth.ModuleName]))
|
||||||
}
|
}
|
|
@ -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
|
||||||
|
}
|
|
@ -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
|
|
||||||
}
|
|
|
@ -4,6 +4,8 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
||||||
"github.com/tendermint/tendermint/crypto"
|
"github.com/tendermint/tendermint/crypto"
|
||||||
|
|
||||||
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
|
@ -16,7 +18,7 @@ type (
|
||||||
// targeted one.
|
// targeted one.
|
||||||
//
|
//
|
||||||
// TODO: MigrationCallback should also return an error upon failure.
|
// 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 defines a mapping from a version to a MigrationCallback.
|
||||||
MigrationMap map[string]MigrationCallback
|
MigrationMap map[string]MigrationCallback
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
package v0_34
|
package v034
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
|
@ -1,7 +1,7 @@
|
||||||
package v0_36
|
package v036
|
||||||
|
|
||||||
import (
|
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
|
// Migrate accepts exported genesis state from v0.34 and migrates it to v0.36
|
|
@ -1,6 +1,6 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
package v0_36
|
package v036
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
@ -9,7 +9,7 @@ import (
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
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 (
|
const (
|
|
@ -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"`
|
||||||
|
}
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
|
@ -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))
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
package v040
|
||||||
|
|
||||||
|
const (
|
||||||
|
ModuleName = "slashing"
|
||||||
|
)
|
|
@ -1,6 +1,6 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
package v0_34
|
package v034
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
|
@ -1,9 +1,9 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
package v0_36
|
package v036
|
||||||
|
|
||||||
import (
|
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
|
// Migrate accepts exported genesis state from v0.34 and migrates it to v0.36
|
|
@ -1,6 +1,6 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
package v0_36
|
package v036
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
@ -9,7 +9,7 @@ import (
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec/legacy"
|
"github.com/cosmos/cosmos-sdk/codec/legacy"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
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 (
|
const (
|
|
@ -1,9 +1,9 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
package v0_38
|
package v038
|
||||||
|
|
||||||
import (
|
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
|
// Migrate accepts exported genesis state from v0.36 or v0.37 and migrates it to
|
|
@ -1,6 +1,6 @@
|
||||||
// DONTCOVER
|
// DONTCOVER
|
||||||
// nolint
|
// nolint
|
||||||
package v0_38
|
package v038
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
@ -9,8 +9,8 @@ import (
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec/legacy"
|
"github.com/cosmos/cosmos-sdk/codec/legacy"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
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"
|
||||||
v036staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v0_36"
|
v036staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v036"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
Loading…
Reference in New Issue