mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 15:57:58 +00:00 
			
		
		
		
	Add auction migration (#1220)
* add initial auction migration from Levi's work * reserve bid_duration field name as well * refactor auction specifc migration code to legacy v0_17 pkg * Add auction migration specific test. Delete v016 migration files. Add makefile target for running migration tests. Co-authored-by: galxy25 <levismschoen@gmail.com>
This commit is contained in:
		
							parent
							
								
									afdbc04e16
								
							
						
					
					
						commit
						bbb2235ba0
					
				
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -21,3 +21,6 @@ build
 | 
			
		||||
node_modules
 | 
			
		||||
docs/node_modules
 | 
			
		||||
docs/.vuepress/dist
 | 
			
		||||
 | 
			
		||||
# Ignore macOS file system metadata
 | 
			
		||||
.DS_Store
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								Makefile
									
									
									
									
									
								
							@ -251,6 +251,10 @@ test:
 | 
			
		||||
test-cli: build
 | 
			
		||||
	@go test ./cli_test -tags cli_test -v -p 4
 | 
			
		||||
 | 
			
		||||
# Run tests for migration cli command
 | 
			
		||||
test-migrate:
 | 
			
		||||
	@go test -v -count=1 ./migrate/...
 | 
			
		||||
 | 
			
		||||
# Kick start lots of sims on an AWS cluster.
 | 
			
		||||
# This submits an AWS Batch job to run a lot of sims, each within a docker image. Results are uploaded to S3
 | 
			
		||||
start-remote-sims:
 | 
			
		||||
 | 
			
		||||
@ -1,239 +0,0 @@
 | 
			
		||||
package v0_16
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/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"
 | 
			
		||||
	capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"
 | 
			
		||||
	v039crisis "github.com/cosmos/cosmos-sdk/x/crisis/legacy/v039"
 | 
			
		||||
	v040crisis "github.com/cosmos/cosmos-sdk/x/crisis/legacy/v040"
 | 
			
		||||
	v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v036"
 | 
			
		||||
	v038distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v038"
 | 
			
		||||
	v040distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v040"
 | 
			
		||||
	v038evidence "github.com/cosmos/cosmos-sdk/x/evidence/legacy/v038"
 | 
			
		||||
	v040evidence "github.com/cosmos/cosmos-sdk/x/evidence/legacy/v040"
 | 
			
		||||
	v039genutil "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v039"
 | 
			
		||||
	v040genutil "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v040"
 | 
			
		||||
	v043genutil "github.com/cosmos/cosmos-sdk/x/genutil/legacy/v043"
 | 
			
		||||
	genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
 | 
			
		||||
	v036gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v036"
 | 
			
		||||
	v040gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v040"
 | 
			
		||||
	v039mint "github.com/cosmos/cosmos-sdk/x/mint/legacy/v039"
 | 
			
		||||
	v040mint "github.com/cosmos/cosmos-sdk/x/mint/legacy/v040"
 | 
			
		||||
	v036params "github.com/cosmos/cosmos-sdk/x/params/legacy/v036"
 | 
			
		||||
	v039slashing "github.com/cosmos/cosmos-sdk/x/slashing/legacy/v039"
 | 
			
		||||
	v040slashing "github.com/cosmos/cosmos-sdk/x/slashing/legacy/v040"
 | 
			
		||||
	v038staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v038"
 | 
			
		||||
	v040staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v040"
 | 
			
		||||
	v038upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/legacy/v038"
 | 
			
		||||
 | 
			
		||||
	ibctransfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types"
 | 
			
		||||
	ibchost "github.com/cosmos/ibc-go/v3/modules/core/24-host"
 | 
			
		||||
	ibctypes "github.com/cosmos/ibc-go/v3/modules/core/types"
 | 
			
		||||
 | 
			
		||||
	v015kavadist "github.com/kava-labs/kava/x/kavadist/legacy/v0_15"
 | 
			
		||||
	v015validatorvesting "github.com/kava-labs/kava/x/validator-vesting/legacy/v0_15"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func migrateGenutil(oldGenState v039genutil.GenesisState) *genutiltypes.GenesisState {
 | 
			
		||||
	return &genutiltypes.GenesisState{
 | 
			
		||||
		GenTxs: oldGenState.GenTxs,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func MigrateCosmosAppState(appState genutiltypes.AppMap, clientCtx client.Context, genesisTime time.Time) genutiltypes.AppMap {
 | 
			
		||||
	appState = migrateV040(appState, clientCtx, genesisTime)
 | 
			
		||||
	appState = migrateV043(appState, clientCtx)
 | 
			
		||||
	appState = addIbcGenesisStates(appState, clientCtx)
 | 
			
		||||
	return appState
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func addIbcGenesisStates(appState genutiltypes.AppMap, clientCtx client.Context) genutiltypes.AppMap {
 | 
			
		||||
	appState[capabilitytypes.ModuleName] = clientCtx.Codec.MustMarshalJSON(capabilitytypes.DefaultGenesis())
 | 
			
		||||
	appState[ibchost.ModuleName] = clientCtx.Codec.MustMarshalJSON(ibctypes.DefaultGenesisState())
 | 
			
		||||
	appState[ibctransfertypes.ModuleName] = clientCtx.Codec.MustMarshalJSON(ibctransfertypes.DefaultGenesisState())
 | 
			
		||||
	return appState
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// migrateV043 migrates cosmos modules from v0.40 to a v0.43 genesis state.
 | 
			
		||||
func migrateV043(appState genutiltypes.AppMap, clientCtx client.Context) genutiltypes.AppMap {
 | 
			
		||||
	return v043genutil.Migrate(appState, clientCtx)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// migrateV040 migrates cosmos modules from v0.39 to a v0.40 genesis state.
 | 
			
		||||
// This is based on the genutil/legacy/v40 migration logic but adapted to handle custom types from the kava module.
 | 
			
		||||
func migrateV040(appState genutiltypes.AppMap, clientCtx client.Context, genesisTime time.Time) genutiltypes.AppMap {
 | 
			
		||||
	setConfigIfUnsealed()
 | 
			
		||||
	v039Codec := codec.NewLegacyAmino()
 | 
			
		||||
	v039auth.RegisterLegacyAminoCodec(v039Codec)
 | 
			
		||||
	v036gov.RegisterLegacyAminoCodec(v039Codec)
 | 
			
		||||
	v036distr.RegisterLegacyAminoCodec(v039Codec)
 | 
			
		||||
	v036params.RegisterLegacyAminoCodec(v039Codec)
 | 
			
		||||
	v038upgrade.RegisterLegacyAminoCodec(v039Codec)
 | 
			
		||||
	v015kavadist.RegisterLegacyAminoCodec(v039Codec)
 | 
			
		||||
	v015validatorvesting.RegisterLegacyAminoCodec(v039Codec)
 | 
			
		||||
	v039Codec.RegisterInterface((*v038evidence.Evidence)(nil), nil)
 | 
			
		||||
 | 
			
		||||
	v040Codec := clientCtx.Codec
 | 
			
		||||
 | 
			
		||||
	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)
 | 
			
		||||
 | 
			
		||||
		// Run our custom auth v40 migration on the v039 auth gen state
 | 
			
		||||
		appState[v040auth.ModuleName] = v040Codec.MustMarshalJSON(MigrateAuthV040(authGenState, genesisTime))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/crisis.
 | 
			
		||||
	if appState[v039crisis.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var crisisGenState v039crisis.GenesisState
 | 
			
		||||
		v039Codec.MustUnmarshalJSON(appState[v039crisis.ModuleName], &crisisGenState)
 | 
			
		||||
 | 
			
		||||
		// delete deprecated x/crisis genesis state
 | 
			
		||||
		delete(appState, v039crisis.ModuleName)
 | 
			
		||||
 | 
			
		||||
		// Migrate relative source genesis application state and marshal it into
 | 
			
		||||
		// the respective key.
 | 
			
		||||
		appState[v040crisis.ModuleName] = v040Codec.MustMarshalJSON(v040crisis.Migrate(crisisGenState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/distribution.
 | 
			
		||||
	if appState[v038distr.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var distributionGenState v038distr.GenesisState
 | 
			
		||||
		v039Codec.MustUnmarshalJSON(appState[v038distr.ModuleName], &distributionGenState)
 | 
			
		||||
 | 
			
		||||
		// delete deprecated x/distribution genesis state
 | 
			
		||||
		delete(appState, v038distr.ModuleName)
 | 
			
		||||
 | 
			
		||||
		// Migrate relative source genesis application state and marshal it into
 | 
			
		||||
		// the respective key.
 | 
			
		||||
		appState[v040distr.ModuleName] = v040Codec.MustMarshalJSON(v040distr.Migrate(distributionGenState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/evidence.
 | 
			
		||||
	if appState[v038evidence.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var evidenceGenState v038evidence.GenesisState
 | 
			
		||||
		v039Codec.MustUnmarshalJSON(appState[v038evidence.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))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/gov.
 | 
			
		||||
	if appState[v036gov.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var govGenState v036gov.GenesisState
 | 
			
		||||
		v039Codec.MustUnmarshalJSON(appState[v036gov.ModuleName], &govGenState)
 | 
			
		||||
 | 
			
		||||
		// delete deprecated x/gov genesis state
 | 
			
		||||
		delete(appState, v036gov.ModuleName)
 | 
			
		||||
 | 
			
		||||
		// Run our custom gov v40 migration on the v039 gov gen state
 | 
			
		||||
		appState[v040gov.ModuleName] = v040Codec.MustMarshalJSON(MigrateGovV040(govGenState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/mint.
 | 
			
		||||
	if appState[v039mint.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var mintGenState v039mint.GenesisState
 | 
			
		||||
		v039Codec.MustUnmarshalJSON(appState[v039mint.ModuleName], &mintGenState)
 | 
			
		||||
 | 
			
		||||
		// delete deprecated x/mint genesis state
 | 
			
		||||
		delete(appState, v039mint.ModuleName)
 | 
			
		||||
 | 
			
		||||
		// Migrate relative source genesis application state and marshal it into
 | 
			
		||||
		// the respective key.
 | 
			
		||||
		appState[v040mint.ModuleName] = v040Codec.MustMarshalJSON(v040mint.Migrate(mintGenState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 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/slashing 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))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/staking.
 | 
			
		||||
	if appState[v038staking.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var stakingGenState v038staking.GenesisState
 | 
			
		||||
		v039Codec.MustUnmarshalJSON(appState[v038staking.ModuleName], &stakingGenState)
 | 
			
		||||
 | 
			
		||||
		// Update historical entries to 10000
 | 
			
		||||
		stakingGenState.Params.HistoricalEntries = 10000
 | 
			
		||||
 | 
			
		||||
		// delete deprecated x/staking genesis state
 | 
			
		||||
		delete(appState, v038staking.ModuleName)
 | 
			
		||||
 | 
			
		||||
		// Migrate relative source genesis application state and marshal it into
 | 
			
		||||
		// the respective key.
 | 
			
		||||
		appState[v040staking.ModuleName] = v040Codec.MustMarshalJSON(v040staking.Migrate(stakingGenState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/genutil
 | 
			
		||||
	if appState[v039genutil.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var genutilGenState v039genutil.GenesisState
 | 
			
		||||
		v039Codec.MustUnmarshalJSON(appState[v039genutil.ModuleName], &genutilGenState)
 | 
			
		||||
 | 
			
		||||
		// delete deprecated x/staking genesis state
 | 
			
		||||
		delete(appState, v039genutil.ModuleName)
 | 
			
		||||
 | 
			
		||||
		// Migrate relative source genesis application state and marshal it into
 | 
			
		||||
		// the respective key.
 | 
			
		||||
		appState[v040genutil.ModuleName] = v040Codec.MustMarshalJSON(migrateGenutil(genutilGenState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return appState
 | 
			
		||||
}
 | 
			
		||||
@ -1,202 +0,0 @@
 | 
			
		||||
/**
 | 
			
		||||
 * The v0_16 x/auth migration logic is adapted from
 | 
			
		||||
 * https://github.com/cosmos/cosmos-sdk/blob/b75c29fc15d3320ec0c7596dbd7c787c48dccad8/x/auth/legacy/v040/migrate.go
 | 
			
		||||
 *
 | 
			
		||||
 * The original migration code is changed here to support the following custom Account from the kava modules.
 | 
			
		||||
 * - `x/validator-vesting/ValidatorVestingAccount`
 | 
			
		||||
 */
 | 
			
		||||
package v0_16
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	codectypes "github.com/cosmos/cosmos-sdk/codec/types"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
 | 
			
		||||
	v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v039"
 | 
			
		||||
	v040auth "github.com/cosmos/cosmos-sdk/x/auth/types"
 | 
			
		||||
	v040vesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types"
 | 
			
		||||
 | 
			
		||||
	v015validatorvesting "github.com/kava-labs/kava/x/validator-vesting/legacy/v0_15"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// convertBaseAccount converts a 0.39 BaseAccount to a 0.40 BaseAccount.
 | 
			
		||||
func convertBaseAccount(old *v039auth.BaseAccount) *v040auth.BaseAccount {
 | 
			
		||||
	var any *codectypes.Any
 | 
			
		||||
 | 
			
		||||
	if old.PubKey != nil {
 | 
			
		||||
		var err error
 | 
			
		||||
		any, err = codectypes.NewAnyWithValue(old.PubKey)
 | 
			
		||||
		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,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ResetPeriodicVestingAccount resets a periodic vesting account to a new start
 | 
			
		||||
// time.  The account is modified in place, and vesting periods before the new
 | 
			
		||||
// start time are removed from the account.
 | 
			
		||||
func ResetPeriodicVestingAccount(vacc *v040vesting.PeriodicVestingAccount, startTime time.Time) {
 | 
			
		||||
	currentPeriod := vacc.StartTime
 | 
			
		||||
 | 
			
		||||
	newOriginalVesting := sdk.Coins{}
 | 
			
		||||
	newStartTime := startTime.Unix()
 | 
			
		||||
	newPeriods := v040vesting.Periods{}
 | 
			
		||||
 | 
			
		||||
	for _, period := range vacc.VestingPeriods {
 | 
			
		||||
		currentPeriod = currentPeriod + period.Length
 | 
			
		||||
 | 
			
		||||
		// Periods less than the newStartTime are still vesting,
 | 
			
		||||
		// so adjust their length and add them to the newPeriods
 | 
			
		||||
		if newStartTime < currentPeriod {
 | 
			
		||||
			// adjust the length of the first vesting period
 | 
			
		||||
			// to be relative to the new start time
 | 
			
		||||
			if len(newPeriods) == 0 {
 | 
			
		||||
				period.Length = currentPeriod - newStartTime
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			newOriginalVesting = newOriginalVesting.Add(period.Amount...)
 | 
			
		||||
			newPeriods = append(newPeriods, period)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If the new original vesting amount is less than the delegated vesting amount, set delegated vesting
 | 
			
		||||
	// to the new original vesting amount, and add the difference to the delegated free amount
 | 
			
		||||
	for _, delegatedVestingCoin := range vacc.DelegatedVesting {
 | 
			
		||||
		newDelegatedVestingCoin := sdk.NewCoin(delegatedVestingCoin.Denom, sdk.MinInt(delegatedVestingCoin.Amount, newOriginalVesting.AmountOf(delegatedVestingCoin.Denom)))
 | 
			
		||||
		delegationAdjustment := delegatedVestingCoin.Sub(newDelegatedVestingCoin)
 | 
			
		||||
 | 
			
		||||
		if !delegationAdjustment.IsZero() {
 | 
			
		||||
			vacc.DelegatedVesting = vacc.DelegatedVesting.Sub(sdk.NewCoins(delegationAdjustment))
 | 
			
		||||
			vacc.DelegatedFree = vacc.DelegatedFree.Add(delegationAdjustment)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// update vesting account
 | 
			
		||||
	vacc.StartTime = newStartTime
 | 
			
		||||
	vacc.OriginalVesting = newOriginalVesting
 | 
			
		||||
	vacc.VestingPeriods = newPeriods
 | 
			
		||||
 | 
			
		||||
	// ensure end time is >= start time
 | 
			
		||||
	if vacc.StartTime >= vacc.EndTime {
 | 
			
		||||
		vacc.EndTime = vacc.StartTime
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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.
 | 
			
		||||
// - Re-encode in v0.40 GenesisState.
 | 
			
		||||
func MigrateAuthV040(authGenState v039auth.GenesisState, genesisTime time.Time) *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,
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				vacc := v040vesting.PeriodicVestingAccount{
 | 
			
		||||
					BaseVestingAccount: convertBaseVestingAccount(v039Account.BaseVestingAccount),
 | 
			
		||||
					StartTime:          v039Account.StartTime,
 | 
			
		||||
					VestingPeriods:     vestingPeriods,
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				ResetPeriodicVestingAccount(&vacc, genesisTime)
 | 
			
		||||
 | 
			
		||||
				// If periodic vesting account has zero periods, convert back
 | 
			
		||||
				// to a base account
 | 
			
		||||
				if genesisTime.Unix() >= vacc.EndTime {
 | 
			
		||||
					v040Accounts[i] = vacc.BaseVestingAccount.BaseAccount
 | 
			
		||||
				} else {
 | 
			
		||||
					v040Accounts[i] = &vacc
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case *v015validatorvesting.ValidatorVestingAccount:
 | 
			
		||||
			{
 | 
			
		||||
				// Convert validator vesting accounts to base accounts since no more vesting is needed
 | 
			
		||||
				v040Accounts[i] = convertBaseAccount(v039Account.BaseAccount)
 | 
			
		||||
			}
 | 
			
		||||
		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,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -1,237 +0,0 @@
 | 
			
		||||
/**
 | 
			
		||||
 * The v0_16 x/gov migration logic is adapted from
 | 
			
		||||
 * https://github.com/cosmos/cosmos-sdk/blob/b75c29fc15d3320ec0c7596dbd7c787c48dccad8/x/gov/legacy/v040/migrate.go
 | 
			
		||||
 *
 | 
			
		||||
 * The original migration code is changed here to support the following custom proposals from the kava modules.
 | 
			
		||||
 * - `x/kavadist/CommunityPoolMultiSpendProposal`
 | 
			
		||||
 *
 | 
			
		||||
 * Note: The committee modules also adds the `CommitteeChangeProposal` and `CommitteeDeleteProposal`.
 | 
			
		||||
 * However, we should not have any proposals of these type on mainet so we should be good to ignore them here.
 | 
			
		||||
 */
 | 
			
		||||
package v0_16
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	proto "github.com/gogo/protobuf/proto"
 | 
			
		||||
 | 
			
		||||
	codectypes "github.com/cosmos/cosmos-sdk/codec/types"
 | 
			
		||||
	v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v036"
 | 
			
		||||
	v040distr "github.com/cosmos/cosmos-sdk/x/distribution/types"
 | 
			
		||||
	v034gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v034"
 | 
			
		||||
	v036gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v036"
 | 
			
		||||
	v040gov "github.com/cosmos/cosmos-sdk/x/gov/types"
 | 
			
		||||
	v036params "github.com/cosmos/cosmos-sdk/x/params/legacy/v036"
 | 
			
		||||
	v040params "github.com/cosmos/cosmos-sdk/x/params/types/proposal"
 | 
			
		||||
	v038upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/legacy/v038"
 | 
			
		||||
	v040upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/types"
 | 
			
		||||
 | 
			
		||||
	v015kavadist "github.com/kava-labs/kava/x/kavadist/legacy/v0_15"
 | 
			
		||||
	v016kavadist "github.com/kava-labs/kava/x/kavadist/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func migrateVoteOption(oldVoteOption v034gov.VoteOption) v040gov.VoteOption {
 | 
			
		||||
	switch oldVoteOption {
 | 
			
		||||
	case v034gov.OptionEmpty:
 | 
			
		||||
		return v040gov.OptionEmpty
 | 
			
		||||
 | 
			
		||||
	case v034gov.OptionYes:
 | 
			
		||||
		return v040gov.OptionYes
 | 
			
		||||
 | 
			
		||||
	case v034gov.OptionAbstain:
 | 
			
		||||
		return v040gov.OptionAbstain
 | 
			
		||||
 | 
			
		||||
	case v034gov.OptionNo:
 | 
			
		||||
		return v040gov.OptionNo
 | 
			
		||||
 | 
			
		||||
	case v034gov.OptionNoWithVeto:
 | 
			
		||||
		return v040gov.OptionNoWithVeto
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		panic(fmt.Errorf("'%s' is not a valid vote option", oldVoteOption))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func migrateProposalStatus(oldProposalStatus v034gov.ProposalStatus) v040gov.ProposalStatus {
 | 
			
		||||
	switch oldProposalStatus {
 | 
			
		||||
 | 
			
		||||
	case v034gov.StatusNil:
 | 
			
		||||
		return v040gov.StatusNil
 | 
			
		||||
 | 
			
		||||
	case v034gov.StatusDepositPeriod:
 | 
			
		||||
		return v040gov.StatusDepositPeriod
 | 
			
		||||
 | 
			
		||||
	case v034gov.StatusVotingPeriod:
 | 
			
		||||
		return v040gov.StatusVotingPeriod
 | 
			
		||||
 | 
			
		||||
	case v034gov.StatusPassed:
 | 
			
		||||
		return v040gov.StatusPassed
 | 
			
		||||
 | 
			
		||||
	case v034gov.StatusRejected:
 | 
			
		||||
		return v040gov.StatusRejected
 | 
			
		||||
 | 
			
		||||
	case v034gov.StatusFailed:
 | 
			
		||||
		return v040gov.StatusFailed
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		panic(fmt.Errorf("'%s' is not a valid proposal status", oldProposalStatus))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func migrateContent(oldContent v036gov.Content) *codectypes.Any {
 | 
			
		||||
	var protoProposal proto.Message
 | 
			
		||||
 | 
			
		||||
	switch oldContent := oldContent.(type) {
 | 
			
		||||
	case v036gov.TextProposal:
 | 
			
		||||
		{
 | 
			
		||||
			protoProposal = &v040gov.TextProposal{
 | 
			
		||||
				Title:       oldContent.Title,
 | 
			
		||||
				Description: oldContent.Description,
 | 
			
		||||
			}
 | 
			
		||||
			// Convert the content into Any.
 | 
			
		||||
			contentAny, err := codectypes.NewAnyWithValue(protoProposal)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				panic(err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return contentAny
 | 
			
		||||
		}
 | 
			
		||||
	case v036distr.CommunityPoolSpendProposal:
 | 
			
		||||
		{
 | 
			
		||||
			protoProposal = &v040distr.CommunityPoolSpendProposal{
 | 
			
		||||
				Title:       oldContent.Title,
 | 
			
		||||
				Description: oldContent.Description,
 | 
			
		||||
				Recipient:   oldContent.Recipient.String(),
 | 
			
		||||
				Amount:      oldContent.Amount,
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case v038upgrade.CancelSoftwareUpgradeProposal:
 | 
			
		||||
		{
 | 
			
		||||
			protoProposal = &v040upgrade.CancelSoftwareUpgradeProposal{
 | 
			
		||||
				Description: oldContent.Description,
 | 
			
		||||
				Title:       oldContent.Title,
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case v038upgrade.SoftwareUpgradeProposal:
 | 
			
		||||
		{
 | 
			
		||||
			protoProposal = &v040upgrade.SoftwareUpgradeProposal{
 | 
			
		||||
				Description: oldContent.Description,
 | 
			
		||||
				Title:       oldContent.Title,
 | 
			
		||||
				Plan: v040upgrade.Plan{
 | 
			
		||||
					Name:   oldContent.Plan.Name,
 | 
			
		||||
					Height: oldContent.Plan.Height,
 | 
			
		||||
					Info:   oldContent.Plan.Info,
 | 
			
		||||
				},
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case v036params.ParameterChangeProposal:
 | 
			
		||||
		{
 | 
			
		||||
			newChanges := make([]v040params.ParamChange, len(oldContent.Changes))
 | 
			
		||||
			for i, oldChange := range oldContent.Changes {
 | 
			
		||||
				newChanges[i] = v040params.ParamChange{
 | 
			
		||||
					Subspace: oldChange.Subspace,
 | 
			
		||||
					Key:      oldChange.Key,
 | 
			
		||||
					Value:    oldChange.Value,
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			protoProposal = &v040params.ParameterChangeProposal{
 | 
			
		||||
				Description: oldContent.Description,
 | 
			
		||||
				Title:       oldContent.Title,
 | 
			
		||||
				Changes:     newChanges,
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case v015kavadist.CommunityPoolMultiSpendProposal:
 | 
			
		||||
		{
 | 
			
		||||
			newRecipients := make([]v016kavadist.MultiSpendRecipient, len(oldContent.RecipientList))
 | 
			
		||||
			for i, recipient := range oldContent.RecipientList {
 | 
			
		||||
				newRecipients[i] = v016kavadist.MultiSpendRecipient{
 | 
			
		||||
					Address: recipient.Address.String(),
 | 
			
		||||
					Amount:  recipient.Amount,
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			protoProposal = &v016kavadist.CommunityPoolMultiSpendProposal{
 | 
			
		||||
				Description:   oldContent.Description,
 | 
			
		||||
				Title:         oldContent.Title,
 | 
			
		||||
				RecipientList: newRecipients,
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		panic(fmt.Errorf("%T is not a valid proposal content type", oldContent))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Convert the content into Any.
 | 
			
		||||
	contentAny, err := codectypes.NewAnyWithValue(protoProposal)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return contentAny
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MigrateGovV036 accepts exported v0.36 x/gov genesis state and migrates it to
 | 
			
		||||
// v0.40 x/gov genesis state. The migration includes:
 | 
			
		||||
//
 | 
			
		||||
// - Convert vote option & proposal status from byte to enum.
 | 
			
		||||
// - Migrate proposal content to Any.
 | 
			
		||||
// - Convert addresses from bytes to bech32 strings.
 | 
			
		||||
// - Re-encode in v0.40 GenesisState.
 | 
			
		||||
func MigrateGovV040(oldGovState v036gov.GenesisState) *v040gov.GenesisState {
 | 
			
		||||
	newDeposits := make([]v040gov.Deposit, len(oldGovState.Deposits))
 | 
			
		||||
	for i, oldDeposit := range oldGovState.Deposits {
 | 
			
		||||
		newDeposits[i] = v040gov.Deposit{
 | 
			
		||||
			ProposalId: oldDeposit.ProposalID,
 | 
			
		||||
			Depositor:  oldDeposit.Depositor.String(),
 | 
			
		||||
			Amount:     oldDeposit.Amount,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newVotes := make([]v040gov.Vote, len(oldGovState.Votes))
 | 
			
		||||
	for i, oldVote := range oldGovState.Votes {
 | 
			
		||||
		newVotes[i] = v040gov.Vote{
 | 
			
		||||
			ProposalId: oldVote.ProposalID,
 | 
			
		||||
			Voter:      oldVote.Voter.String(),
 | 
			
		||||
			Option:     migrateVoteOption(oldVote.Option),
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newProposals := make([]v040gov.Proposal, len(oldGovState.Proposals))
 | 
			
		||||
	for i, oldProposal := range oldGovState.Proposals {
 | 
			
		||||
		newProposals[i] = v040gov.Proposal{
 | 
			
		||||
			ProposalId: oldProposal.ProposalID,
 | 
			
		||||
			Content:    migrateContent(oldProposal.Content),
 | 
			
		||||
			Status:     migrateProposalStatus(oldProposal.Status),
 | 
			
		||||
			FinalTallyResult: v040gov.TallyResult{
 | 
			
		||||
				Yes:        oldProposal.FinalTallyResult.Yes,
 | 
			
		||||
				Abstain:    oldProposal.FinalTallyResult.Abstain,
 | 
			
		||||
				No:         oldProposal.FinalTallyResult.No,
 | 
			
		||||
				NoWithVeto: oldProposal.FinalTallyResult.NoWithVeto,
 | 
			
		||||
			},
 | 
			
		||||
			SubmitTime:      oldProposal.SubmitTime,
 | 
			
		||||
			DepositEndTime:  oldProposal.DepositEndTime,
 | 
			
		||||
			TotalDeposit:    oldProposal.TotalDeposit,
 | 
			
		||||
			VotingStartTime: oldProposal.VotingStartTime,
 | 
			
		||||
			VotingEndTime:   oldProposal.VotingEndTime,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &v040gov.GenesisState{
 | 
			
		||||
		StartingProposalId: oldGovState.StartingProposalID,
 | 
			
		||||
		Deposits:           newDeposits,
 | 
			
		||||
		Votes:              newVotes,
 | 
			
		||||
		Proposals:          newProposals,
 | 
			
		||||
		DepositParams: v040gov.DepositParams{
 | 
			
		||||
			MinDeposit:       oldGovState.DepositParams.MinDeposit,
 | 
			
		||||
			MaxDepositPeriod: oldGovState.DepositParams.MaxDepositPeriod,
 | 
			
		||||
		},
 | 
			
		||||
		VotingParams: v040gov.VotingParams{
 | 
			
		||||
			VotingPeriod: oldGovState.VotingParams.VotingPeriod,
 | 
			
		||||
		},
 | 
			
		||||
		TallyParams: v040gov.TallyParams{
 | 
			
		||||
			Quorum:        oldGovState.TallyParams.Quorum,
 | 
			
		||||
			Threshold:     oldGovState.TallyParams.Threshold,
 | 
			
		||||
			VetoThreshold: oldGovState.TallyParams.Veto,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -1,93 +0,0 @@
 | 
			
		||||
package v0_16
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client"
 | 
			
		||||
	genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Periodic vesting account periods will change depending on the genesis time.
 | 
			
		||||
// This test genesis time is used to be able to change the actual genesis time
 | 
			
		||||
// without breaking the tests.
 | 
			
		||||
var TestGenesisTime = time.Date(2021, 11, 30, 15, 0, 0, 0, time.UTC)
 | 
			
		||||
 | 
			
		||||
func TestCosmosMigrate_Gov(t *testing.T) {
 | 
			
		||||
	// The gov json contains a gov app state with 3 different proposals.
 | 
			
		||||
	// Two of the proposals are from cosmos while the 3rd one is kavadist/CommunityPoolMultiSpendProposal.
 | 
			
		||||
	original := getTestDataJSON("appstate-gov-v15.json")
 | 
			
		||||
	expected := getTestDataJSON("appstate-gov-v16.json")
 | 
			
		||||
	actual := mustMigrateCosmosAppStateJSON(original)
 | 
			
		||||
	assert.JSONEq(t, expected, actual)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCosmosMigrate_Bank(t *testing.T) {
 | 
			
		||||
	// The bank json tests migrating the bank, auth, and supply modules
 | 
			
		||||
	// The json contains the kava ValidatorVestingAccount account and tests for
 | 
			
		||||
	// both the correct proto migration & moving account coins and supply to the bank module.
 | 
			
		||||
	original := getTestDataJSON("appstate-bank-v15.json")
 | 
			
		||||
	expected := getTestDataJSON("appstate-bank-v16.json")
 | 
			
		||||
	actual := mustMigrateCosmosAppStateJSON(original)
 | 
			
		||||
	assert.JSONEq(t, expected, actual)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCosmosMigrate_Distribution(t *testing.T) {
 | 
			
		||||
	original := getTestDataJSON("appstate-distribution-v15.json")
 | 
			
		||||
	expected := getTestDataJSON("appstate-distribution-v16.json")
 | 
			
		||||
	actual := mustMigrateCosmosAppStateJSON(original)
 | 
			
		||||
	assert.JSONEq(t, expected, actual)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCosmosMigrate_Staking(t *testing.T) {
 | 
			
		||||
	original := getTestDataJSON("appstate-staking-v15.json")
 | 
			
		||||
	expected := getTestDataJSON("appstate-staking-v16.json")
 | 
			
		||||
	actual := mustMigrateCosmosAppStateJSON(original)
 | 
			
		||||
	assert.JSONEq(t, expected, actual)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCosmosMigrate_Modules(t *testing.T) {
 | 
			
		||||
	original := getTestDataJSON("appstate-cosmos-v15.json")
 | 
			
		||||
	expected := getTestDataJSON("appstate-cosmos-v16.json")
 | 
			
		||||
	actual := mustMigrateCosmosAppStateJSON(original)
 | 
			
		||||
	assert.JSONEq(t, expected, actual)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// mustMigrateCosmosAppStateJSON migrate v15 app state json to v16
 | 
			
		||||
func mustMigrateCosmosAppStateJSON(appStateJson string) string {
 | 
			
		||||
	var appState genutiltypes.AppMap
 | 
			
		||||
	if err := json.Unmarshal([]byte(appStateJson), &appState); err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	ctx := newClientContext()
 | 
			
		||||
	appState = migrateV040(appState, ctx, TestGenesisTime)
 | 
			
		||||
	appState = migrateV043(appState, ctx)
 | 
			
		||||
	actual, err := json.Marshal(appState)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	return string(actual)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getTestDataJSON(filename string) string {
 | 
			
		||||
	file := filepath.Join("testdata", filename)
 | 
			
		||||
	data, err := ioutil.ReadFile(file)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	return string(data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newClientContext() client.Context {
 | 
			
		||||
	config := app.MakeEncodingConfig()
 | 
			
		||||
	return client.Context{}.
 | 
			
		||||
		WithCodec(config.Marshaler).
 | 
			
		||||
		WithLegacyAmino(config.Amino).
 | 
			
		||||
		WithInterfaceRegistry(config.InterfaceRegistry)
 | 
			
		||||
}
 | 
			
		||||
@ -1,155 +0,0 @@
 | 
			
		||||
package v0_16
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
			
		||||
 | 
			
		||||
	v036distr "github.com/cosmos/cosmos-sdk/x/distribution/legacy/v036"
 | 
			
		||||
	genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
 | 
			
		||||
	v036params "github.com/cosmos/cosmos-sdk/x/params/legacy/v036"
 | 
			
		||||
	v038upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/legacy/v038"
 | 
			
		||||
 | 
			
		||||
	v015auction "github.com/kava-labs/kava/x/auction/legacy/v0_15"
 | 
			
		||||
	v016auction "github.com/kava-labs/kava/x/auction/legacy/v0_16"
 | 
			
		||||
	v015bep3 "github.com/kava-labs/kava/x/bep3/legacy/v0_15"
 | 
			
		||||
	v016bep3 "github.com/kava-labs/kava/x/bep3/legacy/v0_16"
 | 
			
		||||
	v015cdp "github.com/kava-labs/kava/x/cdp/legacy/v0_15"
 | 
			
		||||
	v016cdp "github.com/kava-labs/kava/x/cdp/legacy/v0_16"
 | 
			
		||||
	v015committee "github.com/kava-labs/kava/x/committee/legacy/v0_15"
 | 
			
		||||
	v016committee "github.com/kava-labs/kava/x/committee/legacy/v0_16"
 | 
			
		||||
	v015hard "github.com/kava-labs/kava/x/hard/legacy/v0_15"
 | 
			
		||||
	v016hard "github.com/kava-labs/kava/x/hard/legacy/v0_16"
 | 
			
		||||
	v015incentive "github.com/kava-labs/kava/x/incentive/legacy/v0_15"
 | 
			
		||||
	v016incentive "github.com/kava-labs/kava/x/incentive/legacy/v0_16"
 | 
			
		||||
	v015issuance "github.com/kava-labs/kava/x/issuance/legacy/v0_15"
 | 
			
		||||
	v016issuance "github.com/kava-labs/kava/x/issuance/legacy/v0_16"
 | 
			
		||||
	v015kavadist "github.com/kava-labs/kava/x/kavadist/legacy/v0_15"
 | 
			
		||||
	v016kavadist "github.com/kava-labs/kava/x/kavadist/legacy/v0_16"
 | 
			
		||||
	v015pricefeed "github.com/kava-labs/kava/x/pricefeed/legacy/v0_15"
 | 
			
		||||
	v016pricefeed "github.com/kava-labs/kava/x/pricefeed/legacy/v0_16"
 | 
			
		||||
	v015swap "github.com/kava-labs/kava/x/swap/legacy/v0_15"
 | 
			
		||||
	v016swap "github.com/kava-labs/kava/x/swap/legacy/v0_16"
 | 
			
		||||
	v015validatorvesting "github.com/kava-labs/kava/x/validator-vesting/legacy/v0_15"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func migrateKavaAppState(appState genutiltypes.AppMap, clientCtx client.Context) {
 | 
			
		||||
	v15Codec := codec.NewLegacyAmino()
 | 
			
		||||
	v015auction.RegisterLegacyAminoCodec(v15Codec)
 | 
			
		||||
	v015committee.RegisterLegacyAminoCodec(v15Codec)
 | 
			
		||||
	v015kavadist.RegisterLegacyAminoCodec(v15Codec)
 | 
			
		||||
	v036distr.RegisterLegacyAminoCodec(v15Codec)
 | 
			
		||||
	v038upgrade.RegisterLegacyAminoCodec(v15Codec)
 | 
			
		||||
	v036params.RegisterLegacyAminoCodec(v15Codec)
 | 
			
		||||
 | 
			
		||||
	v16Codec := clientCtx.Codec
 | 
			
		||||
 | 
			
		||||
	// Migrate x/auction
 | 
			
		||||
	if appState[v015auction.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var genState v015auction.GenesisState
 | 
			
		||||
		v15Codec.MustUnmarshalJSON(appState[v015auction.ModuleName], &genState)
 | 
			
		||||
 | 
			
		||||
		// replace migrated genstate with previous genstate
 | 
			
		||||
		appState[v015auction.ModuleName] = v16Codec.MustMarshalJSON(v016auction.Migrate(genState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/committee
 | 
			
		||||
	if appState[v015committee.ModuleName] != nil {
 | 
			
		||||
		if appState[v015pricefeed.ModuleName] == nil {
 | 
			
		||||
			panic("pricefeed app state is missing, committee migration requires pricefeed app state")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var pricefeedGenState v015pricefeed.GenesisState
 | 
			
		||||
		v15Codec.MustUnmarshalJSON(appState[v015pricefeed.ModuleName], &pricefeedGenState)
 | 
			
		||||
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var genState v015committee.GenesisState
 | 
			
		||||
		v15Codec.MustUnmarshalJSON(appState[v015committee.ModuleName], &genState)
 | 
			
		||||
 | 
			
		||||
		// replace migrated genstate with previous genstate
 | 
			
		||||
		appState[v015committee.ModuleName] = v16Codec.MustMarshalJSON(v016committee.Migrate(genState, pricefeedGenState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/bep3
 | 
			
		||||
	if appState[v015bep3.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var genState v015bep3.GenesisState
 | 
			
		||||
		v15Codec.MustUnmarshalJSON(appState[v015bep3.ModuleName], &genState)
 | 
			
		||||
 | 
			
		||||
		// replace migrated genstate with previous genstate
 | 
			
		||||
		appState[v015bep3.ModuleName] = v16Codec.MustMarshalJSON(v016bep3.Migrate(genState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/swap
 | 
			
		||||
	if appState[v015swap.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var genState v015swap.GenesisState
 | 
			
		||||
		v15Codec.MustUnmarshalJSON(appState[v015swap.ModuleName], &genState)
 | 
			
		||||
 | 
			
		||||
		// replace migrated genstate with previous genstate
 | 
			
		||||
		appState[v015swap.ModuleName] = v16Codec.MustMarshalJSON(v016swap.Migrate(genState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/kavadist
 | 
			
		||||
	if appState[v015kavadist.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var genState v015kavadist.GenesisState
 | 
			
		||||
		v15Codec.MustUnmarshalJSON(appState[v015kavadist.ModuleName], &genState)
 | 
			
		||||
 | 
			
		||||
		// replace migrated genstate with previous genstate
 | 
			
		||||
		appState[v015kavadist.ModuleName] = v16Codec.MustMarshalJSON(v016kavadist.Migrate(genState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/cdp
 | 
			
		||||
	if appState[v015cdp.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var genState v015cdp.GenesisState
 | 
			
		||||
		v15Codec.MustUnmarshalJSON(appState[v015cdp.ModuleName], &genState)
 | 
			
		||||
 | 
			
		||||
		// replace migrated genstate with previous genstate
 | 
			
		||||
		appState[v015cdp.ModuleName] = v16Codec.MustMarshalJSON(v016cdp.Migrate(genState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/issuance
 | 
			
		||||
	if appState[v015issuance.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var genState v015issuance.GenesisState
 | 
			
		||||
		v15Codec.MustUnmarshalJSON(appState[v015issuance.ModuleName], &genState)
 | 
			
		||||
 | 
			
		||||
		// replace migrated genstate with previous genstate
 | 
			
		||||
		appState[v015issuance.ModuleName] = v16Codec.MustMarshalJSON(v016issuance.Migrate(genState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/pricefeed
 | 
			
		||||
	if appState[v015pricefeed.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var genState v015pricefeed.GenesisState
 | 
			
		||||
		v15Codec.MustUnmarshalJSON(appState[v015pricefeed.ModuleName], &genState)
 | 
			
		||||
 | 
			
		||||
		// replace migrated genstate with previous genstate
 | 
			
		||||
		appState[v015pricefeed.ModuleName] = v16Codec.MustMarshalJSON(v016pricefeed.Migrate(genState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/hard
 | 
			
		||||
	if appState[v015hard.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var genState v015hard.GenesisState
 | 
			
		||||
		v15Codec.MustUnmarshalJSON(appState[v015hard.ModuleName], &genState)
 | 
			
		||||
 | 
			
		||||
		// replace migrated genstate with previous genstate
 | 
			
		||||
		appState[v015hard.ModuleName] = v16Codec.MustMarshalJSON(v016hard.Migrate(genState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Migrate x/incentive
 | 
			
		||||
	if appState[v015incentive.ModuleName] != nil {
 | 
			
		||||
		// unmarshal relative source genesis application state
 | 
			
		||||
		var genState v015incentive.GenesisState
 | 
			
		||||
		v15Codec.MustUnmarshalJSON(appState[v015incentive.ModuleName], &genState)
 | 
			
		||||
 | 
			
		||||
		// replace migrated genstate with previous genstate
 | 
			
		||||
		appState[v015incentive.ModuleName] = v16Codec.MustMarshalJSON(v016incentive.Migrate(genState))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Remove x/validator-vesting
 | 
			
		||||
	delete(appState, v015validatorvesting.ModuleName)
 | 
			
		||||
}
 | 
			
		||||
@ -1,485 +0,0 @@
 | 
			
		||||
package legacyaccounts
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec/legacy"
 | 
			
		||||
	cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
 | 
			
		||||
	cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	v034auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v034"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// legacy implemtation of accounts that allows checking the spendable balance for any account,
 | 
			
		||||
// in addition support periodic vesting account methods
 | 
			
		||||
type Account interface {
 | 
			
		||||
	GetAddress() sdk.AccAddress
 | 
			
		||||
	GetCoins() sdk.Coins
 | 
			
		||||
	SpendableCoins(blockTime time.Time) sdk.Coins
 | 
			
		||||
}
 | 
			
		||||
type GenesisAccounts []GenesisAccount
 | 
			
		||||
type GenesisAccount interface {
 | 
			
		||||
	Account
 | 
			
		||||
}
 | 
			
		||||
type VestingAccount interface {
 | 
			
		||||
	Account
 | 
			
		||||
	GetVestedCoins(blockTime time.Time) sdk.Coins
 | 
			
		||||
	GetVestingCoins(blockTime time.Time) sdk.Coins
 | 
			
		||||
	GetStartTime() int64
 | 
			
		||||
	GetEndTime() int64
 | 
			
		||||
	GetOriginalVesting() sdk.Coins
 | 
			
		||||
	GetDelegatedFree() sdk.Coins
 | 
			
		||||
	GetDelegatedVesting() sdk.Coins
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type GenesisState struct {
 | 
			
		||||
	Params   v034auth.Params `json:"params" yaml:"params"`
 | 
			
		||||
	Accounts GenesisAccounts `json:"accounts" yaml:"accounts"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// BaseAccount
 | 
			
		||||
var _ Account = (*BaseAccount)(nil)
 | 
			
		||||
var _ GenesisAccount = (*BaseAccount)(nil)
 | 
			
		||||
 | 
			
		||||
type BaseAccount struct {
 | 
			
		||||
	Address       sdk.AccAddress     `json:"address" yaml:"address"`
 | 
			
		||||
	Coins         sdk.Coins          `json:"coins" yaml:"coins"`
 | 
			
		||||
	PubKey        cryptotypes.PubKey `json:"public_key" yaml:"public_key"`
 | 
			
		||||
	AccountNumber uint64             `json:"account_number" yaml:"account_number"`
 | 
			
		||||
	Sequence      uint64             `json:"sequence" yaml:"sequence"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewBaseAccount(
 | 
			
		||||
	address sdk.AccAddress, coins sdk.Coins, pk cryptotypes.PubKey, accountNumber, sequence uint64,
 | 
			
		||||
) *BaseAccount {
 | 
			
		||||
 | 
			
		||||
	return &BaseAccount{
 | 
			
		||||
		Address:       address,
 | 
			
		||||
		Coins:         coins,
 | 
			
		||||
		PubKey:        pk,
 | 
			
		||||
		AccountNumber: accountNumber,
 | 
			
		||||
		Sequence:      sequence,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (acc BaseAccount) GetAddress() sdk.AccAddress {
 | 
			
		||||
	return acc.Address
 | 
			
		||||
}
 | 
			
		||||
func (acc *BaseAccount) GetCoins() sdk.Coins {
 | 
			
		||||
	return acc.Coins
 | 
			
		||||
}
 | 
			
		||||
func (acc *BaseAccount) SpendableCoins(_ time.Time) sdk.Coins {
 | 
			
		||||
	return acc.GetCoins()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Period struct {
 | 
			
		||||
	Length int64     `json:"length" yaml:"length"` // length of the period, in seconds
 | 
			
		||||
	Amount sdk.Coins `json:"amount" yaml:"amount"` // amount of coins vesting during this period
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Periods []Period
 | 
			
		||||
 | 
			
		||||
var _ VestingAccount = (*PeriodicVestingAccount)(nil)
 | 
			
		||||
var _ GenesisAccount = (*PeriodicVestingAccount)(nil)
 | 
			
		||||
 | 
			
		||||
type vestingAccountJSON struct {
 | 
			
		||||
	Address          sdk.AccAddress     `json:"address" yaml:"address"`
 | 
			
		||||
	Coins            sdk.Coins          `json:"coins,omitempty" yaml:"coins"`
 | 
			
		||||
	PubKey           cryptotypes.PubKey `json:"public_key" yaml:"public_key"`
 | 
			
		||||
	AccountNumber    uint64             `json:"account_number" yaml:"account_number"`
 | 
			
		||||
	Sequence         uint64             `json:"sequence" yaml:"sequence"`
 | 
			
		||||
	OriginalVesting  sdk.Coins          `json:"original_vesting" yaml:"original_vesting"`
 | 
			
		||||
	DelegatedFree    sdk.Coins          `json:"delegated_free" yaml:"delegated_free"`
 | 
			
		||||
	DelegatedVesting sdk.Coins          `json:"delegated_vesting" yaml:"delegated_vesting"`
 | 
			
		||||
	EndTime          int64              `json:"end_time" yaml:"end_time"`
 | 
			
		||||
 | 
			
		||||
	// custom fields based on concrete vesting type which can be omitted
 | 
			
		||||
	StartTime      int64   `json:"start_time,omitempty" yaml:"start_time,omitempty"`
 | 
			
		||||
	VestingPeriods Periods `json:"vesting_periods,omitempty" yaml:"vesting_periods,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type BaseVestingAccount struct {
 | 
			
		||||
	*BaseAccount
 | 
			
		||||
 | 
			
		||||
	OriginalVesting  sdk.Coins `json:"original_vesting" yaml:"original_vesting"`   // coins in account upon initialization
 | 
			
		||||
	DelegatedFree    sdk.Coins `json:"delegated_free" yaml:"delegated_free"`       // coins that are vested and delegated
 | 
			
		||||
	DelegatedVesting sdk.Coins `json:"delegated_vesting" yaml:"delegated_vesting"` // coins that vesting and delegated
 | 
			
		||||
	EndTime          int64     `json:"end_time" yaml:"end_time"`                   // when the coins become unlocked
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (bva *BaseVestingAccount) UnmarshalJSON(bz []byte) error {
 | 
			
		||||
	var alias vestingAccountJSON
 | 
			
		||||
	if err := legacy.Cdc.UnmarshalJSON(bz, &alias); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bva.BaseAccount = NewBaseAccount(alias.Address, alias.Coins, alias.PubKey, alias.AccountNumber, alias.Sequence)
 | 
			
		||||
	bva.OriginalVesting = alias.OriginalVesting
 | 
			
		||||
	bva.DelegatedFree = alias.DelegatedFree
 | 
			
		||||
	bva.DelegatedVesting = alias.DelegatedVesting
 | 
			
		||||
	bva.EndTime = alias.EndTime
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (bva BaseVestingAccount) SpendableCoinsVestingAccount(vestingCoins sdk.Coins) sdk.Coins {
 | 
			
		||||
	var spendableCoins sdk.Coins
 | 
			
		||||
	bc := bva.GetCoins()
 | 
			
		||||
 | 
			
		||||
	for _, coin := range bc {
 | 
			
		||||
		baseAmt := coin.Amount
 | 
			
		||||
		vestingAmt := vestingCoins.AmountOf(coin.Denom)
 | 
			
		||||
		delVestingAmt := bva.DelegatedVesting.AmountOf(coin.Denom)
 | 
			
		||||
 | 
			
		||||
		// compute min((BC + DV) - V, BC) per the specification
 | 
			
		||||
		min := sdk.MinInt(baseAmt.Add(delVestingAmt).Sub(vestingAmt), baseAmt)
 | 
			
		||||
		spendableCoin := sdk.NewCoin(coin.Denom, min)
 | 
			
		||||
 | 
			
		||||
		if !spendableCoin.IsZero() {
 | 
			
		||||
			spendableCoins = spendableCoins.Add(spendableCoin)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return spendableCoins
 | 
			
		||||
}
 | 
			
		||||
func (bva BaseVestingAccount) GetOriginalVesting() sdk.Coins {
 | 
			
		||||
	return bva.OriginalVesting
 | 
			
		||||
}
 | 
			
		||||
func (bva BaseVestingAccount) GetDelegatedFree() sdk.Coins {
 | 
			
		||||
	return bva.DelegatedFree
 | 
			
		||||
}
 | 
			
		||||
func (bva BaseVestingAccount) GetDelegatedVesting() sdk.Coins {
 | 
			
		||||
	return bva.DelegatedVesting
 | 
			
		||||
}
 | 
			
		||||
func (bva BaseVestingAccount) GetEndTime() int64 {
 | 
			
		||||
	return bva.EndTime
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Continuous Vesting Account
 | 
			
		||||
type ContinuousVestingAccount struct {
 | 
			
		||||
	*BaseVestingAccount
 | 
			
		||||
 | 
			
		||||
	StartTime int64 `json:"start_time" yaml:"start_time"` // when the coins start to vest
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (cva *ContinuousVestingAccount) UnmarshalJSON(bz []byte) error {
 | 
			
		||||
	var alias vestingAccountJSON
 | 
			
		||||
	if err := legacy.Cdc.UnmarshalJSON(bz, &alias); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cva.BaseVestingAccount = &BaseVestingAccount{
 | 
			
		||||
		BaseAccount:      NewBaseAccount(alias.Address, alias.Coins, alias.PubKey, alias.AccountNumber, alias.Sequence),
 | 
			
		||||
		OriginalVesting:  alias.OriginalVesting,
 | 
			
		||||
		DelegatedFree:    alias.DelegatedFree,
 | 
			
		||||
		DelegatedVesting: alias.DelegatedVesting,
 | 
			
		||||
		EndTime:          alias.EndTime,
 | 
			
		||||
	}
 | 
			
		||||
	cva.StartTime = alias.StartTime
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (cva ContinuousVestingAccount) GetVestedCoins(blockTime time.Time) sdk.Coins {
 | 
			
		||||
	var vestedCoins sdk.Coins
 | 
			
		||||
 | 
			
		||||
	// We must handle the case where the start time for a vesting account has
 | 
			
		||||
	// been set into the future or when the start of the chain is not exactly
 | 
			
		||||
	// known.
 | 
			
		||||
	if blockTime.Unix() <= cva.StartTime {
 | 
			
		||||
		return vestedCoins
 | 
			
		||||
	} else if blockTime.Unix() >= cva.EndTime {
 | 
			
		||||
		return cva.OriginalVesting
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// calculate the vesting scalar
 | 
			
		||||
	x := blockTime.Unix() - cva.StartTime
 | 
			
		||||
	y := cva.EndTime - cva.StartTime
 | 
			
		||||
	s := sdk.NewDec(x).Quo(sdk.NewDec(y))
 | 
			
		||||
 | 
			
		||||
	for _, ovc := range cva.OriginalVesting {
 | 
			
		||||
		vestedAmt := ovc.Amount.ToDec().Mul(s).RoundInt()
 | 
			
		||||
		vestedCoins = append(vestedCoins, sdk.NewCoin(ovc.Denom, vestedAmt))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return vestedCoins
 | 
			
		||||
}
 | 
			
		||||
func (cva ContinuousVestingAccount) GetVestingCoins(blockTime time.Time) sdk.Coins {
 | 
			
		||||
	return cva.OriginalVesting.Sub(cva.GetVestedCoins(blockTime))
 | 
			
		||||
}
 | 
			
		||||
func (cva ContinuousVestingAccount) SpendableCoins(blockTime time.Time) sdk.Coins {
 | 
			
		||||
	return cva.BaseVestingAccount.SpendableCoinsVestingAccount(cva.GetVestingCoins(blockTime))
 | 
			
		||||
}
 | 
			
		||||
func (cva ContinuousVestingAccount) GetStartTime() int64 {
 | 
			
		||||
	return cva.StartTime
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Periodic Vesting Account
 | 
			
		||||
type PeriodicVestingAccount struct {
 | 
			
		||||
	*BaseVestingAccount
 | 
			
		||||
	StartTime      int64   `json:"start_time" yaml:"start_time"`           // when the coins start to vest
 | 
			
		||||
	VestingPeriods Periods `json:"vesting_periods" yaml:"vesting_periods"` // the vesting schedule
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewPeriodicVestingAccountRaw creates a new PeriodicVestingAccount object from BaseVestingAccount
 | 
			
		||||
func NewPeriodicVestingAccountRaw(bva *BaseVestingAccount, startTime int64, periods Periods) *PeriodicVestingAccount {
 | 
			
		||||
	return &PeriodicVestingAccount{
 | 
			
		||||
		BaseVestingAccount: bva,
 | 
			
		||||
		StartTime:          startTime,
 | 
			
		||||
		VestingPeriods:     periods,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (pva PeriodicVestingAccount) GetVestedCoins(blockTime time.Time) sdk.Coins {
 | 
			
		||||
	var vestedCoins sdk.Coins
 | 
			
		||||
 | 
			
		||||
	// We must handle the case where the start time for a vesting account has
 | 
			
		||||
	// been set into the future or when the start of the chain is not exactly
 | 
			
		||||
	// known.
 | 
			
		||||
	if blockTime.Unix() <= pva.StartTime {
 | 
			
		||||
		return vestedCoins
 | 
			
		||||
	} else if blockTime.Unix() >= pva.EndTime {
 | 
			
		||||
		return pva.OriginalVesting
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// track the start time of the next period
 | 
			
		||||
	currentPeriodStartTime := pva.StartTime
 | 
			
		||||
	// for each period, if the period is over, add those coins as vested and check the next period.
 | 
			
		||||
	for _, period := range pva.VestingPeriods {
 | 
			
		||||
		x := blockTime.Unix() - currentPeriodStartTime
 | 
			
		||||
		if x < period.Length {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		vestedCoins = vestedCoins.Add(period.Amount...)
 | 
			
		||||
		// Update the start time of the next period
 | 
			
		||||
		currentPeriodStartTime += period.Length
 | 
			
		||||
	}
 | 
			
		||||
	return vestedCoins
 | 
			
		||||
}
 | 
			
		||||
func (pva PeriodicVestingAccount) GetVestingCoins(blockTime time.Time) sdk.Coins {
 | 
			
		||||
	vestedCoins := pva.GetVestedCoins(blockTime)
 | 
			
		||||
	return pva.OriginalVesting.Sub(vestedCoins)
 | 
			
		||||
}
 | 
			
		||||
func (pva PeriodicVestingAccount) SpendableCoins(blockTime time.Time) sdk.Coins {
 | 
			
		||||
	vestingCoins := pva.GetVestingCoins(blockTime)
 | 
			
		||||
	return pva.BaseVestingAccount.SpendableCoinsVestingAccount(vestingCoins)
 | 
			
		||||
}
 | 
			
		||||
func (pva PeriodicVestingAccount) GetStartTime() int64 {
 | 
			
		||||
	return pva.StartTime
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Delayed Vesting Account
 | 
			
		||||
type DelayedVestingAccount struct {
 | 
			
		||||
	*BaseVestingAccount
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalJSON unmarshals raw JSON bytes into a DelayedVestingAccount.
 | 
			
		||||
func (dva *DelayedVestingAccount) UnmarshalJSON(bz []byte) error {
 | 
			
		||||
	var alias vestingAccountJSON
 | 
			
		||||
	if err := legacy.Cdc.UnmarshalJSON(bz, &alias); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dva.BaseVestingAccount = &BaseVestingAccount{
 | 
			
		||||
		BaseAccount:      NewBaseAccount(alias.Address, alias.Coins, alias.PubKey, alias.AccountNumber, alias.Sequence),
 | 
			
		||||
		OriginalVesting:  alias.OriginalVesting,
 | 
			
		||||
		DelegatedFree:    alias.DelegatedFree,
 | 
			
		||||
		DelegatedVesting: alias.DelegatedVesting,
 | 
			
		||||
		EndTime:          alias.EndTime,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalJSON unmarshals raw JSON bytes into a PeriodicVestingAccount.
 | 
			
		||||
func (pva *PeriodicVestingAccount) UnmarshalJSON(bz []byte) error {
 | 
			
		||||
	var alias vestingAccountJSON
 | 
			
		||||
	if err := legacy.Cdc.UnmarshalJSON(bz, &alias); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pva.BaseVestingAccount = &BaseVestingAccount{
 | 
			
		||||
		BaseAccount:      NewBaseAccount(alias.Address, alias.Coins, alias.PubKey, alias.AccountNumber, alias.Sequence),
 | 
			
		||||
		OriginalVesting:  alias.OriginalVesting,
 | 
			
		||||
		DelegatedFree:    alias.DelegatedFree,
 | 
			
		||||
		DelegatedVesting: alias.DelegatedVesting,
 | 
			
		||||
		EndTime:          alias.EndTime,
 | 
			
		||||
	}
 | 
			
		||||
	pva.StartTime = alias.StartTime
 | 
			
		||||
	pva.VestingPeriods = alias.VestingPeriods
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (dva DelayedVestingAccount) GetVestedCoins(blockTime time.Time) sdk.Coins {
 | 
			
		||||
	if blockTime.Unix() >= dva.EndTime {
 | 
			
		||||
		return dva.OriginalVesting
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func (dva DelayedVestingAccount) GetVestingCoins(blockTime time.Time) sdk.Coins {
 | 
			
		||||
	return dva.OriginalVesting.Sub(dva.GetVestedCoins(blockTime))
 | 
			
		||||
}
 | 
			
		||||
func (dva DelayedVestingAccount) SpendableCoins(blockTime time.Time) sdk.Coins {
 | 
			
		||||
	return dva.BaseVestingAccount.SpendableCoinsVestingAccount(dva.GetVestingCoins(blockTime))
 | 
			
		||||
}
 | 
			
		||||
func (dva DelayedVestingAccount) GetStartTime() int64 {
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ModuleAccount struct {
 | 
			
		||||
	*BaseAccount
 | 
			
		||||
 | 
			
		||||
	Name        string   `json:"name" yaml:"name"`               // name of the module
 | 
			
		||||
	Permissions []string `json:"permissions" yaml:"permissions"` // permissions of module account
 | 
			
		||||
}
 | 
			
		||||
type moduleAccountPretty struct {
 | 
			
		||||
	Address       sdk.AccAddress `json:"address" yaml:"address"`
 | 
			
		||||
	Coins         sdk.Coins      `json:"coins,omitempty" yaml:"coins"`
 | 
			
		||||
	PubKey        string         `json:"public_key" yaml:"public_key"`
 | 
			
		||||
	AccountNumber uint64         `json:"account_number" yaml:"account_number"`
 | 
			
		||||
	Sequence      uint64         `json:"sequence" yaml:"sequence"`
 | 
			
		||||
	Name          string         `json:"name" yaml:"name"`
 | 
			
		||||
	Permissions   []string       `json:"permissions" yaml:"permissions"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalJSON unmarshals raw JSON bytes into a ModuleAccount.
 | 
			
		||||
func (ma *ModuleAccount) UnmarshalJSON(bz []byte) error {
 | 
			
		||||
	var alias moduleAccountPretty
 | 
			
		||||
	if err := legacy.Cdc.UnmarshalJSON(bz, &alias); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ma.BaseAccount = NewBaseAccount(alias.Address, alias.Coins, nil, alias.AccountNumber, alias.Sequence)
 | 
			
		||||
	ma.Name = alias.Name
 | 
			
		||||
	ma.Permissions = alias.Permissions
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type VestingProgress struct {
 | 
			
		||||
	PeriodComplete    bool `json:"period_complete" yaml:"period_complete"`
 | 
			
		||||
	VestingSuccessful bool `json:"vesting_successful" yaml:"vesting_successful"`
 | 
			
		||||
}
 | 
			
		||||
type CurrentPeriodProgress struct {
 | 
			
		||||
	MissedBlocks int64 `json:"missed_blocks" yaml:"missed_blocks"`
 | 
			
		||||
	TotalBlocks  int64 `json:"total_blocks" yaml:"total_blocks"`
 | 
			
		||||
}
 | 
			
		||||
type ValidatorVestingAccount struct {
 | 
			
		||||
	*PeriodicVestingAccount
 | 
			
		||||
	ValidatorAddress       sdk.ConsAddress       `json:"validator_address" yaml:"validator_address"`
 | 
			
		||||
	ReturnAddress          sdk.AccAddress        `json:"return_address" yaml:"return_address"`
 | 
			
		||||
	SigningThreshold       int64                 `json:"signing_threshold" yaml:"signing_threshold"`
 | 
			
		||||
	CurrentPeriodProgress  CurrentPeriodProgress `json:"current_period_progress" yaml:"current_period_progress"`
 | 
			
		||||
	VestingPeriodProgress  []VestingProgress     `json:"vesting_period_progress" yaml:"vesting_period_progress"`
 | 
			
		||||
	DebtAfterFailedVesting sdk.Coins             `json:"debt_after_failed_vesting" yaml:"debt_after_failed_vesting"`
 | 
			
		||||
}
 | 
			
		||||
type validatorVestingAccountJSON struct {
 | 
			
		||||
	Address          sdk.AccAddress     `json:"address" yaml:"address"`
 | 
			
		||||
	Coins            sdk.Coins          `json:"coins" yaml:"coins"`
 | 
			
		||||
	PubKey           cryptotypes.PubKey `json:"public_key" yaml:"public_key"`
 | 
			
		||||
	AccountNumber    uint64             `json:"account_number" yaml:"account_number"`
 | 
			
		||||
	Sequence         uint64             `json:"sequence" yaml:"sequence"`
 | 
			
		||||
	OriginalVesting  sdk.Coins          `json:"original_vesting" yaml:"original_vesting"`
 | 
			
		||||
	DelegatedFree    sdk.Coins          `json:"delegated_free" yaml:"delegated_free"`
 | 
			
		||||
	DelegatedVesting sdk.Coins          `json:"delegated_vesting" yaml:"delegated_vesting"`
 | 
			
		||||
	EndTime          int64              `json:"end_time" yaml:"end_time"`
 | 
			
		||||
 | 
			
		||||
	// non-base vesting account fields
 | 
			
		||||
	StartTime              int64                 `json:"start_time" yaml:"start_time"`
 | 
			
		||||
	VestingPeriods         Periods               `json:"vesting_periods" yaml:"vesting_periods"`
 | 
			
		||||
	ValidatorAddress       sdk.ConsAddress       `json:"validator_address" yaml:"validator_address"`
 | 
			
		||||
	ReturnAddress          sdk.AccAddress        `json:"return_address" yaml:"return_address"`
 | 
			
		||||
	SigningThreshold       int64                 `json:"signing_threshold" yaml:"signing_threshold"`
 | 
			
		||||
	CurrentPeriodProgress  CurrentPeriodProgress `json:"current_period_progress" yaml:"current_period_progress"`
 | 
			
		||||
	VestingPeriodProgress  []VestingProgress     `json:"vesting_period_progress" yaml:"vesting_period_progress"`
 | 
			
		||||
	DebtAfterFailedVesting sdk.Coins             `json:"debt_after_failed_vesting" yaml:"debt_after_failed_vesting"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalJSON unmarshals raw JSON bytes into a ValidatorVestingAccount.
 | 
			
		||||
func (vva *ValidatorVestingAccount) UnmarshalJSON(bz []byte) error {
 | 
			
		||||
	var alias validatorVestingAccountJSON
 | 
			
		||||
	if err := legacy.Cdc.UnmarshalJSON(bz, &alias); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ba := NewBaseAccount(alias.Address, alias.Coins, alias.PubKey, alias.AccountNumber, alias.Sequence)
 | 
			
		||||
	bva := &BaseVestingAccount{
 | 
			
		||||
		BaseAccount:      ba,
 | 
			
		||||
		OriginalVesting:  alias.OriginalVesting,
 | 
			
		||||
		DelegatedFree:    alias.DelegatedFree,
 | 
			
		||||
		DelegatedVesting: alias.DelegatedVesting,
 | 
			
		||||
		EndTime:          alias.EndTime,
 | 
			
		||||
	}
 | 
			
		||||
	pva := NewPeriodicVestingAccountRaw(bva, alias.StartTime, alias.VestingPeriods)
 | 
			
		||||
	vva.PeriodicVestingAccount = pva
 | 
			
		||||
	vva.ValidatorAddress = alias.ValidatorAddress
 | 
			
		||||
	vva.ReturnAddress = alias.ReturnAddress
 | 
			
		||||
	vva.SigningThreshold = alias.SigningThreshold
 | 
			
		||||
	vva.CurrentPeriodProgress = alias.CurrentPeriodProgress
 | 
			
		||||
	vva.VestingPeriodProgress = alias.VestingPeriodProgress
 | 
			
		||||
	vva.DebtAfterFailedVesting = alias.DebtAfterFailedVesting
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (vva ValidatorVestingAccount) GetVestedCoins(blockTime time.Time) sdk.Coins {
 | 
			
		||||
	var vestedCoins sdk.Coins
 | 
			
		||||
	if blockTime.Unix() <= vva.StartTime {
 | 
			
		||||
		return vestedCoins
 | 
			
		||||
	}
 | 
			
		||||
	currentPeriodStartTime := vva.StartTime
 | 
			
		||||
	numberPeriods := len(vva.VestingPeriods)
 | 
			
		||||
	for i := 0; i < numberPeriods; i++ {
 | 
			
		||||
		x := blockTime.Unix() - currentPeriodStartTime
 | 
			
		||||
		if x >= vva.VestingPeriods[i].Length {
 | 
			
		||||
			if vva.VestingPeriodProgress[i].PeriodComplete {
 | 
			
		||||
				vestedCoins = vestedCoins.Add(vva.VestingPeriods[i].Amount...)
 | 
			
		||||
			}
 | 
			
		||||
			currentPeriodStartTime += vva.VestingPeriods[i].Length
 | 
			
		||||
		} else {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return vestedCoins
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
func (vva ValidatorVestingAccount) GetFailedVestedCoins() sdk.Coins {
 | 
			
		||||
	var failedVestedCoins sdk.Coins
 | 
			
		||||
	numberPeriods := len(vva.VestingPeriods)
 | 
			
		||||
	for i := 0; i < numberPeriods; i++ {
 | 
			
		||||
		if vva.VestingPeriodProgress[i].PeriodComplete {
 | 
			
		||||
			if !vva.VestingPeriodProgress[i].VestingSuccessful {
 | 
			
		||||
				failedVestedCoins = failedVestedCoins.Add(vva.VestingPeriods[i].Amount...)
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return failedVestedCoins
 | 
			
		||||
}
 | 
			
		||||
func (vva ValidatorVestingAccount) GetVestingCoins(blockTime time.Time) sdk.Coins {
 | 
			
		||||
	return vva.OriginalVesting.Sub(vva.GetVestedCoins(blockTime))
 | 
			
		||||
}
 | 
			
		||||
func (vva ValidatorVestingAccount) SpendableCoins(blockTime time.Time) sdk.Coins {
 | 
			
		||||
	return vva.BaseVestingAccount.SpendableCoinsVestingAccount(vva.GetVestingCoins(blockTime))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {
 | 
			
		||||
	cryptocodec.RegisterCrypto(cdc)
 | 
			
		||||
	cdc.RegisterInterface((*GenesisAccount)(nil), nil)
 | 
			
		||||
	cdc.RegisterInterface((*Account)(nil), nil)
 | 
			
		||||
	cdc.RegisterInterface((*VestingAccount)(nil), nil)
 | 
			
		||||
	cdc.RegisterConcrete(&BaseAccount{}, "cosmos-sdk/Account", nil)
 | 
			
		||||
	cdc.RegisterConcrete(&BaseVestingAccount{}, "cosmos-sdk/BaseVestingAccount", nil)
 | 
			
		||||
	cdc.RegisterConcrete(&ContinuousVestingAccount{}, "cosmos-sdk/ContinuousVestingAccount", nil)
 | 
			
		||||
	cdc.RegisterConcrete(&DelayedVestingAccount{}, "cosmos-sdk/DelayedVestingAccount", nil)
 | 
			
		||||
	cdc.RegisterConcrete(&PeriodicVestingAccount{}, "cosmos-sdk/PeriodicVestingAccount", nil)
 | 
			
		||||
	cdc.RegisterConcrete(&ValidatorVestingAccount{}, "cosmos-sdk/ValidatorVestingAccount", nil)
 | 
			
		||||
	cdc.RegisterConcrete(&ModuleAccount{}, "cosmos-sdk/ModuleAccount", nil)
 | 
			
		||||
}
 | 
			
		||||
@ -1,56 +0,0 @@
 | 
			
		||||
package v0_16
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	tmtypes "github.com/tendermint/tendermint/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	GenesisTime = time.Date(2022, 1, 19, 16, 0, 0, 0, time.UTC)
 | 
			
		||||
	ChainID     = "kava-9"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func setConfigIfUnsealed() {
 | 
			
		||||
	config := sdk.GetConfig()
 | 
			
		||||
	if config.GetBech32AccountAddrPrefix() == "kava" {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	app.SetSDKConfig()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Migrate converts v15 genesis doc to v16 genesis doc
 | 
			
		||||
func Migrate(genDoc *tmtypes.GenesisDoc, ctx client.Context) (*tmtypes.GenesisDoc, error) {
 | 
			
		||||
	setConfigIfUnsealed()
 | 
			
		||||
 | 
			
		||||
	var appState genutiltypes.AppMap
 | 
			
		||||
	var err error
 | 
			
		||||
	if err := json.Unmarshal(genDoc.AppState, &appState); err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("failed to marchal app state from genesis doc:  %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	MigrateCosmosAppState(appState, ctx, GenesisTime)
 | 
			
		||||
	migrateKavaAppState(appState, ctx)
 | 
			
		||||
 | 
			
		||||
	genDoc.AppState, err = json.Marshal(appState)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	genDoc.GenesisTime = GenesisTime
 | 
			
		||||
	genDoc.ChainID = ChainID
 | 
			
		||||
 | 
			
		||||
	genDoc.InitialHeight = 1
 | 
			
		||||
 | 
			
		||||
	genDoc.ConsensusParams.Version.AppVersion = 1
 | 
			
		||||
 | 
			
		||||
	genDoc.ConsensusParams.Evidence.MaxBytes = 50000
 | 
			
		||||
 | 
			
		||||
	return genDoc, nil
 | 
			
		||||
}
 | 
			
		||||
@ -1,99 +0,0 @@
 | 
			
		||||
# kava-9 Upgrade Instructions
 | 
			
		||||
 | 
			
		||||
## Software Version and Key Dates
 | 
			
		||||
 | 
			
		||||
- We will be upgrading from chain-id "kava-8" to chain-id "kava-9".
 | 
			
		||||
- The version of Kava for kava-9 is v0.16.0
 | 
			
		||||
- The kava-8 chain will be shutdown with a `SoftwareUpgradeProposal` that activates at block height __1803250__, which is approximately 14:00 UTC on January, 19 2022.
 | 
			
		||||
- kava-9 genesis time is set to January 19, 2022 at 16:00 UTC
 | 
			
		||||
- The version of cosmos-sdk for kava-9 is v0.44.5
 | 
			
		||||
- The version of tendermint for kava-9 v0.34.14
 | 
			
		||||
- The minimum version of golang for kava-9 is __1.17+__.
 | 
			
		||||
 | 
			
		||||
__NOTE__: As part of the upgrade to kava-9, the `kvd` and `kvcli` binaries were combined into a single blockchain binary named `kava`. When restarting the chain, be sure to use `kava start` and not the deprecated `kvd start`.
 | 
			
		||||
 | 
			
		||||
### Risks
 | 
			
		||||
 | 
			
		||||
As a validator, performing the upgrade procedure on your consensus nodes carries a heightened risk of double-signing and being slashed. The most important piece of this procedure is verifying your software version and genesis file hash before starting your validator and signing.
 | 
			
		||||
 | 
			
		||||
The riskiest thing a validator can do is discover that they made a mistake and repeat the upgrade procedure again during the network startup. If you discover a mistake in the process, the best thing to do is wait for the network to start before correcting it. If the network is halted and you have started with a different genesis file than the expected one, seek advice from a Kava developer before resetting your validator.
 | 
			
		||||
 | 
			
		||||
### Recovery
 | 
			
		||||
 | 
			
		||||
Prior to exporting kava-8 state, validators are encouraged to take a full data snapshot at the export height before proceeding. Snap-shotting depends heavily on infrastructure, but generally this can be done by backing up the .kvd and .kvcli directories.
 | 
			
		||||
 | 
			
		||||
It is critically important to back-up the .kvd/data/priv_validator_state.json file after stopping your kvd process. This file is updated every block as your validator participates in consensus rounds. It is a critical file needed to prevent double-signing, in case the upgrade fails and the previous chain needs to be restarted.
 | 
			
		||||
 | 
			
		||||
In the event that the upgrade does not succeed, validators and operators must downgrade back to v0.15.2 of the Kava software and restore to their latest snapshot before restarting their nodes.
 | 
			
		||||
 | 
			
		||||
## Upgrade Procedure
 | 
			
		||||
 | 
			
		||||
### Before the upgrade
 | 
			
		||||
 | 
			
		||||
Kava Labs has submitted a `SoftwareUpgradeProposal` that specifies block height __1803250__ as the final block height for kava-8. This height corresponds to approximately 14:00 UTC on January 19th. Once the proposal passes, the chain will shutdown automatically at the specified height and does not require manual intervention by validators.
 | 
			
		||||
 | 
			
		||||
### On the day of the upgrade
 | 
			
		||||
 | 
			
		||||
**The kava chain is expected to halt at block height __1803250__, at approximately 14:00 UTC, and restart with new software at 16:00 UTC January 19th. Do not stop your node and begin the upgrade before 14:00UTC on January 19th, or you may go offline and be unable to recover until after the upgrade!**
 | 
			
		||||
 | 
			
		||||
**Make sure the kvd process is stopped before proceeding and that you have backed up your validator**. Failure to backup your validator could make it impossible to restart your node if the upgrade fails.
 | 
			
		||||
 | 
			
		||||
1. Export State (this **MUST** be done using **v0.15.x**)
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
# verify version before export:
 | 
			
		||||
kvd version --long
 | 
			
		||||
# name: kava
 | 
			
		||||
# server_name: kvd
 | 
			
		||||
# client_name: kvcli
 | 
			
		||||
# version: 0.15.0 (any 0.15 version is fine)
 | 
			
		||||
# commit: 8691ac44ed0e65db7ebc4a2fe85c58c717f63c39
 | 
			
		||||
# build_tags: netgo,ledger
 | 
			
		||||
# go: go version go1.17.1 linux/amd64
 | 
			
		||||
 | 
			
		||||
# export genesis using v0.15.x
 | 
			
		||||
kvd export --for-zero-height --height 1803249 > export-genesis.json
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Note:** This can take a while!
 | 
			
		||||
 | 
			
		||||
2. Update to kava-9
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
  # in the `kava` folder
 | 
			
		||||
  git pull
 | 
			
		||||
  git checkout v0.16.0
 | 
			
		||||
  make install
 | 
			
		||||
 | 
			
		||||
  # verify versions
 | 
			
		||||
  kava version --long
 | 
			
		||||
  # name: kava
 | 
			
		||||
  # server_name: kava
 | 
			
		||||
  # version: v0.16.0
 | 
			
		||||
  # commit: [PLACEHOLDER]
 | 
			
		||||
  # build_tags: netgo,ledger
 | 
			
		||||
  # go: go version go1.17.1 linux/amd64
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  # Migrate genesis state
 | 
			
		||||
  kava migrate export-genesis.json > genesis.json
 | 
			
		||||
 | 
			
		||||
  # Verify output of genesis migration
 | 
			
		||||
  kava validate-genesis genesis.json # should say it's valid
 | 
			
		||||
  kava assert-invariants genesis.json # should say invariants pass
 | 
			
		||||
  jq -S -c -M '' genesis.json | shasum -a 256
 | 
			
		||||
  # [PLACEHOLDER]
 | 
			
		||||
 | 
			
		||||
  # Restart node with migrated genesis state
 | 
			
		||||
  cp genesis.json ~/.kava/config/genesis.json
 | 
			
		||||
  kava unsafe-reset-all
 | 
			
		||||
 | 
			
		||||
  # Restart node -
 | 
			
		||||
  # ! Be sure to remove --halt-time flag if it is set in systemd/docker
 | 
			
		||||
  # NOTE: THE BINARY IS NOW NAMED KAVA
 | 
			
		||||
  kava start
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Coordination
 | 
			
		||||
 | 
			
		||||
If the kava-9 chain does not launch by January 19, 2022 at 20:00 UTC, the launch should be considered a failure and validators should refer to the [rollback](./rollback.md) instructions to restart the previous kava-8 chain. In the event of launch failure, coordination will occur in the [Kava discord](https://discord.com/invite/kQzh3Uv).
 | 
			
		||||
@ -1,183 +0,0 @@
 | 
			
		||||
package v0_16
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	v039auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v039"
 | 
			
		||||
	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
 | 
			
		||||
	vestexported "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported"
 | 
			
		||||
	vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types"
 | 
			
		||||
	v036supply "github.com/cosmos/cosmos-sdk/x/bank/legacy/v036"
 | 
			
		||||
	v038bank "github.com/cosmos/cosmos-sdk/x/bank/legacy/v038"
 | 
			
		||||
	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
 | 
			
		||||
	genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
 | 
			
		||||
	tmjson "github.com/tendermint/tendermint/libs/json"
 | 
			
		||||
	tmtypes "github.com/tendermint/tendermint/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/migrate/v0_16/legacyaccounts"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestMigrateGenesisDoc(t *testing.T) {
 | 
			
		||||
	expected := getTestDataJSON("genesis-v16.json")
 | 
			
		||||
	genDoc, err := tmtypes.GenesisDocFromFile(filepath.Join("testdata", "genesis-v15.json"))
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	actualGenDoc, err := Migrate(genDoc, newClientContext())
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	actualJson, err := tmjson.Marshal(actualGenDoc)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.JSONEq(t, expected, string(actualJson))
 | 
			
		||||
 | 
			
		||||
	assert.LessOrEqual(t, actualGenDoc.ConsensusParams.Evidence.MaxBytes, actualGenDoc.ConsensusParams.Block.MaxBytes)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMigrateFull(t *testing.T) {
 | 
			
		||||
	t.Skip() // avoid committing mainnet state - test also currently fails due to https://github.com/cosmos/cosmos-sdk/issues/10862. If you apply the patch, it will pass
 | 
			
		||||
	genDoc, err := tmtypes.GenesisDocFromFile(filepath.Join("testdata", "kava-8-block-1627000.json"))
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	newGenDoc, err := Migrate(genDoc, newClientContext())
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	encodingConfig := app.MakeEncodingConfig()
 | 
			
		||||
	var appMap genutiltypes.AppMap
 | 
			
		||||
	err = tmjson.Unmarshal(newGenDoc.AppState, &appMap)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	err = app.ModuleBasics.ValidateGenesis(encodingConfig.Marshaler, encodingConfig.TxConfig, appMap)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	tApp := app.NewTestApp()
 | 
			
		||||
	require.NotPanics(t, func() {
 | 
			
		||||
		tApp.InitializeFromGenesisStatesWithTimeAndChainID(newGenDoc.GenesisTime, newGenDoc.ChainID, app.GenesisState(appMap))
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestAccountBalances(t *testing.T) {
 | 
			
		||||
	t.Skip() // avoid committing test data
 | 
			
		||||
	setConfigIfUnsealed()
 | 
			
		||||
 | 
			
		||||
	// load auth state from kava-8 with empty accounts removed (keeps size down)
 | 
			
		||||
	authbz, err := ioutil.ReadFile(filepath.Join("testdata", "kava-8-test-auth-state.json"))
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	// load bank state from kava-8, required for migration
 | 
			
		||||
	bankbz, err := ioutil.ReadFile(filepath.Join("testdata", "kava-8-test-bank-state.json"))
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	// load supply state from kava-8, required for migration
 | 
			
		||||
	supplybz, err := ioutil.ReadFile(filepath.Join("testdata", "kava-8-test-supply-state.json"))
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	// codec to read old auth data
 | 
			
		||||
	v039Codec := codec.NewLegacyAmino()
 | 
			
		||||
	legacyaccounts.RegisterLegacyAminoCodec(v039Codec)
 | 
			
		||||
	// store old auth genesis state for comparison to migrated state
 | 
			
		||||
	var prevAuthGenState legacyaccounts.GenesisState
 | 
			
		||||
	v039Codec.MustUnmarshalJSON(authbz, &prevAuthGenState)
 | 
			
		||||
 | 
			
		||||
	// migrate auth state to kava-9, with periodic vesting account changes and bank conversion
 | 
			
		||||
	appState := genutiltypes.AppMap{
 | 
			
		||||
		v039auth.ModuleName:   authbz,
 | 
			
		||||
		v038bank.ModuleName:   bankbz,
 | 
			
		||||
		v036supply.ModuleName: supplybz,
 | 
			
		||||
	}
 | 
			
		||||
	clientCtx := newClientContext()
 | 
			
		||||
	appState = MigrateCosmosAppState(appState, clientCtx, GenesisTime)
 | 
			
		||||
 | 
			
		||||
	// store new auth and bank state
 | 
			
		||||
	var migratedAuthGenState authtypes.GenesisState
 | 
			
		||||
	clientCtx.Codec.MustUnmarshalJSON(appState[authtypes.ModuleName], &migratedAuthGenState)
 | 
			
		||||
	var migratedBankGenState banktypes.GenesisState
 | 
			
		||||
	clientCtx.Codec.MustUnmarshalJSON(appState[banktypes.ModuleName], &migratedBankGenState)
 | 
			
		||||
 | 
			
		||||
	// store map of accouauthexportednt coins from the bank module
 | 
			
		||||
	migratedAccCoins := make(map[string]sdk.Coins)
 | 
			
		||||
	for _, bal := range migratedBankGenState.Balances {
 | 
			
		||||
		migratedAccCoins[bal.Address] = bal.Coins
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i, anyAcc := range migratedAuthGenState.Accounts {
 | 
			
		||||
		var acc authtypes.AccountI
 | 
			
		||||
		err := clientCtx.InterfaceRegistry.UnpackAny(anyAcc, &acc)
 | 
			
		||||
		require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
		oldAcc := prevAuthGenState.Accounts[i]
 | 
			
		||||
		oldAcc.SpendableCoins(GenesisTime)
 | 
			
		||||
		newBalance, ok := migratedAccCoins[acc.GetAddress().String()]
 | 
			
		||||
		// all accounts have a corresponding balance
 | 
			
		||||
		require.True(t, ok, "expected balance to exist")
 | 
			
		||||
 | 
			
		||||
		// this is the same account
 | 
			
		||||
		require.Equal(t, oldAcc.GetAddress(), acc.GetAddress(), "expected account address to match")
 | 
			
		||||
		// the owned coins did not change
 | 
			
		||||
		require.Equal(t, oldAcc.GetCoins(), newBalance, "expected base coins to not change")
 | 
			
		||||
 | 
			
		||||
		// ensure spenable coins at genesis time is equal
 | 
			
		||||
		require.Equal(t, oldAcc.SpendableCoins(GenesisTime), getSpendableCoinsForAccount(acc, newBalance, GenesisTime), "expected spendable coins to not change")
 | 
			
		||||
		// check 30 days
 | 
			
		||||
		futureDate := GenesisTime.Add(30 * 24 * time.Hour)
 | 
			
		||||
		require.Equal(t, oldAcc.SpendableCoins(futureDate), getSpendableCoinsForAccount(acc, newBalance, futureDate), "expected spendable coins to not change")
 | 
			
		||||
		// check 90 days
 | 
			
		||||
		futureDate = GenesisTime.Add(90 * 24 * time.Hour)
 | 
			
		||||
		require.Equal(t, oldAcc.SpendableCoins(futureDate), getSpendableCoinsForAccount(acc, newBalance, futureDate), "expected spendable coins to not change")
 | 
			
		||||
		// check 180 days
 | 
			
		||||
		futureDate = GenesisTime.Add(180 * 24 * time.Hour)
 | 
			
		||||
		require.Equal(t, oldAcc.SpendableCoins(futureDate), getSpendableCoinsForAccount(acc, newBalance, futureDate), "expected spendable coins to not change")
 | 
			
		||||
		// check 365 days
 | 
			
		||||
		futureDate = GenesisTime.Add(365 * 24 * time.Hour)
 | 
			
		||||
		require.Equal(t, oldAcc.SpendableCoins(futureDate), getSpendableCoinsForAccount(acc, newBalance, futureDate), "expected spendable coins to not change")
 | 
			
		||||
		// check 2 years
 | 
			
		||||
		futureDate = GenesisTime.Add(2 * 365 * 24 * time.Hour)
 | 
			
		||||
		require.Equal(t, oldAcc.SpendableCoins(futureDate), getSpendableCoinsForAccount(acc, newBalance, futureDate), "expected spendable coins to not change")
 | 
			
		||||
 | 
			
		||||
		if vacc, ok := acc.(*vestingtypes.PeriodicVestingAccount); ok {
 | 
			
		||||
			// old account must be a periodic vesting account
 | 
			
		||||
			oldVacc, ok := oldAcc.(*legacyaccounts.PeriodicVestingAccount)
 | 
			
		||||
			require.True(t, ok)
 | 
			
		||||
 | 
			
		||||
			// total delegated coins must match
 | 
			
		||||
			oldTotalDelegated := oldVacc.DelegatedFree.Add(oldVacc.DelegatedVesting...)
 | 
			
		||||
			newTotalDelegated := vacc.DelegatedFree.Add(vacc.DelegatedVesting...)
 | 
			
		||||
			require.Equal(t, oldTotalDelegated, newTotalDelegated, "expected total amount of tracked delegations to not change")
 | 
			
		||||
 | 
			
		||||
			// delegated vesting must be less or equal to original vesting
 | 
			
		||||
			require.True(t, vacc.DelegatedVesting.IsAllLTE(vacc.OriginalVesting), "expected delegated vesting to be less or equal to original vesting")
 | 
			
		||||
 | 
			
		||||
			// vested coins must be nil for the new account
 | 
			
		||||
			require.Equal(t, sdk.Coins(nil), vacc.GetVestedCoins(GenesisTime), "expected no vested coins at genesis time")
 | 
			
		||||
 | 
			
		||||
			// vesting coins must not be nil
 | 
			
		||||
			require.NotEqual(t, sdk.Coins(nil), vacc.GetVestingCoins(GenesisTime), "expected vesting coins to be greater than 0")
 | 
			
		||||
 | 
			
		||||
			// new account as less than or equal
 | 
			
		||||
			require.LessOrEqual(t, len(vacc.VestingPeriods), len(oldVacc.VestingPeriods), "expected vesting periods of new account to be less than or equal to old")
 | 
			
		||||
 | 
			
		||||
			// start time should equal genesis time
 | 
			
		||||
			require.Equal(t, vacc.StartTime, GenesisTime.Unix(), "expected start time to be equal to genesis time")
 | 
			
		||||
 | 
			
		||||
			// end time should not change
 | 
			
		||||
			require.Equal(t, oldVacc.EndTime, vacc.EndTime, "expected end time to not change")
 | 
			
		||||
 | 
			
		||||
			// end time should be after genesis time
 | 
			
		||||
			require.Greater(t, vacc.EndTime, GenesisTime.Unix(), "expected end time to be after genesis time")
 | 
			
		||||
 | 
			
		||||
			// vesting account must have one or more periods
 | 
			
		||||
			require.GreaterOrEqual(t, len(vacc.VestingPeriods), 1, "expected one or more vesting periods")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getSpendableCoinsForAccount(acc authtypes.AccountI, balance sdk.Coins, blockTime time.Time) sdk.Coins {
 | 
			
		||||
	if vacc, ok := acc.(vestexported.VestingAccount); ok {
 | 
			
		||||
		return balance.Sub(vacc.LockedCoins(blockTime))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return balance
 | 
			
		||||
}
 | 
			
		||||
@ -1,231 +0,0 @@
 | 
			
		||||
package v0_16
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
 | 
			
		||||
	vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types"
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func createVestingAccount(balance sdk.Coins, vestingStart time.Time, vestingPeriods vestingtypes.Periods) *vestingtypes.PeriodicVestingAccount {
 | 
			
		||||
	key := secp256k1.GenPrivKey()
 | 
			
		||||
	pub := key.PubKey()
 | 
			
		||||
	addr := sdk.AccAddress(pub.Address())
 | 
			
		||||
	acc := authtypes.NewBaseAccount(addr, pub, 1, 1)
 | 
			
		||||
 | 
			
		||||
	originalVesting := sdk.NewCoins()
 | 
			
		||||
	for _, vp := range vestingPeriods {
 | 
			
		||||
		originalVesting = originalVesting.Add(vp.Amount...)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return vestingtypes.NewPeriodicVestingAccount(acc, originalVesting, vestingStart.Unix(), vestingPeriods)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestResetPeriodVestingAccount_NoVestingPeriods(t *testing.T) {
 | 
			
		||||
	vestingStartTime := time.Now().Add(-1 * time.Hour)
 | 
			
		||||
	vacc := createVestingAccount(sdk.Coins{}, vestingStartTime, vestingtypes.Periods{})
 | 
			
		||||
 | 
			
		||||
	newVestingStartTime := vestingStartTime.Add(time.Hour)
 | 
			
		||||
 | 
			
		||||
	ResetPeriodicVestingAccount(vacc, newVestingStartTime)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, sdk.Coins{}, vacc.OriginalVesting, "expected original vesting to be zero")
 | 
			
		||||
	assert.Equal(t, newVestingStartTime.Unix(), vacc.StartTime, "expected vesting start time to be updated")
 | 
			
		||||
	assert.Equal(t, newVestingStartTime.Unix(), vacc.EndTime, "expected vesting end time to be updated")
 | 
			
		||||
	assert.Equal(t, []vestingtypes.Period{}, vacc.VestingPeriods, "expected vesting periods to be empty")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestResetPeriodVestingAccount_SingleVestingPeriod_Vested(t *testing.T) {
 | 
			
		||||
	balance := sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6)))
 | 
			
		||||
	vestingStartTime := time.Now().Add(-30 * 24 * time.Hour) // 30 days in past
 | 
			
		||||
 | 
			
		||||
	periods := vestingtypes.Periods{
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 15 * 24 * 60 * 60, // 15 days (-15 days in past)
 | 
			
		||||
			Amount: balance,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	vacc := createVestingAccount(balance, vestingStartTime, periods)
 | 
			
		||||
 | 
			
		||||
	newVestingStartTime := vestingStartTime.Add(30 * 24 * time.Hour)
 | 
			
		||||
 | 
			
		||||
	ResetPeriodicVestingAccount(vacc, newVestingStartTime)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, sdk.Coins{}, vacc.OriginalVesting, "expected original vesting to be zero")
 | 
			
		||||
	assert.Equal(t, newVestingStartTime.Unix(), vacc.StartTime, "expected vesting start time to be updated")
 | 
			
		||||
	assert.Equal(t, newVestingStartTime.Unix(), vacc.EndTime, "expected vesting end time to be updated")
 | 
			
		||||
	assert.Equal(t, []vestingtypes.Period{}, vacc.VestingPeriods, "expected vesting periods to be empty")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestResetPeriodVestingAccount_SingleVestingPeriod_Vesting(t *testing.T) {
 | 
			
		||||
	balance := sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6)))
 | 
			
		||||
	vestingStartTime := time.Now().Add(-30 * 24 * time.Hour) // 30 days in past
 | 
			
		||||
 | 
			
		||||
	periods := vestingtypes.Periods{
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 45 * 24 * 60 * 60, // 45 days
 | 
			
		||||
			Amount: balance,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	vacc := createVestingAccount(balance, vestingStartTime, periods)
 | 
			
		||||
 | 
			
		||||
	newVestingStartTime := vestingStartTime.Add(30 * 24 * time.Hour)
 | 
			
		||||
 | 
			
		||||
	ResetPeriodicVestingAccount(vacc, newVestingStartTime)
 | 
			
		||||
 | 
			
		||||
	// new period length 15 days
 | 
			
		||||
	expectedEndtime := newVestingStartTime.Add(15 * 24 * time.Hour).Unix()
 | 
			
		||||
	// new period length changed, amount unchanged
 | 
			
		||||
	expectedPeriods := []vestingtypes.Period{
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 15 * 24 * 60 * 60, // 15 days
 | 
			
		||||
			Amount: balance,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, balance, vacc.OriginalVesting, "expected original vesting to be unchanged")
 | 
			
		||||
	assert.Equal(t, newVestingStartTime.Unix(), vacc.StartTime, "expected vesting start time to be updated")
 | 
			
		||||
	assert.Equal(t, expectedEndtime, vacc.EndTime, "expected vesting end time end at last period")
 | 
			
		||||
	assert.Equal(t, expectedPeriods, vacc.VestingPeriods, "expected vesting periods to be updated")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestResetPeriodVestingAccount_SingleVestingPeriod_ExactStartTime(t *testing.T) {
 | 
			
		||||
	balance := sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6)))
 | 
			
		||||
	vestingStartTime := time.Now().Add(-30 * 24 * time.Hour) // 30 days in past
 | 
			
		||||
 | 
			
		||||
	periods := vestingtypes.Periods{
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 30 * 24 * 60 * 60, // 30 days - exact on the start time
 | 
			
		||||
			Amount: balance,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	vacc := createVestingAccount(balance, vestingStartTime, periods)
 | 
			
		||||
 | 
			
		||||
	newVestingStartTime := vestingStartTime.Add(30 * 24 * time.Hour)
 | 
			
		||||
 | 
			
		||||
	ResetPeriodicVestingAccount(vacc, newVestingStartTime)
 | 
			
		||||
 | 
			
		||||
	// new period length is 0
 | 
			
		||||
	expectedEndtime := newVestingStartTime.Unix()
 | 
			
		||||
	// new period length changed, amount unchanged
 | 
			
		||||
	expectedPeriods := []vestingtypes.Period{}
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, sdk.Coins{}, vacc.OriginalVesting, "expected original vesting to be unchanged")
 | 
			
		||||
	assert.Equal(t, newVestingStartTime.Unix(), vacc.StartTime, "expected vesting start time to be updated")
 | 
			
		||||
	assert.Equal(t, expectedEndtime, vacc.EndTime, "expected vesting end time end at last period")
 | 
			
		||||
	assert.Equal(t, expectedPeriods, vacc.VestingPeriods, "expected vesting periods to be updated")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestResetPeriodVestingAccount_MultiplePeriods(t *testing.T) {
 | 
			
		||||
	balance := sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(4e6)))
 | 
			
		||||
	vestingStartTime := time.Now().Add(-30 * 24 * time.Hour) // 30 days in past
 | 
			
		||||
 | 
			
		||||
	periods := vestingtypes.Periods{
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 15 * 24 * 60 * 60, // -15 days - vested
 | 
			
		||||
			Amount: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6))),
 | 
			
		||||
		},
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 15 * 24 * 60 * 60, // 0 days - exact on the start time
 | 
			
		||||
			Amount: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6))),
 | 
			
		||||
		},
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 15 * 24 * 60 * 60, // +15 days - vesting
 | 
			
		||||
			Amount: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6))),
 | 
			
		||||
		},
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 15 * 24 * 60 * 60, // +30 days - vesting
 | 
			
		||||
			Amount: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6))),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	vacc := createVestingAccount(balance, vestingStartTime, periods)
 | 
			
		||||
 | 
			
		||||
	newVestingStartTime := vestingStartTime.Add(30 * 24 * time.Hour)
 | 
			
		||||
 | 
			
		||||
	ResetPeriodicVestingAccount(vacc, newVestingStartTime)
 | 
			
		||||
 | 
			
		||||
	// new period length 15 days
 | 
			
		||||
	expectedEndtime := newVestingStartTime.Add(30 * 24 * time.Hour).Unix()
 | 
			
		||||
	// new period length changed, amount unchanged
 | 
			
		||||
	expectedPeriods := []vestingtypes.Period{
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 15 * 24 * 60 * 60, // 15 days
 | 
			
		||||
			Amount: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6))),
 | 
			
		||||
		},
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 15 * 24 * 60 * 60, // 15 days
 | 
			
		||||
			Amount: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6))),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(2e6))), vacc.OriginalVesting, "expected original vesting to be updated")
 | 
			
		||||
	assert.Equal(t, newVestingStartTime.Unix(), vacc.StartTime, "expected vesting start time to be updated")
 | 
			
		||||
	assert.Equal(t, expectedEndtime, vacc.EndTime, "expected vesting end time end at last period")
 | 
			
		||||
	assert.Equal(t, expectedPeriods, vacc.VestingPeriods, "expected vesting periods to be updated")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestResetPeriodVestingAccount_DelegatedVesting_GreaterThanVesting(t *testing.T) {
 | 
			
		||||
	balance := sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(3e6)))
 | 
			
		||||
	vestingStartTime := time.Now().Add(-30 * 24 * time.Hour) // 30 days in past
 | 
			
		||||
 | 
			
		||||
	periods := vestingtypes.Periods{
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 15 * 24 * 60 * 60, // -15 days - vested
 | 
			
		||||
			Amount: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6))),
 | 
			
		||||
		},
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 15 * 24 * 60 * 60, // 0 days - exact on the start time
 | 
			
		||||
			Amount: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6))),
 | 
			
		||||
		},
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 15 * 24 * 60 * 60, // +15 days - vesting
 | 
			
		||||
			Amount: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6))),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	vacc := createVestingAccount(balance, vestingStartTime, periods)
 | 
			
		||||
	vacc.TrackDelegation(vestingStartTime, balance, balance)
 | 
			
		||||
 | 
			
		||||
	newVestingStartTime := vestingStartTime.Add(30 * 24 * time.Hour)
 | 
			
		||||
	ResetPeriodicVestingAccount(vacc, newVestingStartTime)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(2e6))), vacc.DelegatedFree, "expected delegated free to be updated")
 | 
			
		||||
	assert.Equal(t, sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6))), vacc.DelegatedVesting, "expected delegated vesting to be updated")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestResetPeriodVestingAccount_DelegatedVesting_LessThanVested(t *testing.T) {
 | 
			
		||||
	balance := sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(3e6)))
 | 
			
		||||
	vestingStartTime := time.Now().Add(-30 * 24 * time.Hour) // 30 days in past
 | 
			
		||||
 | 
			
		||||
	periods := vestingtypes.Periods{
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 15 * 24 * 60 * 60, // -15 days - vested
 | 
			
		||||
			Amount: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6))),
 | 
			
		||||
		},
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 15 * 24 * 60 * 60, // 0 days - exact on the start time
 | 
			
		||||
			Amount: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6))),
 | 
			
		||||
		},
 | 
			
		||||
		vestingtypes.Period{
 | 
			
		||||
			Length: 15 * 24 * 60 * 60, // +15 days - vesting
 | 
			
		||||
			Amount: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6))),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	vacc := createVestingAccount(balance, vestingStartTime, periods)
 | 
			
		||||
	vacc.TrackDelegation(vestingStartTime, balance, sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6))))
 | 
			
		||||
 | 
			
		||||
	newVestingStartTime := vestingStartTime.Add(30 * 24 * time.Hour)
 | 
			
		||||
	ResetPeriodicVestingAccount(vacc, newVestingStartTime)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, sdk.Coins(nil), vacc.DelegatedFree, "expected delegrated free to be unmodified")
 | 
			
		||||
	assert.Equal(t, sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e6))), vacc.DelegatedVesting, "expected delegated vesting to be unmodified")
 | 
			
		||||
}
 | 
			
		||||
@ -1,45 +0,0 @@
 | 
			
		||||
# Kava-9 Rollback Instructions
 | 
			
		||||
 | 
			
		||||
In the event that the Kava-9 relaunch is unsuccessful, we will restart the Kava-8 chain using the last known state.
 | 
			
		||||
 | 
			
		||||
In order to restore the previous chain, the following data must be recovered by validators:
 | 
			
		||||
 | 
			
		||||
- The database that contains the state of the previous chain (in ~/.kvd/data by default)
 | 
			
		||||
- The priv_validator_state.json file of the validator (in ~/.kvd/data by default)
 | 
			
		||||
 | 
			
		||||
If you don't have the database data, the Kava developer team or another validator will share a copy of the database via Amazon s3 or a similar service. You will be able to download a copy of the data and verify it before starting your node.
 | 
			
		||||
If you don't have the backup priv_validator_state.json file, you will not have double sign protection on the first block. If this is the case, it's best to consult in the validator discord before starting your node.
 | 
			
		||||
 | 
			
		||||
## Restoring state procedure
 | 
			
		||||
 | 
			
		||||
1. Stop your node
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
kava stop
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
2. Copy the contents of your backup data directory back to the $KVD_HOME/data directory. By default this is ~/.kvd/data.
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
# Assumes backup is stored in "backup" directory
 | 
			
		||||
rm -rf ~/.kvd/data
 | 
			
		||||
mv backup/.kvd/data ~/.kvd/data
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
3. Install the previous version of kava
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
# from kava directory
 | 
			
		||||
git checkout v0.15.2
 | 
			
		||||
make install
 | 
			
		||||
## verify version
 | 
			
		||||
kvd version --long
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
4. Start kvd process
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
### be sure to remove --halt-time flag if it is set
 | 
			
		||||
sudo systemctl daemon-reload
 | 
			
		||||
sudo systemctl start kvd
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										593
									
								
								migrate/v0_16/testdata/appstate-bank-v15.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										593
									
								
								migrate/v0_16/testdata/appstate-bank-v15.json
									
									
									
									
										vendored
									
									
								
							@ -1,593 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "auth": {
 | 
			
		||||
    "accounts": [
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/ModuleAccount",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "address": "kava1cj7njkw2g9fqx4e768zc75dp9sks8u9znxrf0w",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "denom": "hard",
 | 
			
		||||
              "amount": "1000000000000"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "denom": "swp",
 | 
			
		||||
              "amount": "1000000000000"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "denom": "ukava",
 | 
			
		||||
              "amount": "1000000000000"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "sequence": "0",
 | 
			
		||||
          "name": "kavadist",
 | 
			
		||||
          "permissions": ["minter"]
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/ModuleAccount",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "address": "kava1a42xtwfzphuuu9mdp0es6633wu5mm8fhm789v3",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "denom": "usdx",
 | 
			
		||||
              "amount": "1000000000"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "sequence": "1",
 | 
			
		||||
          "name": "hard",
 | 
			
		||||
          "permissions": ["minter", "burner"]
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/ModuleAccount",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "32",
 | 
			
		||||
          "address": "kava1mfru9azs5nua2wxcd4sq64g5nt7nn4n8s2w8cu",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "4100000000000",
 | 
			
		||||
              "denom": "usdx"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "name": "swap",
 | 
			
		||||
          "permissions": null,
 | 
			
		||||
          "public_key": "",
 | 
			
		||||
          "sequence": "3"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "address": "kava1ypjp0m04pyp73hwgtc0dgkx0e9rrydecm054da",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "address": "kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "address": "kava1agcvt07tcw0tglu0hmwdecsnuxp2yd45f3avgm",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "100000000000000",
 | 
			
		||||
              "denom": "bnb"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": {
 | 
			
		||||
            "type": "tendermint/PubKeySecp256k1",
 | 
			
		||||
            "value": "A7WkS5eJAiPE/gl7n4I5qa5JsREvQM5fkdgCEPhNfj0h"
 | 
			
		||||
          },
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/PeriodicVestingAccount",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "address": "kava1z3ytjpr6ancl8gw80z6f47z9smug7986x29vtj",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "denom": "ukava",
 | 
			
		||||
              "amount": "565077579"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "denom": "usdx",
 | 
			
		||||
              "amount": "1363200"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "sequence": "0",
 | 
			
		||||
          "original_vesting": [
 | 
			
		||||
            {
 | 
			
		||||
              "denom": "ukava",
 | 
			
		||||
              "amount": "560159828"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "delegated_free": [],
 | 
			
		||||
          "delegated_vesting": [],
 | 
			
		||||
          "end_time": "1628213878",
 | 
			
		||||
          "start_time": "1596677878",
 | 
			
		||||
          "vesting_periods": [
 | 
			
		||||
            {
 | 
			
		||||
              "length": "31536000",
 | 
			
		||||
              "amount": [
 | 
			
		||||
                {
 | 
			
		||||
                  "denom": "ukava",
 | 
			
		||||
                  "amount": "560159828"
 | 
			
		||||
                }
 | 
			
		||||
              ]
 | 
			
		||||
            }
 | 
			
		||||
          ]
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/PeriodicVestingAccount",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "address": "kava1jun8w7meyvgxl68fsjrsdhnv87zursv7dwlgee",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "denom": "swp",
 | 
			
		||||
              "amount": "15915874"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "denom": "ukava",
 | 
			
		||||
              "amount": "1000000"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "sequence": "0",
 | 
			
		||||
          "original_vesting": [
 | 
			
		||||
            {
 | 
			
		||||
              "denom": "swp",
 | 
			
		||||
              "amount": "14791996"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "delegated_free": [],
 | 
			
		||||
          "delegated_vesting": [],
 | 
			
		||||
          "end_time": "1665767828",
 | 
			
		||||
          "start_time": "1632973114",
 | 
			
		||||
          "vesting_periods": [
 | 
			
		||||
            {
 | 
			
		||||
              "length": "3937114",
 | 
			
		||||
              "amount": [
 | 
			
		||||
                {
 | 
			
		||||
                  "denom": "swp",
 | 
			
		||||
                  "amount": "684"
 | 
			
		||||
                }
 | 
			
		||||
              ]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "length": "28857600",
 | 
			
		||||
              "amount": [
 | 
			
		||||
                {
 | 
			
		||||
                  "denom": "swp",
 | 
			
		||||
                  "amount": "14791312"
 | 
			
		||||
                }
 | 
			
		||||
              ]
 | 
			
		||||
            }
 | 
			
		||||
          ]
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/ValidatorVestingAccount",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "address": "kava1h932rkxxhwf0gz3gq23qsnedgax5vwuxw4ufhy",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "denom": "ukava",
 | 
			
		||||
              "amount": "2499984990625"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "sequence": "0",
 | 
			
		||||
          "original_vesting": [
 | 
			
		||||
            {
 | 
			
		||||
              "denom": "ukava",
 | 
			
		||||
              "amount": "1499974990625"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "delegated_free": [],
 | 
			
		||||
          "delegated_vesting": [],
 | 
			
		||||
          "end_time": "1636120800",
 | 
			
		||||
          "start_time": "1572962400",
 | 
			
		||||
          "vesting_periods": [
 | 
			
		||||
            {
 | 
			
		||||
              "length": "31622400",
 | 
			
		||||
              "amount": [
 | 
			
		||||
                {
 | 
			
		||||
                  "denom": "ukava",
 | 
			
		||||
                  "amount": "416659707952"
 | 
			
		||||
                }
 | 
			
		||||
              ]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "length": "7948800",
 | 
			
		||||
              "amount": [
 | 
			
		||||
                {
 | 
			
		||||
                  "denom": "ukava",
 | 
			
		||||
                  "amount": "270828734420"
 | 
			
		||||
                }
 | 
			
		||||
              ]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "length": "7689600",
 | 
			
		||||
              "amount": [
 | 
			
		||||
                {
 | 
			
		||||
                  "denom": "ukava",
 | 
			
		||||
                  "amount": "270828734420"
 | 
			
		||||
                }
 | 
			
		||||
              ]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "length": "7948800",
 | 
			
		||||
              "amount": [
 | 
			
		||||
                {
 | 
			
		||||
                  "denom": "ukava",
 | 
			
		||||
                  "amount": "270828734420"
 | 
			
		||||
                }
 | 
			
		||||
              ]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "length": "7948800",
 | 
			
		||||
              "amount": [
 | 
			
		||||
                {
 | 
			
		||||
                  "denom": "ukava",
 | 
			
		||||
                  "amount": "270829079413"
 | 
			
		||||
                }
 | 
			
		||||
              ]
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "validator_address": "kavavalcons16mkm6ggf280kjtsxnvzur7tnqttgavj4mzr4zf",
 | 
			
		||||
          "return_address": "kava1qvsus5qg8yhre7k2c78xkkw4nvqqgev7ezrja8",
 | 
			
		||||
          "signing_threshold": "90",
 | 
			
		||||
          "current_period_progress": {
 | 
			
		||||
            "missed_blocks": "0",
 | 
			
		||||
            "total_blocks": "1"
 | 
			
		||||
          },
 | 
			
		||||
          "vesting_period_progress": [
 | 
			
		||||
            {
 | 
			
		||||
              "period_complete": false,
 | 
			
		||||
              "vesting_successful": false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "period_complete": false,
 | 
			
		||||
              "vesting_successful": false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "period_complete": false,
 | 
			
		||||
              "vesting_successful": false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "period_complete": false,
 | 
			
		||||
              "vesting_successful": false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "period_complete": false,
 | 
			
		||||
              "vesting_successful": false
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "debt_after_failed_vesting": []
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "140367",
 | 
			
		||||
          "address": "kava1kla4wl0ccv7u85cemvs3y987hqk0afcv7vue84",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "140267",
 | 
			
		||||
          "address": "kava14q5sawxdxtpap5x5sgzj7v4sp3ucncjlpuk3hs",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "address": "kava1tfvn5t8qwngqd2q427za2mel48pcus3z9u73fl",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "address": "kava1j9je7f6s0v6k7dmgv6u5k5ru202f5ffsc7af04",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "address": "kava1ektgdyy0z23qqnd67ns3qvfzgfgjd5xe82lf5c",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "10000000000000000",
 | 
			
		||||
              "denom": "busd"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "10000000000000000",
 | 
			
		||||
              "denom": "bnb"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "10000000000000000",
 | 
			
		||||
              "denom": "xrpb"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "10000000000000000",
 | 
			
		||||
              "denom": "btcb"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "10000000000000000",
 | 
			
		||||
              "denom": "hbtc"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "100000000000000000",
 | 
			
		||||
              "denom": "usdx"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000000000",
 | 
			
		||||
              "denom": "hard"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000000000",
 | 
			
		||||
              "denom": "swp"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "10000000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "address": "kava1g33w0mh4mjllhaj3y4dcwkwquxgwrma9ga5t94",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "address": "kava1ynf22ap74j6znl503a56y23x5stfr0aw5kntp8",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "address": "kava173w2zz287s36ewnnkf4mjansnthnnsz7rtrxqc",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "address": "kava1fwfwmt6vupf3m9uvpdsuuc4dga8p5dtl4npcqz",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "address": "kava1sw54s6gq76acm35ls6m5c0kr93dstgrh6eftld",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "address": "kava1t4dvu32e309pzhmdn3aqcjlj79h9876plynrfm",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "type": "cosmos-sdk/Account",
 | 
			
		||||
        "value": {
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "address": "kava1wuzhkn2f8nqe2aprnwt3jkjvvr9m7dlkpumtz2",
 | 
			
		||||
          "coins": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1000000000000",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "public_key": null,
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "params": {
 | 
			
		||||
      "max_memo_characters": "256",
 | 
			
		||||
      "sig_verify_cost_ed25519": "590",
 | 
			
		||||
      "sig_verify_cost_secp256k1": "1000",
 | 
			
		||||
      "tx_sig_limit": "7",
 | 
			
		||||
      "tx_size_cost_per_byte": "10"
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "bank": {
 | 
			
		||||
    "send_enabled": true
 | 
			
		||||
  },
 | 
			
		||||
  "supply": {
 | 
			
		||||
    "supply": [
 | 
			
		||||
      {
 | 
			
		||||
        "amount": "30467659434006",
 | 
			
		||||
        "denom": "bnb"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "amount": "107149210616",
 | 
			
		||||
        "denom": "btcb"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "amount": "10290947060016617",
 | 
			
		||||
        "denom": "busd"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "amount": "149509607333687",
 | 
			
		||||
        "denom": "debt"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "amount": "200000000000000",
 | 
			
		||||
        "denom": "hard"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "amount": "50000000000",
 | 
			
		||||
        "denom": "hbtc"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "amount": "250000000000000",
 | 
			
		||||
        "denom": "swp"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "amount": "149780247604867",
 | 
			
		||||
        "denom": "ukava"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "amount": "149509607333687",
 | 
			
		||||
        "denom": "usdx"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "amount": "4126898198548806",
 | 
			
		||||
        "denom": "xrpb"
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										342
									
								
								migrate/v0_16/testdata/appstate-bank-v16.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										342
									
								
								migrate/v0_16/testdata/appstate-bank-v16.json
									
									
									
									
										vendored
									
									
								
							@ -1,342 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "auth": {
 | 
			
		||||
    "params": {
 | 
			
		||||
      "max_memo_characters": "256",
 | 
			
		||||
      "tx_sig_limit": "7",
 | 
			
		||||
      "tx_size_cost_per_byte": "10",
 | 
			
		||||
      "sig_verify_cost_ed25519": "590",
 | 
			
		||||
      "sig_verify_cost_secp256k1": "1000"
 | 
			
		||||
    },
 | 
			
		||||
    "accounts": [
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.ModuleAccount",
 | 
			
		||||
        "base_account": {
 | 
			
		||||
          "address": "kava1cj7njkw2g9fqx4e768zc75dp9sks8u9znxrf0w",
 | 
			
		||||
          "pub_key": null,
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "sequence": "0"
 | 
			
		||||
        },
 | 
			
		||||
        "name": "kavadist",
 | 
			
		||||
        "permissions": ["minter"]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.ModuleAccount",
 | 
			
		||||
        "base_account": {
 | 
			
		||||
          "address": "kava1a42xtwfzphuuu9mdp0es6633wu5mm8fhm789v3",
 | 
			
		||||
          "pub_key": null,
 | 
			
		||||
          "account_number": "0",
 | 
			
		||||
          "sequence": "1"
 | 
			
		||||
        },
 | 
			
		||||
        "name": "hard",
 | 
			
		||||
        "permissions": ["minter", "burner"]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.ModuleAccount",
 | 
			
		||||
        "base_account": {
 | 
			
		||||
          "address": "kava1mfru9azs5nua2wxcd4sq64g5nt7nn4n8s2w8cu",
 | 
			
		||||
          "pub_key": null,
 | 
			
		||||
          "account_number": "32",
 | 
			
		||||
          "sequence": "3"
 | 
			
		||||
        },
 | 
			
		||||
        "name": "swap",
 | 
			
		||||
        "permissions": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1ypjp0m04pyp73hwgtc0dgkx0e9rrydecm054da",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1agcvt07tcw0tglu0hmwdecsnuxp2yd45f3avgm",
 | 
			
		||||
        "pub_key": {
 | 
			
		||||
          "@type": "/cosmos.crypto.secp256k1.PubKey",
 | 
			
		||||
          "key": "A7WkS5eJAiPE/gl7n4I5qa5JsREvQM5fkdgCEPhNfj0h"
 | 
			
		||||
        },
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1z3ytjpr6ancl8gw80z6f47z9smug7986x29vtj",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.vesting.v1beta1.PeriodicVestingAccount",
 | 
			
		||||
        "base_vesting_account": {
 | 
			
		||||
          "base_account": {
 | 
			
		||||
            "address": "kava1jun8w7meyvgxl68fsjrsdhnv87zursv7dwlgee",
 | 
			
		||||
            "pub_key": null,
 | 
			
		||||
            "account_number": "0",
 | 
			
		||||
            "sequence": "0"
 | 
			
		||||
          },
 | 
			
		||||
          "original_vesting": [
 | 
			
		||||
            {
 | 
			
		||||
              "denom": "swp",
 | 
			
		||||
              "amount": "14791312"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "delegated_free": [],
 | 
			
		||||
          "delegated_vesting": [],
 | 
			
		||||
          "end_time": "1665767828"
 | 
			
		||||
        },
 | 
			
		||||
        "start_time": "1638284400",
 | 
			
		||||
        "vesting_periods": [
 | 
			
		||||
          {
 | 
			
		||||
            "length": "27483428",
 | 
			
		||||
            "amount": [
 | 
			
		||||
              {
 | 
			
		||||
                "denom": "swp",
 | 
			
		||||
                "amount": "14791312"
 | 
			
		||||
              }
 | 
			
		||||
            ]
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1h932rkxxhwf0gz3gq23qsnedgax5vwuxw4ufhy",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1kla4wl0ccv7u85cemvs3y987hqk0afcv7vue84",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "140367",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava14q5sawxdxtpap5x5sgzj7v4sp3ucncjlpuk3hs",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "140267",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1tfvn5t8qwngqd2q427za2mel48pcus3z9u73fl",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1j9je7f6s0v6k7dmgv6u5k5ru202f5ffsc7af04",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1ektgdyy0z23qqnd67ns3qvfzgfgjd5xe82lf5c",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1g33w0mh4mjllhaj3y4dcwkwquxgwrma9ga5t94",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1ynf22ap74j6znl503a56y23x5stfr0aw5kntp8",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava173w2zz287s36ewnnkf4mjansnthnnsz7rtrxqc",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1fwfwmt6vupf3m9uvpdsuuc4dga8p5dtl4npcqz",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1sw54s6gq76acm35ls6m5c0kr93dstgrh6eftld",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1t4dvu32e309pzhmdn3aqcjlj79h9876plynrfm",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "@type": "/cosmos.auth.v1beta1.BaseAccount",
 | 
			
		||||
        "address": "kava1wuzhkn2f8nqe2aprnwt3jkjvvr9m7dlkpumtz2",
 | 
			
		||||
        "pub_key": null,
 | 
			
		||||
        "account_number": "0",
 | 
			
		||||
        "sequence": "0"
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  "bank": {
 | 
			
		||||
    "params": { "send_enabled": [], "default_send_enabled": true },
 | 
			
		||||
    "balances": [
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1cj7njkw2g9fqx4e768zc75dp9sks8u9znxrf0w",
 | 
			
		||||
        "coins": [
 | 
			
		||||
          {
 | 
			
		||||
            "denom": "hard",
 | 
			
		||||
            "amount": "1000000000000"
 | 
			
		||||
          },
 | 
			
		||||
          { "denom": "swp", "amount": "1000000000000" },
 | 
			
		||||
          { "denom": "ukava", "amount": "1000000000000" }
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1a42xtwfzphuuu9mdp0es6633wu5mm8fhm789v3",
 | 
			
		||||
        "coins": [{ "denom": "usdx", "amount": "1000000000" }]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1mfru9azs5nua2wxcd4sq64g5nt7nn4n8s2w8cu",
 | 
			
		||||
        "coins": [
 | 
			
		||||
          { "denom": "ukava", "amount": "1000000000000" },
 | 
			
		||||
          { "denom": "usdx", "amount": "4100000000000" }
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1ypjp0m04pyp73hwgtc0dgkx0e9rrydecm054da",
 | 
			
		||||
        "coins": [{ "denom": "ukava", "amount": "1000000000000" }]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1n96qpdfcz2m7y364ewk8srv9zuq6ucwduyjaag",
 | 
			
		||||
        "coins": [{ "denom": "ukava", "amount": "1000000000000" }]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1agcvt07tcw0tglu0hmwdecsnuxp2yd45f3avgm",
 | 
			
		||||
        "coins": [
 | 
			
		||||
          { "denom": "bnb", "amount": "100000000000000" },
 | 
			
		||||
          { "denom": "ukava", "amount": "1000000000000" }
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1z3ytjpr6ancl8gw80z6f47z9smug7986x29vtj",
 | 
			
		||||
        "coins": [
 | 
			
		||||
          { "denom": "ukava", "amount": "565077579" },
 | 
			
		||||
          { "denom": "usdx", "amount": "1363200" }
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1jun8w7meyvgxl68fsjrsdhnv87zursv7dwlgee",
 | 
			
		||||
        "coins": [
 | 
			
		||||
          { "denom": "swp", "amount": "15915874" },
 | 
			
		||||
          { "denom": "ukava", "amount": "1000000" }
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1h932rkxxhwf0gz3gq23qsnedgax5vwuxw4ufhy",
 | 
			
		||||
        "coins": [{ "denom": "ukava", "amount": "2499984990625" }]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1kla4wl0ccv7u85cemvs3y987hqk0afcv7vue84",
 | 
			
		||||
        "coins": [{ "denom": "ukava", "amount": "1000000000000" }]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava14q5sawxdxtpap5x5sgzj7v4sp3ucncjlpuk3hs",
 | 
			
		||||
        "coins": [{ "denom": "ukava", "amount": "1000000000000" }]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1tfvn5t8qwngqd2q427za2mel48pcus3z9u73fl",
 | 
			
		||||
        "coins": [{ "denom": "ukava", "amount": "1000000000000" }]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1j9je7f6s0v6k7dmgv6u5k5ru202f5ffsc7af04",
 | 
			
		||||
        "coins": [{ "denom": "ukava", "amount": "1000000000000" }]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1ektgdyy0z23qqnd67ns3qvfzgfgjd5xe82lf5c",
 | 
			
		||||
        "coins": [
 | 
			
		||||
          { "denom": "bnb", "amount": "10000000000000000" },
 | 
			
		||||
          { "denom": "btcb", "amount": "10000000000000000" },
 | 
			
		||||
          { "denom": "busd", "amount": "10000000000000000" },
 | 
			
		||||
          { "denom": "hard", "amount": "1000000000000000000" },
 | 
			
		||||
          { "denom": "hbtc", "amount": "10000000000000000" },
 | 
			
		||||
          { "denom": "swp", "amount": "1000000000000000000" },
 | 
			
		||||
          { "denom": "ukava", "amount": "10000000000000000" },
 | 
			
		||||
          { "denom": "usdx", "amount": "100000000000000000" },
 | 
			
		||||
          { "denom": "xrpb", "amount": "10000000000000000" }
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1g33w0mh4mjllhaj3y4dcwkwquxgwrma9ga5t94",
 | 
			
		||||
        "coins": [{ "denom": "ukava", "amount": "1000000000000" }]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1ynf22ap74j6znl503a56y23x5stfr0aw5kntp8",
 | 
			
		||||
        "coins": [{ "denom": "ukava", "amount": "1000000000000" }]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1acge4tcvhf3q6fh53fgwaa7vsq40wvx6wn50em",
 | 
			
		||||
        "coins": [{ "denom": "ukava", "amount": "1000000000000" }]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava173w2zz287s36ewnnkf4mjansnthnnsz7rtrxqc",
 | 
			
		||||
        "coins": [{ "denom": "ukava", "amount": "1000000000000" }]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1fwfwmt6vupf3m9uvpdsuuc4dga8p5dtl4npcqz",
 | 
			
		||||
        "coins": [{ "denom": "ukava", "amount": "1000000000000" }]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1sw54s6gq76acm35ls6m5c0kr93dstgrh6eftld",
 | 
			
		||||
        "coins": [{ "denom": "ukava", "amount": "1000000000000" }]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1t4dvu32e309pzhmdn3aqcjlj79h9876plynrfm",
 | 
			
		||||
        "coins": [{ "denom": "ukava", "amount": "1000000000000" }]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kava1wuzhkn2f8nqe2aprnwt3jkjvvr9m7dlkpumtz2",
 | 
			
		||||
        "coins": [{ "denom": "ukava", "amount": "1000000000000" }]
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "supply": [
 | 
			
		||||
      { "denom": "bnb", "amount": "30467659434006" },
 | 
			
		||||
      { "denom": "btcb", "amount": "107149210616" },
 | 
			
		||||
      { "denom": "busd", "amount": "10290947060016617" },
 | 
			
		||||
      { "denom": "debt", "amount": "149509607333687" },
 | 
			
		||||
      { "denom": "hard", "amount": "200000000000000" },
 | 
			
		||||
      { "denom": "hbtc", "amount": "50000000000" },
 | 
			
		||||
      { "denom": "swp", "amount": "250000000000000" },
 | 
			
		||||
      { "denom": "ukava", "amount": "149780247604867" },
 | 
			
		||||
      { "denom": "usdx", "amount": "149509607333687" },
 | 
			
		||||
      { "denom": "xrpb", "amount": "4126898198548806" }
 | 
			
		||||
    ],
 | 
			
		||||
    "denom_metadata": []
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										63
									
								
								migrate/v0_16/testdata/appstate-cosmos-v15.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										63
									
								
								migrate/v0_16/testdata/appstate-cosmos-v15.json
									
									
									
									
										vendored
									
									
								
							@ -1,63 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "crisis": {
 | 
			
		||||
    "constant_fee": {
 | 
			
		||||
      "amount": "1333000000",
 | 
			
		||||
      "denom": "ukava"
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "evidence": {
 | 
			
		||||
    "evidence": null,
 | 
			
		||||
    "params": {
 | 
			
		||||
      "max_evidence_age": "1814400000000000"
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "genutil": {
 | 
			
		||||
    "gentxs": []
 | 
			
		||||
  },
 | 
			
		||||
  "mint": {
 | 
			
		||||
    "minter": {
 | 
			
		||||
      "annual_provisions": "29956047968909.000000000000000000",
 | 
			
		||||
      "inflation": "0.200000000000000000"
 | 
			
		||||
    },
 | 
			
		||||
    "params": {
 | 
			
		||||
      "blocks_per_year": "5256000",
 | 
			
		||||
      "goal_bonded": "0.670000000000000000",
 | 
			
		||||
      "inflation_max": "0.200000000000000000",
 | 
			
		||||
      "inflation_min": "0.150000000000000000",
 | 
			
		||||
      "inflation_rate_change": "0.130000000000000000",
 | 
			
		||||
      "mint_denom": "ukava"
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "params": null,
 | 
			
		||||
  "slashing": {
 | 
			
		||||
    "missed_blocks": {
 | 
			
		||||
      "kavavalcons1029jhm4lz26q78ftrmazf8hw7lmrt08l2vq3cs": [
 | 
			
		||||
        {
 | 
			
		||||
          "index": "3538",
 | 
			
		||||
          "missed": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "index": "3539",
 | 
			
		||||
          "missed": false
 | 
			
		||||
        }
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    "params": {
 | 
			
		||||
      "downtime_jail_duration": "600000000000",
 | 
			
		||||
      "min_signed_per_window": "0.050000000000000000",
 | 
			
		||||
      "signed_blocks_window": "10000",
 | 
			
		||||
      "slash_fraction_double_sign": "0.050000000000000000",
 | 
			
		||||
      "slash_fraction_downtime": "0.000100000000000000"
 | 
			
		||||
    },
 | 
			
		||||
    "signing_infos": {
 | 
			
		||||
      "kavavalcons1wy67mmvmr2ge6apmtfykhnqpejtnd0apaktk72": {
 | 
			
		||||
        "address": "kavavalcons1wy67mmvmr2ge6apmtfykhnqpejtnd0apaktk72",
 | 
			
		||||
        "index_offset": "1058101",
 | 
			
		||||
        "jailed_until": "2021-08-14T05:05:11.063230794Z",
 | 
			
		||||
        "missed_blocks_counter": "2",
 | 
			
		||||
        "start_height": "0",
 | 
			
		||||
        "tombstoned": false
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										53
									
								
								migrate/v0_16/testdata/appstate-cosmos-v16.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										53
									
								
								migrate/v0_16/testdata/appstate-cosmos-v16.json
									
									
									
									
										vendored
									
									
								
							@ -1,53 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "crisis": { "constant_fee": { "denom": "ukava", "amount": "1333000000" } },
 | 
			
		||||
  "evidence": { "evidence": [] },
 | 
			
		||||
  "genutil": {
 | 
			
		||||
    "gen_txs": []
 | 
			
		||||
  },
 | 
			
		||||
  "mint": {
 | 
			
		||||
    "minter": {
 | 
			
		||||
      "inflation": "0.200000000000000000",
 | 
			
		||||
      "annual_provisions": "29956047968909.000000000000000000"
 | 
			
		||||
    },
 | 
			
		||||
    "params": {
 | 
			
		||||
      "mint_denom": "ukava",
 | 
			
		||||
      "inflation_rate_change": "0.130000000000000000",
 | 
			
		||||
      "inflation_max": "0.200000000000000000",
 | 
			
		||||
      "inflation_min": "0.150000000000000000",
 | 
			
		||||
      "goal_bonded": "0.670000000000000000",
 | 
			
		||||
      "blocks_per_year": "5256000"
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "params": null,
 | 
			
		||||
  "slashing": {
 | 
			
		||||
    "params": {
 | 
			
		||||
      "signed_blocks_window": "10000",
 | 
			
		||||
      "min_signed_per_window": "0.050000000000000000",
 | 
			
		||||
      "downtime_jail_duration": "600s",
 | 
			
		||||
      "slash_fraction_double_sign": "0.050000000000000000",
 | 
			
		||||
      "slash_fraction_downtime": "0.000100000000000000"
 | 
			
		||||
    },
 | 
			
		||||
    "signing_infos": [
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kavavalcons1wy67mmvmr2ge6apmtfykhnqpejtnd0apaktk72",
 | 
			
		||||
        "validator_signing_info": {
 | 
			
		||||
          "address": "kavavalcons1wy67mmvmr2ge6apmtfykhnqpejtnd0apaktk72",
 | 
			
		||||
          "start_height": "0",
 | 
			
		||||
          "index_offset": "1058101",
 | 
			
		||||
          "jailed_until": "2021-08-14T05:05:11.063230794Z",
 | 
			
		||||
          "tombstoned": false,
 | 
			
		||||
          "missed_blocks_counter": "2"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "missed_blocks": [
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kavavalcons1029jhm4lz26q78ftrmazf8hw7lmrt08l2vq3cs",
 | 
			
		||||
        "missed_blocks": [
 | 
			
		||||
          { "index": "3538", "missed": false },
 | 
			
		||||
          { "index": "3539", "missed": false }
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -1,132 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "distribution": {
 | 
			
		||||
    "delegator_starting_infos": [
 | 
			
		||||
      {
 | 
			
		||||
        "delegator_address": "kava1qyc2cfl0nw8r95dsdw534x99wq0xcj9rksmhx4",
 | 
			
		||||
        "starting_info": {
 | 
			
		||||
          "creation_height": "0",
 | 
			
		||||
          "previous_period": "1",
 | 
			
		||||
          "stake": "2998500334.489037908092278841"
 | 
			
		||||
        },
 | 
			
		||||
        "validator_address": "kavavaloper1qyc2cfl0nw8r95dsdw534x99wq0xcj9rmxpl7z"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "delegator_withdraw_infos": [],
 | 
			
		||||
    "fee_pool": {
 | 
			
		||||
      "community_pool": [
 | 
			
		||||
        {
 | 
			
		||||
          "amount": "16.000000000000000000",
 | 
			
		||||
          "denom": "hard"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "amount": "895205479550.000000000000000000",
 | 
			
		||||
          "denom": "swp"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "amount": "10026788897860.477125780244640707",
 | 
			
		||||
          "denom": "ukava"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "amount": "8830.545647782965054425",
 | 
			
		||||
          "denom": "usdx"
 | 
			
		||||
        }
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    "outstanding_rewards": [
 | 
			
		||||
      {
 | 
			
		||||
        "outstanding_rewards": null,
 | 
			
		||||
        "validator_address": "kavavaloper1lv04hlf9tsmha42vd6yetf4r9g0tf3l36v243v"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "outstanding_rewards": [
 | 
			
		||||
          {
 | 
			
		||||
            "amount": "11080916.970485109335869445",
 | 
			
		||||
            "denom": "ukava"
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "amount": "0.649424494235324733",
 | 
			
		||||
            "denom": "usdx"
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        "validator_address": "kavavaloper1leujfugjvuhxqdwlmc7hezra6j5fugk75ttlaa"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "params": {
 | 
			
		||||
      "base_proposer_reward": "0.010000000000000000",
 | 
			
		||||
      "bonus_proposer_reward": "0.040000000000000000",
 | 
			
		||||
      "community_tax": "0.000000000000000000",
 | 
			
		||||
      "withdraw_addr_enabled": false
 | 
			
		||||
    },
 | 
			
		||||
    "previous_proposer": "kavavalcons198lz0kngm8eeyfwxlp42rtt4kt3aswsc63tf6t",
 | 
			
		||||
    "validator_accumulated_commissions": [
 | 
			
		||||
      {
 | 
			
		||||
        "accumulated": null,
 | 
			
		||||
        "validator_address": "kavavaloper1lv04hlf9tsmha42vd6yetf4r9g0tf3l36v243v"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "accumulated": [
 | 
			
		||||
          {
 | 
			
		||||
            "amount": "3686239.375558734707570950",
 | 
			
		||||
            "denom": "ukava"
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "amount": "0.479786725383815797",
 | 
			
		||||
            "denom": "usdx"
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        "validator_address": "kavavaloper1leujfugjvuhxqdwlmc7hezra6j5fugk75ttlaa"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "validator_current_rewards": [
 | 
			
		||||
      {
 | 
			
		||||
        "rewards": {
 | 
			
		||||
          "period": "12",
 | 
			
		||||
          "rewards": null
 | 
			
		||||
        },
 | 
			
		||||
        "validator_address": "kavavaloper1lv04hlf9tsmha42vd6yetf4r9g0tf3l36v243v"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "rewards": {
 | 
			
		||||
          "period": "55",
 | 
			
		||||
          "rewards": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "1573825.556046395044080460",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            }
 | 
			
		||||
          ]
 | 
			
		||||
        },
 | 
			
		||||
        "validator_address": "kavavaloper1leujfugjvuhxqdwlmc7hezra6j5fugk75ttlaa"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "validator_historical_rewards": [
 | 
			
		||||
      {
 | 
			
		||||
        "period": "40888",
 | 
			
		||||
        "rewards": {
 | 
			
		||||
          "cumulative_reward_ratio": [
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "0.051970252339178715",
 | 
			
		||||
              "denom": "ukava"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "amount": "0.000000007223525470",
 | 
			
		||||
              "denom": "usdx"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "reference_count": 1
 | 
			
		||||
        },
 | 
			
		||||
        "validator_address": "kavavaloper1ppj7c8tqt2e3rzqtmztsmd6ea6u3nz6qggcp5e"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "validator_slash_events": [
 | 
			
		||||
      {
 | 
			
		||||
        "height": "10001",
 | 
			
		||||
        "period": "5",
 | 
			
		||||
        "validator_address": "kavavaloper1u3yuwhuh46nqjvw5pjy6krpcksfm0nyeujw8jz",
 | 
			
		||||
        "validator_slash_event": {
 | 
			
		||||
          "fraction": "0.000099999627751999",
 | 
			
		||||
          "validator_period": "5"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -1,98 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "distribution": {
 | 
			
		||||
    "params": {
 | 
			
		||||
      "community_tax": "0.000000000000000000",
 | 
			
		||||
      "base_proposer_reward": "0.010000000000000000",
 | 
			
		||||
      "bonus_proposer_reward": "0.040000000000000000",
 | 
			
		||||
      "withdraw_addr_enabled": false
 | 
			
		||||
    },
 | 
			
		||||
    "fee_pool": {
 | 
			
		||||
      "community_pool": [
 | 
			
		||||
        { "denom": "hard", "amount": "16.000000000000000000" },
 | 
			
		||||
        { "denom": "swp", "amount": "895205479550.000000000000000000" },
 | 
			
		||||
        { "denom": "ukava", "amount": "10026788897860.477125780244640707" },
 | 
			
		||||
        { "denom": "usdx", "amount": "8830.545647782965054425" }
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    "delegator_withdraw_infos": [],
 | 
			
		||||
    "previous_proposer": "kavavalcons198lz0kngm8eeyfwxlp42rtt4kt3aswsc63tf6t",
 | 
			
		||||
    "outstanding_rewards": [
 | 
			
		||||
      {
 | 
			
		||||
        "validator_address": "kavavaloper1lv04hlf9tsmha42vd6yetf4r9g0tf3l36v243v",
 | 
			
		||||
        "outstanding_rewards": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "validator_address": "kavavaloper1leujfugjvuhxqdwlmc7hezra6j5fugk75ttlaa",
 | 
			
		||||
        "outstanding_rewards": [
 | 
			
		||||
          { "denom": "ukava", "amount": "11080916.970485109335869445" },
 | 
			
		||||
          { "denom": "usdx", "amount": "0.649424494235324733" }
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "validator_accumulated_commissions": [
 | 
			
		||||
      {
 | 
			
		||||
        "validator_address": "kavavaloper1lv04hlf9tsmha42vd6yetf4r9g0tf3l36v243v",
 | 
			
		||||
        "accumulated": { "commission": [] }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "validator_address": "kavavaloper1leujfugjvuhxqdwlmc7hezra6j5fugk75ttlaa",
 | 
			
		||||
        "accumulated": {
 | 
			
		||||
          "commission": [
 | 
			
		||||
            { "denom": "ukava", "amount": "3686239.375558734707570950" },
 | 
			
		||||
            { "denom": "usdx", "amount": "0.479786725383815797" }
 | 
			
		||||
          ]
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "validator_historical_rewards": [
 | 
			
		||||
      {
 | 
			
		||||
        "validator_address": "kavavaloper1ppj7c8tqt2e3rzqtmztsmd6ea6u3nz6qggcp5e",
 | 
			
		||||
        "period": "40888",
 | 
			
		||||
        "rewards": {
 | 
			
		||||
          "cumulative_reward_ratio": [
 | 
			
		||||
            { "denom": "ukava", "amount": "0.051970252339178715" },
 | 
			
		||||
            { "denom": "usdx", "amount": "0.000000007223525470" }
 | 
			
		||||
          ],
 | 
			
		||||
          "reference_count": 1
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "validator_current_rewards": [
 | 
			
		||||
      {
 | 
			
		||||
        "validator_address": "kavavaloper1lv04hlf9tsmha42vd6yetf4r9g0tf3l36v243v",
 | 
			
		||||
        "rewards": { "rewards": [], "period": "12" }
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "validator_address": "kavavaloper1leujfugjvuhxqdwlmc7hezra6j5fugk75ttlaa",
 | 
			
		||||
        "rewards": {
 | 
			
		||||
          "rewards": [
 | 
			
		||||
            { "denom": "ukava", "amount": "1573825.556046395044080460" }
 | 
			
		||||
          ],
 | 
			
		||||
          "period": "55"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "delegator_starting_infos": [
 | 
			
		||||
      {
 | 
			
		||||
        "delegator_address": "kava1qyc2cfl0nw8r95dsdw534x99wq0xcj9rksmhx4",
 | 
			
		||||
        "validator_address": "kavavaloper1qyc2cfl0nw8r95dsdw534x99wq0xcj9rmxpl7z",
 | 
			
		||||
        "starting_info": {
 | 
			
		||||
          "previous_period": "1",
 | 
			
		||||
          "stake": "2998500334.489037908092278841",
 | 
			
		||||
          "height": "0"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "validator_slash_events": [
 | 
			
		||||
      {
 | 
			
		||||
        "validator_address": "kavavaloper1u3yuwhuh46nqjvw5pjy6krpcksfm0nyeujw8jz",
 | 
			
		||||
        "height": "10001",
 | 
			
		||||
        "period": "5",
 | 
			
		||||
        "validator_slash_event": {
 | 
			
		||||
          "validator_period": "5",
 | 
			
		||||
          "fraction": "0.000099999627751999"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										127
									
								
								migrate/v0_16/testdata/appstate-gov-v15.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										127
									
								
								migrate/v0_16/testdata/appstate-gov-v15.json
									
									
									
									
										vendored
									
									
								
							@ -1,127 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "gov": {
 | 
			
		||||
    "deposit_params": {
 | 
			
		||||
      "max_deposit_period": "600000000000",
 | 
			
		||||
      "min_deposit": [{ "amount": "200000000", "denom": "ukava" }]
 | 
			
		||||
    },
 | 
			
		||||
    "deposits": null,
 | 
			
		||||
    "proposals": [
 | 
			
		||||
      {
 | 
			
		||||
        "content": {
 | 
			
		||||
          "type": "cosmos-sdk/TextProposal",
 | 
			
		||||
          "value": {
 | 
			
		||||
            "description": "test",
 | 
			
		||||
            "title": "Nominate Kava Stability Committee"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "deposit_end_time": "2020-05-27T00:03:48.610420744Z",
 | 
			
		||||
        "final_tally_result": {
 | 
			
		||||
          "abstain": "388367903902",
 | 
			
		||||
          "no": "0",
 | 
			
		||||
          "no_with_veto": "0",
 | 
			
		||||
          "yes": "45414514436439"
 | 
			
		||||
        },
 | 
			
		||||
        "id": "5",
 | 
			
		||||
        "proposal_status": "Passed",
 | 
			
		||||
        "submit_time": "2020-05-13T00:03:48.610420744Z",
 | 
			
		||||
        "total_deposit": [
 | 
			
		||||
          {
 | 
			
		||||
            "amount": "1100000000",
 | 
			
		||||
            "denom": "ukava"
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        "voting_end_time": "2020-05-30T02:13:16.534185463Z",
 | 
			
		||||
        "voting_start_time": "2020-05-16T02:13:16.534185463Z"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "content": {
 | 
			
		||||
          "type": "cosmos-sdk/ParameterChangeProposal",
 | 
			
		||||
          "value": {
 | 
			
		||||
            "changes": [
 | 
			
		||||
              {
 | 
			
		||||
                "key": "sendenabled",
 | 
			
		||||
                "subspace": "bank",
 | 
			
		||||
                "value": "true"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "description": "Enable transactions",
 | 
			
		||||
            "title": "Enable Transactions Param Change"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "deposit_end_time": "2019-11-30T18:31:15.707527932Z",
 | 
			
		||||
        "final_tally_result": {
 | 
			
		||||
          "abstain": "0",
 | 
			
		||||
          "no": "0",
 | 
			
		||||
          "no_with_veto": "0",
 | 
			
		||||
          "yes": "56424920427790"
 | 
			
		||||
        },
 | 
			
		||||
        "id": "1",
 | 
			
		||||
        "proposal_status": "Passed",
 | 
			
		||||
        "submit_time": "2019-11-16T18:31:15.707527932Z",
 | 
			
		||||
        "total_deposit": [
 | 
			
		||||
          {
 | 
			
		||||
            "amount": "1024601000",
 | 
			
		||||
            "denom": "ukava"
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        "voting_end_time": "2019-12-03T02:48:16.507225189Z",
 | 
			
		||||
        "voting_start_time": "2019-11-19T02:48:16.507225189Z"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "content": {
 | 
			
		||||
          "type": "kava/CommunityPoolMultiSpendProposal",
 | 
			
		||||
          "value": {
 | 
			
		||||
            "description": "Test multi spend",
 | 
			
		||||
            "recipient_list": [
 | 
			
		||||
              {
 | 
			
		||||
                "address": "kava1vnymr7yzccxm6dtudczdawnmsj9664j4u9d7hq",
 | 
			
		||||
                "amount": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "amount": "125000000",
 | 
			
		||||
                    "denom": "swp"
 | 
			
		||||
                  }
 | 
			
		||||
                ]
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "address": "kava19c069thwekzlfedw4n23us762n7hf3tgxkez6c",
 | 
			
		||||
                "amount": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "amount": "125000000",
 | 
			
		||||
                    "denom": "swp"
 | 
			
		||||
                  }
 | 
			
		||||
                ]
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "title": "Kava Swap incentivized testnet winner payouts"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "deposit_end_time": "2021-10-11T14:16:06.431414048Z",
 | 
			
		||||
        "final_tally_result": {
 | 
			
		||||
          "abstain": "628394106179",
 | 
			
		||||
          "no": "8857306862926",
 | 
			
		||||
          "no_with_veto": "4093971",
 | 
			
		||||
          "yes": "1600056548411"
 | 
			
		||||
        },
 | 
			
		||||
        "id": "63",
 | 
			
		||||
        "proposal_status": "Rejected",
 | 
			
		||||
        "submit_time": "2021-09-27T14:16:06.431414048Z",
 | 
			
		||||
        "total_deposit": [
 | 
			
		||||
          {
 | 
			
		||||
            "amount": "1000000000",
 | 
			
		||||
            "denom": "ukava"
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        "voting_end_time": "2021-10-04T14:16:06.431414048Z",
 | 
			
		||||
        "voting_start_time": "2021-09-27T14:16:06.431414048Z"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "starting_proposal_id": "1",
 | 
			
		||||
    "tally_params": {
 | 
			
		||||
      "quorum": "0.334000000000000000",
 | 
			
		||||
      "threshold": "0.500000000000000000",
 | 
			
		||||
      "veto": "0.334000000000000000"
 | 
			
		||||
    },
 | 
			
		||||
    "votes": null,
 | 
			
		||||
    "voting_params": { "voting_period": "600000000000" }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										92
									
								
								migrate/v0_16/testdata/appstate-gov-v16.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										92
									
								
								migrate/v0_16/testdata/appstate-gov-v16.json
									
									
									
									
										vendored
									
									
								
							@ -1,92 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "gov": {
 | 
			
		||||
    "starting_proposal_id": "1",
 | 
			
		||||
    "deposits": [],
 | 
			
		||||
    "votes": [],
 | 
			
		||||
    "proposals": [
 | 
			
		||||
      {
 | 
			
		||||
        "proposal_id": "5",
 | 
			
		||||
        "content": {
 | 
			
		||||
          "@type": "/cosmos.gov.v1beta1.TextProposal",
 | 
			
		||||
          "title": "Nominate Kava Stability Committee",
 | 
			
		||||
          "description": "test"
 | 
			
		||||
        },
 | 
			
		||||
        "status": "PROPOSAL_STATUS_PASSED",
 | 
			
		||||
        "final_tally_result": {
 | 
			
		||||
          "yes": "45414514436439",
 | 
			
		||||
          "abstain": "388367903902",
 | 
			
		||||
          "no": "0",
 | 
			
		||||
          "no_with_veto": "0"
 | 
			
		||||
        },
 | 
			
		||||
        "submit_time": "2020-05-13T00:03:48.610420744Z",
 | 
			
		||||
        "deposit_end_time": "2020-05-27T00:03:48.610420744Z",
 | 
			
		||||
        "total_deposit": [{ "denom": "ukava", "amount": "1100000000" }],
 | 
			
		||||
        "voting_start_time": "2020-05-16T02:13:16.534185463Z",
 | 
			
		||||
        "voting_end_time": "2020-05-30T02:13:16.534185463Z"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "proposal_id": "1",
 | 
			
		||||
        "content": {
 | 
			
		||||
          "@type": "/cosmos.params.v1beta1.ParameterChangeProposal",
 | 
			
		||||
          "title": "Enable Transactions Param Change",
 | 
			
		||||
          "description": "Enable transactions",
 | 
			
		||||
          "changes": [
 | 
			
		||||
            { "subspace": "bank", "key": "sendenabled", "value": "true" }
 | 
			
		||||
          ]
 | 
			
		||||
        },
 | 
			
		||||
        "status": "PROPOSAL_STATUS_PASSED",
 | 
			
		||||
        "final_tally_result": {
 | 
			
		||||
          "yes": "56424920427790",
 | 
			
		||||
          "abstain": "0",
 | 
			
		||||
          "no": "0",
 | 
			
		||||
          "no_with_veto": "0"
 | 
			
		||||
        },
 | 
			
		||||
        "submit_time": "2019-11-16T18:31:15.707527932Z",
 | 
			
		||||
        "deposit_end_time": "2019-11-30T18:31:15.707527932Z",
 | 
			
		||||
        "total_deposit": [{ "denom": "ukava", "amount": "1024601000" }],
 | 
			
		||||
        "voting_start_time": "2019-11-19T02:48:16.507225189Z",
 | 
			
		||||
        "voting_end_time": "2019-12-03T02:48:16.507225189Z"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "proposal_id": "63",
 | 
			
		||||
        "content": {
 | 
			
		||||
          "@type": "/kava.kavadist.v1beta1.CommunityPoolMultiSpendProposal",
 | 
			
		||||
          "title": "Kava Swap incentivized testnet winner payouts",
 | 
			
		||||
          "description": "Test multi spend",
 | 
			
		||||
          "recipient_list": [
 | 
			
		||||
            {
 | 
			
		||||
              "address": "kava1vnymr7yzccxm6dtudczdawnmsj9664j4u9d7hq",
 | 
			
		||||
              "amount": [{ "denom": "swp", "amount": "125000000" }]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "address": "kava19c069thwekzlfedw4n23us762n7hf3tgxkez6c",
 | 
			
		||||
              "amount": [{ "denom": "swp", "amount": "125000000" }]
 | 
			
		||||
            }
 | 
			
		||||
          ]
 | 
			
		||||
        },
 | 
			
		||||
        "status": "PROPOSAL_STATUS_REJECTED",
 | 
			
		||||
        "final_tally_result": {
 | 
			
		||||
          "yes": "1600056548411",
 | 
			
		||||
          "abstain": "628394106179",
 | 
			
		||||
          "no": "8857306862926",
 | 
			
		||||
          "no_with_veto": "4093971"
 | 
			
		||||
        },
 | 
			
		||||
        "submit_time": "2021-09-27T14:16:06.431414048Z",
 | 
			
		||||
        "deposit_end_time": "2021-10-11T14:16:06.431414048Z",
 | 
			
		||||
        "total_deposit": [{ "denom": "ukava", "amount": "1000000000" }],
 | 
			
		||||
        "voting_start_time": "2021-09-27T14:16:06.431414048Z",
 | 
			
		||||
        "voting_end_time": "2021-10-04T14:16:06.431414048Z"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "deposit_params": {
 | 
			
		||||
      "min_deposit": [{ "denom": "ukava", "amount": "200000000" }],
 | 
			
		||||
      "max_deposit_period": "600s"
 | 
			
		||||
    },
 | 
			
		||||
    "voting_params": { "voting_period": "600s" },
 | 
			
		||||
    "tally_params": {
 | 
			
		||||
      "quorum": "0.334000000000000000",
 | 
			
		||||
      "threshold": "0.500000000000000000",
 | 
			
		||||
      "veto_threshold": "0.334000000000000000"
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										83
									
								
								migrate/v0_16/testdata/appstate-staking-v15.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										83
									
								
								migrate/v0_16/testdata/appstate-staking-v15.json
									
									
									
									
										vendored
									
									
								
							@ -1,83 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "staking": {
 | 
			
		||||
    "delegations": [
 | 
			
		||||
      {
 | 
			
		||||
        "delegator_address": "kava1ll7ekzdq2zanxqgvx7rt8w8d4u7qmys62qq7c9",
 | 
			
		||||
        "shares": "2989000.000000000000000000",
 | 
			
		||||
        "validator_address": "kavavaloper1jl42l225565y3hm9dm4my33hjgdzleucqryhlx"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "exported": true,
 | 
			
		||||
    "last_total_power": "87090141",
 | 
			
		||||
    "last_validator_powers": [
 | 
			
		||||
      {
 | 
			
		||||
        "Address": "kavavaloper1leujfugjvuhxqdwlmc7hezra6j5fugk75ttlaa",
 | 
			
		||||
        "Power": "1135"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "params": {
 | 
			
		||||
      "bond_denom": "ukava",
 | 
			
		||||
      "historical_entries": 0,
 | 
			
		||||
      "max_entries": 7,
 | 
			
		||||
      "max_validators": 100,
 | 
			
		||||
      "unbonding_time": "3600000000000"
 | 
			
		||||
    },
 | 
			
		||||
    "redelegations": [
 | 
			
		||||
      {
 | 
			
		||||
        "delegator_address": "kava1lu79dv2zncqknysg3qax0am859ee8du0k894qk",
 | 
			
		||||
        "entries": [
 | 
			
		||||
          {
 | 
			
		||||
            "completion_time": "2021-11-21T05:23:07.223503021Z",
 | 
			
		||||
            "creation_height": "781609",
 | 
			
		||||
            "initial_balance": "53000000",
 | 
			
		||||
            "shares_dst": "53000000.000000000000000000"
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        "validator_dst_address": "kavavaloper140g8fnnl46mlvfhygj3zvjqlku6x0fwu6lgey7",
 | 
			
		||||
        "validator_src_address": "kavavaloper1m4maus4725x5x4xzu9ac2rk5eu7thld4g0whvc"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "unbonding_delegations": [
 | 
			
		||||
      {
 | 
			
		||||
        "delegator_address": "kava1ll35md2djrt4q5s4naxedfhq7ghyt9ncf2j5zd",
 | 
			
		||||
        "entries": [
 | 
			
		||||
          {
 | 
			
		||||
            "balance": "176686927",
 | 
			
		||||
            "completion_time": "2021-11-15T16:52:53.992989413Z",
 | 
			
		||||
            "creation_height": "710207",
 | 
			
		||||
            "initial_balance": "176686927"
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        "validator_address": "kavavaloper1jl42l225565y3hm9dm4my33hjgdzleucqryhlx"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "validators": [
 | 
			
		||||
      {
 | 
			
		||||
        "commission": {
 | 
			
		||||
          "commission_rates": {
 | 
			
		||||
            "max_change_rate": "0.500000000000000000",
 | 
			
		||||
            "max_rate": "0.500000000000000000",
 | 
			
		||||
            "rate": "0.500000000000000000"
 | 
			
		||||
          },
 | 
			
		||||
          "update_time": "2020-02-05T09:55:51.495267155Z"
 | 
			
		||||
        },
 | 
			
		||||
        "consensus_pubkey": "kavavalconspub1zcjduepqyj4j29k7hn58g7n6ert7mm4m7d0kllrx6h5rzzgpvjdt69r80zsq3az2xq",
 | 
			
		||||
        "delegator_shares": "3000000001.511717782247836219",
 | 
			
		||||
        "description": {
 | 
			
		||||
          "details": "\"Trustless Digital Asset Management\", Twitter: @StakeCapital, operated by @bneiluj @leopoldjoy",
 | 
			
		||||
          "identity": "",
 | 
			
		||||
          "moniker": "Stake Capital",
 | 
			
		||||
          "security_contact": "",
 | 
			
		||||
          "website": ""
 | 
			
		||||
        },
 | 
			
		||||
        "jailed": true,
 | 
			
		||||
        "min_self_delegation": "1",
 | 
			
		||||
        "operator_address": "kavavaloper1qyc2cfl0nw8r95dsdw534x99wq0xcj9rmxpl7z",
 | 
			
		||||
        "status": 0,
 | 
			
		||||
        "tokens": "2998500336",
 | 
			
		||||
        "unbonding_height": "0",
 | 
			
		||||
        "unbonding_time": "2021-01-06T14:07:27.057806845Z"
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										86
									
								
								migrate/v0_16/testdata/appstate-staking-v16.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										86
									
								
								migrate/v0_16/testdata/appstate-staking-v16.json
									
									
									
									
										vendored
									
									
								
							@ -1,86 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "staking": {
 | 
			
		||||
    "params": {
 | 
			
		||||
      "unbonding_time": "3600s",
 | 
			
		||||
      "max_validators": 100,
 | 
			
		||||
      "max_entries": 7,
 | 
			
		||||
      "historical_entries": 10000,
 | 
			
		||||
      "bond_denom": "ukava"
 | 
			
		||||
    },
 | 
			
		||||
    "last_total_power": "87090141",
 | 
			
		||||
    "last_validator_powers": [
 | 
			
		||||
      {
 | 
			
		||||
        "address": "kavavaloper1leujfugjvuhxqdwlmc7hezra6j5fugk75ttlaa",
 | 
			
		||||
        "power": "1135"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "validators": [
 | 
			
		||||
      {
 | 
			
		||||
        "operator_address": "kavavaloper1qyc2cfl0nw8r95dsdw534x99wq0xcj9rmxpl7z",
 | 
			
		||||
        "consensus_pubkey": {
 | 
			
		||||
          "@type": "/cosmos.crypto.ed25519.PubKey",
 | 
			
		||||
          "key": "JKslFt686HR6esjX7e67819v/GbV6DEJAWSavRRneKA="
 | 
			
		||||
        },
 | 
			
		||||
        "jailed": true,
 | 
			
		||||
        "status": "BOND_STATUS_UNBONDED",
 | 
			
		||||
        "tokens": "2998500336",
 | 
			
		||||
        "delegator_shares": "3000000001.511717782247836219",
 | 
			
		||||
        "description": {
 | 
			
		||||
          "moniker": "Stake Capital",
 | 
			
		||||
          "identity": "",
 | 
			
		||||
          "website": "",
 | 
			
		||||
          "security_contact": "",
 | 
			
		||||
          "details": "\"Trustless Digital Asset Management\", Twitter: @StakeCapital, operated by @bneiluj @leopoldjoy"
 | 
			
		||||
        },
 | 
			
		||||
        "unbonding_height": "0",
 | 
			
		||||
        "unbonding_time": "2021-01-06T14:07:27.057806845Z",
 | 
			
		||||
        "commission": {
 | 
			
		||||
          "commission_rates": {
 | 
			
		||||
            "rate": "0.500000000000000000",
 | 
			
		||||
            "max_rate": "0.500000000000000000",
 | 
			
		||||
            "max_change_rate": "0.500000000000000000"
 | 
			
		||||
          },
 | 
			
		||||
          "update_time": "2020-02-05T09:55:51.495267155Z"
 | 
			
		||||
        },
 | 
			
		||||
        "min_self_delegation": "1"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "delegations": [
 | 
			
		||||
      {
 | 
			
		||||
        "delegator_address": "kava1ll7ekzdq2zanxqgvx7rt8w8d4u7qmys62qq7c9",
 | 
			
		||||
        "validator_address": "kavavaloper1jl42l225565y3hm9dm4my33hjgdzleucqryhlx",
 | 
			
		||||
        "shares": "2989000.000000000000000000"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "unbonding_delegations": [
 | 
			
		||||
      {
 | 
			
		||||
        "delegator_address": "kava1ll35md2djrt4q5s4naxedfhq7ghyt9ncf2j5zd",
 | 
			
		||||
        "validator_address": "kavavaloper1jl42l225565y3hm9dm4my33hjgdzleucqryhlx",
 | 
			
		||||
        "entries": [
 | 
			
		||||
          {
 | 
			
		||||
            "creation_height": "710207",
 | 
			
		||||
            "completion_time": "2021-11-15T16:52:53.992989413Z",
 | 
			
		||||
            "initial_balance": "176686927",
 | 
			
		||||
            "balance": "176686927"
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "redelegations": [
 | 
			
		||||
      {
 | 
			
		||||
        "delegator_address": "kava1lu79dv2zncqknysg3qax0am859ee8du0k894qk",
 | 
			
		||||
        "validator_src_address": "kavavaloper1m4maus4725x5x4xzu9ac2rk5eu7thld4g0whvc",
 | 
			
		||||
        "validator_dst_address": "kavavaloper140g8fnnl46mlvfhygj3zvjqlku6x0fwu6lgey7",
 | 
			
		||||
        "entries": [
 | 
			
		||||
          {
 | 
			
		||||
            "creation_height": "781609",
 | 
			
		||||
            "completion_time": "2021-11-21T05:23:07.223503021Z",
 | 
			
		||||
            "initial_balance": "53000000",
 | 
			
		||||
            "shares_dst": "53000000.000000000000000000"
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "exported": true
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2502
									
								
								migrate/v0_16/testdata/genesis-v15.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2502
									
								
								migrate/v0_16/testdata/genesis-v15.json
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2280
									
								
								migrate/v0_16/testdata/genesis-v16.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2280
									
								
								migrate/v0_16/testdata/genesis-v16.json
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -1,21 +0,0 @@
 | 
			
		||||
### Testing kava-9 migration
 | 
			
		||||
To verify that the migration procedure for kava-9 is deterministic, run the following commands to compute the genesis hash of a known block.
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
# install latest v0.16 release candidate
 | 
			
		||||
cd $HOME/kava  # replace if location of kava directory is different
 | 
			
		||||
git fetch
 | 
			
		||||
git checkout v0.16.0-rc3
 | 
			
		||||
make install
 | 
			
		||||
cd $HOME
 | 
			
		||||
 | 
			
		||||
# download block 1627000 from kava-8
 | 
			
		||||
wget https://kava-genesis-files.s3.amazonaws.com/kava-8/block-export-1627000.json
 | 
			
		||||
 | 
			
		||||
# run the migration (make sure there are no other kava processes running)
 | 
			
		||||
kava migrate block-export-1627000.json > block-export-1627000-migrated.json
 | 
			
		||||
 | 
			
		||||
# calculate hash of migrated file
 | 
			
		||||
jq -S -c -M '' block-export-1627000-migrated.json | shasum -a 256
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,8 @@ package v0_17
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec/types"
 | 
			
		||||
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	authz "github.com/cosmos/cosmos-sdk/x/authz"
 | 
			
		||||
@ -12,9 +14,16 @@ import (
 | 
			
		||||
	evmutiltypes "github.com/kava-labs/kava/x/evmutil/types"
 | 
			
		||||
 | 
			
		||||
	bridgetypes "github.com/kava-labs/kava-bridge/x/bridge/types"
 | 
			
		||||
	v016auction "github.com/kava-labs/kava/x/auction/legacy/v0_16"
 | 
			
		||||
	v017auction "github.com/kava-labs/kava/x/auction/legacy/v0_17"
 | 
			
		||||
	auctiontypes "github.com/kava-labs/kava/x/auction/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func migrateAppState(appState genutiltypes.AppMap, clientCtx client.Context) {
 | 
			
		||||
	interfaceRegistry := types.NewInterfaceRegistry()
 | 
			
		||||
	v016auction.RegisterInterfaces(interfaceRegistry)
 | 
			
		||||
	v16Codec := codec.NewProtoCodec(interfaceRegistry)
 | 
			
		||||
 | 
			
		||||
	codec := clientCtx.Codec
 | 
			
		||||
 | 
			
		||||
	// x/emvutil
 | 
			
		||||
@ -54,4 +63,15 @@ func migrateAppState(appState genutiltypes.AppMap, clientCtx client.Context) {
 | 
			
		||||
	// x/authz
 | 
			
		||||
	authzState := authz.DefaultGenesisState()
 | 
			
		||||
	appState[authz.ModuleName] = codec.MustMarshalJSON(authzState)
 | 
			
		||||
 | 
			
		||||
	// x/auction
 | 
			
		||||
	if appState[auctiontypes.ModuleName] != nil {
 | 
			
		||||
		var v16GenState v016auction.GenesisState
 | 
			
		||||
		v16Codec.MustUnmarshalJSON(appState[auctiontypes.ModuleName], &v16GenState)
 | 
			
		||||
 | 
			
		||||
		migratedState := v017auction.Migrate(v16GenState)
 | 
			
		||||
		encodedState := codec.MustMarshalJSON(migratedState)
 | 
			
		||||
 | 
			
		||||
		appState[auctiontypes.ModuleName] = encodedState
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -18,6 +18,7 @@ import (
 | 
			
		||||
	evmtypes "github.com/tharsis/ethermint/x/evm/types"
 | 
			
		||||
	feemarkettypes "github.com/tharsis/ethermint/x/feemarket/types"
 | 
			
		||||
 | 
			
		||||
	auctiontypes "github.com/kava-labs/kava/x/auction/types"
 | 
			
		||||
	evmutiltypes "github.com/kava-labs/kava/x/evmutil/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@ -58,6 +59,14 @@ func TestMigrateEvm(t *testing.T) {
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMigrateXAuction(t *testing.T) {
 | 
			
		||||
	appMap, ctx := migrateToV17AndGetAppMap(t)
 | 
			
		||||
	var genstate auctiontypes.GenesisState
 | 
			
		||||
	err := ctx.Codec.UnmarshalJSON(appMap[auctiontypes.ModuleName], &genstate)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Len(t, genstate.Auctions, 3)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMigrateFeeMarket(t *testing.T) {
 | 
			
		||||
	appMap, ctx := migrateToV17AndGetAppMap(t)
 | 
			
		||||
	var genstate feemarkettypes.GenesisState
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										3
									
								
								migrate/v0_17/testdata/genesis-v17.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								migrate/v0_17/testdata/genesis-v17.json
									
									
									
									
										vendored
									
									
								
							@ -22,7 +22,8 @@
 | 
			
		||||
      "next_auction_id": "12",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "max_auction_duration": "172800s",
 | 
			
		||||
        "bid_duration": "600s",
 | 
			
		||||
        "forward_bid_duration": "86400s",
 | 
			
		||||
        "reverse_bid_duration": "3600s",
 | 
			
		||||
        "increment_surplus": "0.010000000000000000",
 | 
			
		||||
        "increment_debt": "0.010000000000000000",
 | 
			
		||||
        "increment_collateral": "0.010000000000000000"
 | 
			
		||||
 | 
			
		||||
@ -22,11 +22,13 @@ message GenesisState {
 | 
			
		||||
 | 
			
		||||
// Params defines the parameters for the issuance module.
 | 
			
		||||
message Params {
 | 
			
		||||
  reserved 2;
 | 
			
		||||
  reserved "bid_duration";
 | 
			
		||||
 | 
			
		||||
  google.protobuf.Duration max_auction_duration = 1 [(gogoproto.nullable) = false, (gogoproto.stdduration) = true];
 | 
			
		||||
 | 
			
		||||
  google.protobuf.Duration forward_bid_duration = 2 [(gogoproto.nullable) = false, (gogoproto.stdduration) = true];
 | 
			
		||||
  google.protobuf.Duration reverse_bid_duration = 6 [(gogoproto.nullable) = false, (gogoproto.stdduration) = true];
 | 
			
		||||
  google.protobuf.Duration forward_bid_duration = 6 [(gogoproto.nullable) = false, (gogoproto.stdduration) = true];
 | 
			
		||||
  google.protobuf.Duration reverse_bid_duration = 7 [(gogoproto.nullable) = false, (gogoproto.stdduration) = true];
 | 
			
		||||
 | 
			
		||||
  bytes increment_surplus = 3
 | 
			
		||||
      [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false];
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								x/auction/legacy/v0_16/codec.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								x/auction/legacy/v0_16/codec.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	types "github.com/cosmos/cosmos-sdk/codec/types"
 | 
			
		||||
	v017auction "github.com/kava-labs/kava/x/auction/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func RegisterInterfaces(registry types.InterfaceRegistry) {
 | 
			
		||||
	registry.RegisterInterface(
 | 
			
		||||
		"kava.auction.v1beta1.GenesisAuction",
 | 
			
		||||
		(*v017auction.GenesisAuction)(nil),
 | 
			
		||||
		&v017auction.SurplusAuction{},
 | 
			
		||||
		&v017auction.DebtAuction{},
 | 
			
		||||
		&v017auction.CollateralAuction{},
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										761
									
								
								x/auction/legacy/v0_16/genesis.pb.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										761
									
								
								x/auction/legacy/v0_16/genesis.pb.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,761 @@
 | 
			
		||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
 | 
			
		||||
// source: kava/auction/v1beta1/genesis.proto
 | 
			
		||||
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	fmt "fmt"
 | 
			
		||||
	_ "github.com/cosmos/cosmos-proto"
 | 
			
		||||
	types "github.com/cosmos/cosmos-sdk/codec/types"
 | 
			
		||||
	github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	_ "github.com/gogo/protobuf/gogoproto"
 | 
			
		||||
	proto "github.com/gogo/protobuf/proto"
 | 
			
		||||
	github_com_gogo_protobuf_types "github.com/gogo/protobuf/types"
 | 
			
		||||
	_ "google.golang.org/protobuf/types/known/durationpb"
 | 
			
		||||
	io "io"
 | 
			
		||||
	math "math"
 | 
			
		||||
	math_bits "math/bits"
 | 
			
		||||
	time "time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ = proto.Marshal
 | 
			
		||||
var _ = fmt.Errorf
 | 
			
		||||
var _ = math.Inf
 | 
			
		||||
var _ = time.Kitchen
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the proto package it is being compiled against.
 | 
			
		||||
// A compilation error at this line likely means your copy of the
 | 
			
		||||
// proto package needs to be updated.
 | 
			
		||||
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
 | 
			
		||||
 | 
			
		||||
// GenesisState defines the auction module's genesis state.
 | 
			
		||||
type GenesisState struct {
 | 
			
		||||
	NextAuctionId uint64 `protobuf:"varint,1,opt,name=next_auction_id,json=nextAuctionId,proto3" json:"next_auction_id,omitempty"`
 | 
			
		||||
	Params        Params `protobuf:"bytes,2,opt,name=params,proto3" json:"params"`
 | 
			
		||||
	// Genesis auctions
 | 
			
		||||
	Auctions []*types.Any `protobuf:"bytes,3,rep,name=auctions,proto3" json:"auctions,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *GenesisState) Reset()         { *m = GenesisState{} }
 | 
			
		||||
func (m *GenesisState) String() string { return proto.CompactTextString(m) }
 | 
			
		||||
func (*GenesisState) ProtoMessage()    {}
 | 
			
		||||
func (*GenesisState) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_d0e5cb58293042f7, []int{0}
 | 
			
		||||
}
 | 
			
		||||
func (m *GenesisState) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
}
 | 
			
		||||
func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	if deterministic {
 | 
			
		||||
		return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic)
 | 
			
		||||
	} else {
 | 
			
		||||
		b = b[:cap(b)]
 | 
			
		||||
		n, err := m.MarshalToSizedBuffer(b)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return b[:n], nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (m *GenesisState) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_GenesisState.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *GenesisState) XXX_Size() int {
 | 
			
		||||
	return m.Size()
 | 
			
		||||
}
 | 
			
		||||
func (m *GenesisState) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_GenesisState.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_GenesisState proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
// Params defines the parameters for the issuance module.
 | 
			
		||||
type Params struct {
 | 
			
		||||
	MaxAuctionDuration  time.Duration                          `protobuf:"bytes,1,opt,name=max_auction_duration,json=maxAuctionDuration,proto3,stdduration" json:"max_auction_duration"`
 | 
			
		||||
	BidDuration         time.Duration                          `protobuf:"bytes,2,opt,name=bid_duration,json=bidDuration,proto3,stdduration" json:"bid_duration"`
 | 
			
		||||
	IncrementSurplus    github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=increment_surplus,json=incrementSurplus,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"increment_surplus"`
 | 
			
		||||
	IncrementDebt       github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=increment_debt,json=incrementDebt,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"increment_debt"`
 | 
			
		||||
	IncrementCollateral github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=increment_collateral,json=incrementCollateral,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"increment_collateral"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Params) Reset()         { *m = Params{} }
 | 
			
		||||
func (m *Params) String() string { return proto.CompactTextString(m) }
 | 
			
		||||
func (*Params) ProtoMessage()    {}
 | 
			
		||||
func (*Params) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_d0e5cb58293042f7, []int{1}
 | 
			
		||||
}
 | 
			
		||||
func (m *Params) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
}
 | 
			
		||||
func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	if deterministic {
 | 
			
		||||
		return xxx_messageInfo_Params.Marshal(b, m, deterministic)
 | 
			
		||||
	} else {
 | 
			
		||||
		b = b[:cap(b)]
 | 
			
		||||
		n, err := m.MarshalToSizedBuffer(b)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return b[:n], nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (m *Params) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_Params.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *Params) XXX_Size() int {
 | 
			
		||||
	return m.Size()
 | 
			
		||||
}
 | 
			
		||||
func (m *Params) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_Params.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_Params proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_d0e5cb58293042f7 = []byte{
 | 
			
		||||
	// 466 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x93, 0x31, 0x6f, 0xd3, 0x40,
 | 
			
		||||
	0x14, 0xc7, 0x7d, 0x4d, 0x88, 0xaa, 0x4b, 0x5a, 0xe0, 0xf0, 0xe0, 0x56, 0xc8, 0x89, 0x32, 0x54,
 | 
			
		||||
	0x61, 0xc8, 0x59, 0x0d, 0x1b, 0x5b, 0x4d, 0x44, 0xc5, 0x86, 0x5c, 0x75, 0x81, 0x21, 0xba, 0xb3,
 | 
			
		||||
	0x0f, 0x63, 0xd5, 0xf6, 0x45, 0xbe, 0x73, 0x95, 0x7c, 0x0b, 0x46, 0x3e, 0x08, 0x03, 0x13, 0x73,
 | 
			
		||||
	0xc4, 0xd4, 0x11, 0x31, 0x14, 0x48, 0xbe, 0x08, 0xf2, 0xdd, 0xe5, 0x82, 0x80, 0x01, 0x75, 0xca,
 | 
			
		||||
	0xdd, 0x7b, 0xff, 0xff, 0xef, 0xfd, 0x9f, 0x2e, 0x86, 0xc3, 0x2b, 0x72, 0x4d, 0x02, 0x52, 0xc7,
 | 
			
		||||
	0x32, 0xe3, 0x65, 0x70, 0x7d, 0x4a, 0x99, 0x24, 0xa7, 0x41, 0xca, 0x4a, 0x26, 0x32, 0x81, 0xe7,
 | 
			
		||||
	0x15, 0x97, 0x1c, 0xb9, 0x8d, 0x06, 0x1b, 0x0d, 0x36, 0x9a, 0x63, 0x37, 0xe5, 0x29, 0x57, 0x82,
 | 
			
		||||
	0xa0, 0x39, 0x69, 0xed, 0xf1, 0x51, 0xca, 0x79, 0x9a, 0xb3, 0x40, 0xdd, 0x68, 0xfd, 0x36, 0x20,
 | 
			
		||||
	0xe5, 0x72, 0xdb, 0x8a, 0xb9, 0x28, 0xb8, 0x98, 0x69, 0x8f, 0xbe, 0x98, 0x96, 0xff, 0xa7, 0x2b,
 | 
			
		||||
	0xa9, 0x2b, 0xa2, 0xa6, 0xa9, 0xca, 0xf0, 0x13, 0x80, 0xbd, 0x73, 0x9d, 0xe9, 0x42, 0x12, 0xc9,
 | 
			
		||||
	0xd0, 0x09, 0xbc, 0x5f, 0xb2, 0x85, 0x9c, 0x99, 0x50, 0xb3, 0x2c, 0xf1, 0xc0, 0x00, 0x8c, 0xda,
 | 
			
		||||
	0xd1, 0x41, 0x53, 0x3e, 0xd3, 0xd5, 0x97, 0x09, 0x7a, 0x06, 0x3b, 0x73, 0x52, 0x91, 0x42, 0x78,
 | 
			
		||||
	0x7b, 0x03, 0x30, 0xea, 0x4e, 0x1e, 0xe3, 0x7f, 0xed, 0x82, 0x5f, 0x29, 0x4d, 0xd8, 0x5e, 0xdd,
 | 
			
		||||
	0xf6, 0x9d, 0xc8, 0x38, 0xd0, 0x14, 0xee, 0x1b, 0x9d, 0xf0, 0x5a, 0x83, 0xd6, 0xa8, 0x3b, 0x71,
 | 
			
		||||
	0xb1, 0xce, 0x89, 0xb7, 0x39, 0xf1, 0x59, 0xb9, 0x0c, 0xd1, 0x97, 0x8f, 0xe3, 0x43, 0x93, 0xce,
 | 
			
		||||
	0x4c, 0x8e, 0xac, 0x73, 0xf8, 0xb9, 0x05, 0x3b, 0x1a, 0x8f, 0x2e, 0xa1, 0x5b, 0x90, 0x85, 0xcd,
 | 
			
		||||
	0xbc, 0xdd, 0x51, 0x25, 0xef, 0x4e, 0x8e, 0xfe, 0x82, 0x4f, 0x8d, 0x20, 0xdc, 0x6f, 0x72, 0x7d,
 | 
			
		||||
	0xf8, 0xde, 0x07, 0x11, 0x2a, 0xc8, 0xc2, 0xcc, 0xd8, 0x76, 0xd1, 0x0b, 0xd8, 0xa3, 0x59, 0xb2,
 | 
			
		||||
	0xc3, 0xed, 0xfd, 0x3f, 0xae, 0x4b, 0xb3, 0xc4, 0x72, 0xde, 0xc0, 0x87, 0x59, 0x19, 0x57, 0xac,
 | 
			
		||||
	0x60, 0xa5, 0x9c, 0x89, 0xba, 0x9a, 0xe7, 0x75, 0xb3, 0x38, 0x18, 0xf5, 0x42, 0xdc, 0x38, 0xbe,
 | 
			
		||||
	0xdd, 0xf6, 0x4f, 0xd2, 0x4c, 0xbe, 0xab, 0x29, 0x8e, 0x79, 0x61, 0x1e, 0xd0, 0xfc, 0x8c, 0x45,
 | 
			
		||||
	0x72, 0x15, 0xc8, 0xe5, 0x9c, 0x09, 0x3c, 0x65, 0x71, 0xf4, 0xc0, 0x82, 0x2e, 0x34, 0x07, 0x5d,
 | 
			
		||||
	0xc2, 0xc3, 0x1d, 0x3c, 0x61, 0x54, 0x7a, 0xed, 0x3b, 0x91, 0x0f, 0x2c, 0x65, 0xca, 0xa8, 0x44,
 | 
			
		||||
	0x04, 0xba, 0x3b, 0x6c, 0xcc, 0xf3, 0x9c, 0x48, 0x56, 0x91, 0xdc, 0xbb, 0x77, 0x27, 0xf8, 0x23,
 | 
			
		||||
	0xcb, 0x7a, 0x6e, 0x51, 0xe1, 0xf9, 0xea, 0xa7, 0xef, 0xac, 0xd6, 0x3e, 0xb8, 0x59, 0xfb, 0xe0,
 | 
			
		||||
	0xc7, 0xda, 0x07, 0xef, 0x37, 0xbe, 0x73, 0xb3, 0xf1, 0x9d, 0xaf, 0x1b, 0xdf, 0x79, 0xfd, 0xe4,
 | 
			
		||||
	0x37, 0x74, 0xf3, 0xd7, 0x1a, 0xe7, 0x84, 0x0a, 0x75, 0x0a, 0x16, 0xf6, 0xb3, 0x52, 0x13, 0x68,
 | 
			
		||||
	0x47, 0xbd, 0xc4, 0xd3, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa5, 0x20, 0xff, 0x87, 0x73, 0x03,
 | 
			
		||||
	0x00, 0x00,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *GenesisState) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	dAtA = make([]byte, size)
 | 
			
		||||
	n, err := m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA[:n], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	return m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	i := len(dAtA)
 | 
			
		||||
	_ = i
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	if len(m.Auctions) > 0 {
 | 
			
		||||
		for iNdEx := len(m.Auctions) - 1; iNdEx >= 0; iNdEx-- {
 | 
			
		||||
			{
 | 
			
		||||
				size, err := m.Auctions[iNdEx].MarshalToSizedBuffer(dAtA[:i])
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return 0, err
 | 
			
		||||
				}
 | 
			
		||||
				i -= size
 | 
			
		||||
				i = encodeVarintGenesis(dAtA, i, uint64(size))
 | 
			
		||||
			}
 | 
			
		||||
			i--
 | 
			
		||||
			dAtA[i] = 0x1a
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	{
 | 
			
		||||
		size, err := m.Params.MarshalToSizedBuffer(dAtA[:i])
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return 0, err
 | 
			
		||||
		}
 | 
			
		||||
		i -= size
 | 
			
		||||
		i = encodeVarintGenesis(dAtA, i, uint64(size))
 | 
			
		||||
	}
 | 
			
		||||
	i--
 | 
			
		||||
	dAtA[i] = 0x12
 | 
			
		||||
	if m.NextAuctionId != 0 {
 | 
			
		||||
		i = encodeVarintGenesis(dAtA, i, uint64(m.NextAuctionId))
 | 
			
		||||
		i--
 | 
			
		||||
		dAtA[i] = 0x8
 | 
			
		||||
	}
 | 
			
		||||
	return len(dAtA) - i, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Params) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	dAtA = make([]byte, size)
 | 
			
		||||
	n, err := m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA[:n], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Params) MarshalTo(dAtA []byte) (int, error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	return m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	i := len(dAtA)
 | 
			
		||||
	_ = i
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	{
 | 
			
		||||
		size := m.IncrementCollateral.Size()
 | 
			
		||||
		i -= size
 | 
			
		||||
		if _, err := m.IncrementCollateral.MarshalTo(dAtA[i:]); err != nil {
 | 
			
		||||
			return 0, err
 | 
			
		||||
		}
 | 
			
		||||
		i = encodeVarintGenesis(dAtA, i, uint64(size))
 | 
			
		||||
	}
 | 
			
		||||
	i--
 | 
			
		||||
	dAtA[i] = 0x2a
 | 
			
		||||
	{
 | 
			
		||||
		size := m.IncrementDebt.Size()
 | 
			
		||||
		i -= size
 | 
			
		||||
		if _, err := m.IncrementDebt.MarshalTo(dAtA[i:]); err != nil {
 | 
			
		||||
			return 0, err
 | 
			
		||||
		}
 | 
			
		||||
		i = encodeVarintGenesis(dAtA, i, uint64(size))
 | 
			
		||||
	}
 | 
			
		||||
	i--
 | 
			
		||||
	dAtA[i] = 0x22
 | 
			
		||||
	{
 | 
			
		||||
		size := m.IncrementSurplus.Size()
 | 
			
		||||
		i -= size
 | 
			
		||||
		if _, err := m.IncrementSurplus.MarshalTo(dAtA[i:]); err != nil {
 | 
			
		||||
			return 0, err
 | 
			
		||||
		}
 | 
			
		||||
		i = encodeVarintGenesis(dAtA, i, uint64(size))
 | 
			
		||||
	}
 | 
			
		||||
	i--
 | 
			
		||||
	dAtA[i] = 0x1a
 | 
			
		||||
	n2, err2 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.BidDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.BidDuration):])
 | 
			
		||||
	if err2 != nil {
 | 
			
		||||
		return 0, err2
 | 
			
		||||
	}
 | 
			
		||||
	i -= n2
 | 
			
		||||
	i = encodeVarintGenesis(dAtA, i, uint64(n2))
 | 
			
		||||
	i--
 | 
			
		||||
	dAtA[i] = 0x12
 | 
			
		||||
	n3, err3 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MaxAuctionDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxAuctionDuration):])
 | 
			
		||||
	if err3 != nil {
 | 
			
		||||
		return 0, err3
 | 
			
		||||
	}
 | 
			
		||||
	i -= n3
 | 
			
		||||
	i = encodeVarintGenesis(dAtA, i, uint64(n3))
 | 
			
		||||
	i--
 | 
			
		||||
	dAtA[i] = 0xa
 | 
			
		||||
	return len(dAtA) - i, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int {
 | 
			
		||||
	offset -= sovGenesis(v)
 | 
			
		||||
	base := offset
 | 
			
		||||
	for v >= 1<<7 {
 | 
			
		||||
		dAtA[offset] = uint8(v&0x7f | 0x80)
 | 
			
		||||
		v >>= 7
 | 
			
		||||
		offset++
 | 
			
		||||
	}
 | 
			
		||||
	dAtA[offset] = uint8(v)
 | 
			
		||||
	return base
 | 
			
		||||
}
 | 
			
		||||
func (m *GenesisState) Size() (n int) {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	if m.NextAuctionId != 0 {
 | 
			
		||||
		n += 1 + sovGenesis(uint64(m.NextAuctionId))
 | 
			
		||||
	}
 | 
			
		||||
	l = m.Params.Size()
 | 
			
		||||
	n += 1 + l + sovGenesis(uint64(l))
 | 
			
		||||
	if len(m.Auctions) > 0 {
 | 
			
		||||
		for _, e := range m.Auctions {
 | 
			
		||||
			l = e.Size()
 | 
			
		||||
			n += 1 + l + sovGenesis(uint64(l))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Params) Size() (n int) {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxAuctionDuration)
 | 
			
		||||
	n += 1 + l + sovGenesis(uint64(l))
 | 
			
		||||
	l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.BidDuration)
 | 
			
		||||
	n += 1 + l + sovGenesis(uint64(l))
 | 
			
		||||
	l = m.IncrementSurplus.Size()
 | 
			
		||||
	n += 1 + l + sovGenesis(uint64(l))
 | 
			
		||||
	l = m.IncrementDebt.Size()
 | 
			
		||||
	n += 1 + l + sovGenesis(uint64(l))
 | 
			
		||||
	l = m.IncrementCollateral.Size()
 | 
			
		||||
	n += 1 + l + sovGenesis(uint64(l))
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func sovGenesis(x uint64) (n int) {
 | 
			
		||||
	return (math_bits.Len64(x|1) + 6) / 7
 | 
			
		||||
}
 | 
			
		||||
func sozGenesis(x uint64) (n int) {
 | 
			
		||||
	return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63))))
 | 
			
		||||
}
 | 
			
		||||
func (m *GenesisState) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		preIndex := iNdEx
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return ErrIntOverflowGenesis
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= uint64(b&0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		fieldNum := int32(wire >> 3)
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		if wireType == 4 {
 | 
			
		||||
			return fmt.Errorf("proto: GenesisState: wiretype end group for non-group")
 | 
			
		||||
		}
 | 
			
		||||
		if fieldNum <= 0 {
 | 
			
		||||
			return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire)
 | 
			
		||||
		}
 | 
			
		||||
		switch fieldNum {
 | 
			
		||||
		case 1:
 | 
			
		||||
			if wireType != 0 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field NextAuctionId", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			m.NextAuctionId = 0
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowGenesis
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				m.NextAuctionId |= uint64(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case 2:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var msglen int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowGenesis
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				msglen |= int(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if msglen < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + msglen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		case 3:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field Auctions", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var msglen int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowGenesis
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				msglen |= int(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if msglen < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + msglen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			m.Auctions = append(m.Auctions, &types.Any{})
 | 
			
		||||
			if err := m.Auctions[len(m.Auctions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		default:
 | 
			
		||||
			iNdEx = preIndex
 | 
			
		||||
			skippy, err := skipGenesis(dAtA[iNdEx:])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if (skippy < 0) || (iNdEx+skippy) < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			if (iNdEx + skippy) > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx += skippy
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if iNdEx > l {
 | 
			
		||||
		return io.ErrUnexpectedEOF
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func (m *Params) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		preIndex := iNdEx
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return ErrIntOverflowGenesis
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= uint64(b&0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		fieldNum := int32(wire >> 3)
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		if wireType == 4 {
 | 
			
		||||
			return fmt.Errorf("proto: Params: wiretype end group for non-group")
 | 
			
		||||
		}
 | 
			
		||||
		if fieldNum <= 0 {
 | 
			
		||||
			return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire)
 | 
			
		||||
		}
 | 
			
		||||
		switch fieldNum {
 | 
			
		||||
		case 1:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field MaxAuctionDuration", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var msglen int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowGenesis
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				msglen |= int(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if msglen < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + msglen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.MaxAuctionDuration, dAtA[iNdEx:postIndex]); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		case 2:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field BidDuration", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var msglen int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowGenesis
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				msglen |= int(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if msglen < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + msglen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.BidDuration, dAtA[iNdEx:postIndex]); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		case 3:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field IncrementSurplus", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var byteLen int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowGenesis
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				byteLen |= int(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if byteLen < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + byteLen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			if err := m.IncrementSurplus.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		case 4:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field IncrementDebt", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var byteLen int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowGenesis
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				byteLen |= int(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if byteLen < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + byteLen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			if err := m.IncrementDebt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		case 5:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field IncrementCollateral", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var byteLen int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowGenesis
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				byteLen |= int(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if byteLen < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + byteLen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			if err := m.IncrementCollateral.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		default:
 | 
			
		||||
			iNdEx = preIndex
 | 
			
		||||
			skippy, err := skipGenesis(dAtA[iNdEx:])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if (skippy < 0) || (iNdEx+skippy) < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			if (iNdEx + skippy) > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx += skippy
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if iNdEx > l {
 | 
			
		||||
		return io.ErrUnexpectedEOF
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func skipGenesis(dAtA []byte) (n int, err error) {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	depth := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return 0, ErrIntOverflowGenesis
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return 0, io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= (uint64(b) & 0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		switch wireType {
 | 
			
		||||
		case 0:
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowGenesis
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				if dAtA[iNdEx-1] < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case 1:
 | 
			
		||||
			iNdEx += 8
 | 
			
		||||
		case 2:
 | 
			
		||||
			var length int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowGenesis
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				length |= (int(b) & 0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if length < 0 {
 | 
			
		||||
				return 0, ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx += length
 | 
			
		||||
		case 3:
 | 
			
		||||
			depth++
 | 
			
		||||
		case 4:
 | 
			
		||||
			if depth == 0 {
 | 
			
		||||
				return 0, ErrUnexpectedEndOfGroupGenesis
 | 
			
		||||
			}
 | 
			
		||||
			depth--
 | 
			
		||||
		case 5:
 | 
			
		||||
			iNdEx += 4
 | 
			
		||||
		default:
 | 
			
		||||
			return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
 | 
			
		||||
		}
 | 
			
		||||
		if iNdEx < 0 {
 | 
			
		||||
			return 0, ErrInvalidLengthGenesis
 | 
			
		||||
		}
 | 
			
		||||
		if depth == 0 {
 | 
			
		||||
			return iNdEx, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0, io.ErrUnexpectedEOF
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ErrInvalidLengthGenesis        = fmt.Errorf("proto: negative length found during unmarshaling")
 | 
			
		||||
	ErrIntOverflowGenesis          = fmt.Errorf("proto: integer overflow")
 | 
			
		||||
	ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group")
 | 
			
		||||
)
 | 
			
		||||
@ -1,95 +0,0 @@
 | 
			
		||||
package v0_16
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	codectypes "github.com/cosmos/cosmos-sdk/codec/types"
 | 
			
		||||
 | 
			
		||||
	v015auction "github.com/kava-labs/kava/x/auction/legacy/v0_15"
 | 
			
		||||
	v016auction "github.com/kava-labs/kava/x/auction/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func migrateBaseAuction(auction v015auction.BaseAuction) v016auction.BaseAuction {
 | 
			
		||||
	return v016auction.BaseAuction{
 | 
			
		||||
		ID:              auction.ID,
 | 
			
		||||
		Initiator:       auction.GetInitiator(),
 | 
			
		||||
		Lot:             auction.GetLot(),
 | 
			
		||||
		Bidder:          auction.GetBidder(),
 | 
			
		||||
		Bid:             auction.GetBid(),
 | 
			
		||||
		HasReceivedBids: auction.GetHasReceivedBids(),
 | 
			
		||||
		EndTime:         auction.GetEndTime(),
 | 
			
		||||
		MaxEndTime:      auction.GetMaxEndTime(),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func migrateAuction(auction v015auction.Auction) *codectypes.Any {
 | 
			
		||||
	var protoAuction v016auction.GenesisAuction
 | 
			
		||||
 | 
			
		||||
	switch auction := auction.(type) {
 | 
			
		||||
	case v015auction.SurplusAuction:
 | 
			
		||||
		{
 | 
			
		||||
			protoAuction = &v016auction.SurplusAuction{
 | 
			
		||||
				BaseAuction: migrateBaseAuction(auction.BaseAuction),
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case v015auction.DebtAuction:
 | 
			
		||||
		{
 | 
			
		||||
			protoAuction = &v016auction.DebtAuction{
 | 
			
		||||
				BaseAuction:       migrateBaseAuction(auction.BaseAuction),
 | 
			
		||||
				CorrespondingDebt: auction.CorrespondingDebt,
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case v015auction.CollateralAuction:
 | 
			
		||||
		{
 | 
			
		||||
			lotReturns := v016auction.WeightedAddresses{
 | 
			
		||||
				Addresses: auction.LotReturns.Addresses,
 | 
			
		||||
				Weights:   auction.LotReturns.Weights,
 | 
			
		||||
			}
 | 
			
		||||
			if err := lotReturns.Validate(); err != nil {
 | 
			
		||||
				panic(err)
 | 
			
		||||
			}
 | 
			
		||||
			protoAuction = &v016auction.CollateralAuction{
 | 
			
		||||
				BaseAuction:       migrateBaseAuction(auction.BaseAuction),
 | 
			
		||||
				CorrespondingDebt: auction.CorrespondingDebt,
 | 
			
		||||
				MaxBid:            auction.MaxBid,
 | 
			
		||||
				LotReturns:        lotReturns,
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		panic(fmt.Errorf("'%s' is not a valid auction", auction))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Convert the content into Any.
 | 
			
		||||
	contentAny, err := codectypes.NewAnyWithValue(protoAuction)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return contentAny
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func migrateAuctions(auctions v015auction.GenesisAuctions) []*codectypes.Any {
 | 
			
		||||
	anyAuctions := make([]*codectypes.Any, len(auctions))
 | 
			
		||||
	for i, auction := range auctions {
 | 
			
		||||
		anyAuctions[i] = migrateAuction(auction)
 | 
			
		||||
	}
 | 
			
		||||
	return anyAuctions
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func migrateParams(params v015auction.Params) v016auction.Params {
 | 
			
		||||
	return v016auction.Params{
 | 
			
		||||
		MaxAuctionDuration:  params.MaxAuctionDuration,
 | 
			
		||||
		BidDuration:         params.BidDuration,
 | 
			
		||||
		IncrementSurplus:    params.IncrementSurplus,
 | 
			
		||||
		IncrementDebt:       params.IncrementDebt,
 | 
			
		||||
		IncrementCollateral: params.IncrementCollateral,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Migrate(oldState v015auction.GenesisState) *v016auction.GenesisState {
 | 
			
		||||
	return &v016auction.GenesisState{
 | 
			
		||||
		NextAuctionId: oldState.NextAuctionID,
 | 
			
		||||
		Params:        migrateParams(oldState.Params),
 | 
			
		||||
		Auctions:      migrateAuctions(oldState.Auctions),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -1,238 +0,0 @@
 | 
			
		||||
package v0_16
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	"github.com/stretchr/testify/suite"
 | 
			
		||||
 | 
			
		||||
	app "github.com/kava-labs/kava/app"
 | 
			
		||||
	v015auction "github.com/kava-labs/kava/x/auction/legacy/v0_15"
 | 
			
		||||
	v016auction "github.com/kava-labs/kava/x/auction/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type migrateTestSuite struct {
 | 
			
		||||
	suite.Suite
 | 
			
		||||
 | 
			
		||||
	addresses   []sdk.AccAddress
 | 
			
		||||
	v15genstate v015auction.GenesisState
 | 
			
		||||
	cdc         codec.Codec
 | 
			
		||||
	legacyCdc   *codec.LegacyAmino
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *migrateTestSuite) SetupTest() {
 | 
			
		||||
	app.SetSDKConfig()
 | 
			
		||||
 | 
			
		||||
	s.v15genstate = v015auction.GenesisState{
 | 
			
		||||
		NextAuctionID: 1,
 | 
			
		||||
		Params:        v015auction.Params{},
 | 
			
		||||
		Auctions:      v015auction.GenesisAuctions{},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	config := app.MakeEncodingConfig()
 | 
			
		||||
	s.cdc = config.Marshaler
 | 
			
		||||
 | 
			
		||||
	legacyCodec := codec.NewLegacyAmino()
 | 
			
		||||
	v015auction.RegisterLegacyAminoCodec(legacyCodec)
 | 
			
		||||
	s.legacyCdc = legacyCodec
 | 
			
		||||
 | 
			
		||||
	_, accAddresses := app.GeneratePrivKeyAddressPairs(10)
 | 
			
		||||
	s.addresses = accAddresses
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *migrateTestSuite) TestMigrate_JSON() {
 | 
			
		||||
	// Migrate v15 auction to v16
 | 
			
		||||
	file := filepath.Join("testdata", "v15-auction.json")
 | 
			
		||||
	data, err := ioutil.ReadFile(file)
 | 
			
		||||
	s.Require().NoError(err)
 | 
			
		||||
	err = s.legacyCdc.UnmarshalJSON(data, &s.v15genstate)
 | 
			
		||||
	s.Require().NoError(err)
 | 
			
		||||
	genstate := Migrate(s.v15genstate)
 | 
			
		||||
 | 
			
		||||
	// Compare expect v16 auction json with migrated json
 | 
			
		||||
	actual := s.cdc.MustMarshalJSON(genstate)
 | 
			
		||||
	file = filepath.Join("testdata", "v16-auction.json")
 | 
			
		||||
	expected, err := ioutil.ReadFile(file)
 | 
			
		||||
	s.Require().NoError(err)
 | 
			
		||||
	s.Require().JSONEq(string(expected), string(actual))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *migrateTestSuite) TestMigrate_Auction() {
 | 
			
		||||
	now := time.Now()
 | 
			
		||||
	testcases := []struct {
 | 
			
		||||
		name       string
 | 
			
		||||
		oldAuction v015auction.GenesisAuction
 | 
			
		||||
		newAuction v016auction.GenesisAuction
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name: "collateral auction",
 | 
			
		||||
			oldAuction: v015auction.CollateralAuction{
 | 
			
		||||
				BaseAuction: v015auction.BaseAuction{
 | 
			
		||||
					ID:              1,
 | 
			
		||||
					Initiator:       s.addresses[0].String(),
 | 
			
		||||
					Lot:             sdk.NewInt64Coin("kava", 1),
 | 
			
		||||
					Bidder:          s.addresses[1],
 | 
			
		||||
					Bid:             sdk.NewInt64Coin("kava", 1),
 | 
			
		||||
					EndTime:         now,
 | 
			
		||||
					MaxEndTime:      now,
 | 
			
		||||
					HasReceivedBids: true,
 | 
			
		||||
				},
 | 
			
		||||
				CorrespondingDebt: sdk.NewInt64Coin("kava", 1),
 | 
			
		||||
				MaxBid:            sdk.NewInt64Coin("kava", 1),
 | 
			
		||||
				LotReturns: v015auction.WeightedAddresses{
 | 
			
		||||
					Addresses: s.addresses[:2],
 | 
			
		||||
					Weights:   []sdk.Int{sdk.NewInt(1), sdk.NewInt(1)},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			newAuction: &v016auction.CollateralAuction{
 | 
			
		||||
				BaseAuction: v016auction.BaseAuction{
 | 
			
		||||
					ID:              1,
 | 
			
		||||
					Initiator:       s.addresses[0].String(),
 | 
			
		||||
					Lot:             sdk.NewInt64Coin("kava", 1),
 | 
			
		||||
					Bidder:          s.addresses[1],
 | 
			
		||||
					Bid:             sdk.NewInt64Coin("kava", 1),
 | 
			
		||||
					EndTime:         now,
 | 
			
		||||
					MaxEndTime:      now,
 | 
			
		||||
					HasReceivedBids: true,
 | 
			
		||||
				},
 | 
			
		||||
				CorrespondingDebt: sdk.NewInt64Coin("kava", 1),
 | 
			
		||||
				MaxBid:            sdk.NewInt64Coin("kava", 1),
 | 
			
		||||
				LotReturns: v016auction.WeightedAddresses{
 | 
			
		||||
					Addresses: s.addresses[:2],
 | 
			
		||||
					Weights:   []sdk.Int{sdk.NewInt(1), sdk.NewInt(1)},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "surplus auction",
 | 
			
		||||
			oldAuction: v015auction.SurplusAuction{
 | 
			
		||||
				BaseAuction: v015auction.BaseAuction{
 | 
			
		||||
					ID:              2,
 | 
			
		||||
					Initiator:       s.addresses[0].String(),
 | 
			
		||||
					Lot:             sdk.NewInt64Coin("kava", 12),
 | 
			
		||||
					Bidder:          s.addresses[1],
 | 
			
		||||
					Bid:             sdk.NewInt64Coin("kava", 12),
 | 
			
		||||
					EndTime:         now,
 | 
			
		||||
					MaxEndTime:      now,
 | 
			
		||||
					HasReceivedBids: false,
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			newAuction: &v016auction.SurplusAuction{
 | 
			
		||||
				BaseAuction: v016auction.BaseAuction{
 | 
			
		||||
					ID:              2,
 | 
			
		||||
					Initiator:       s.addresses[0].String(),
 | 
			
		||||
					Lot:             sdk.NewInt64Coin("kava", 12),
 | 
			
		||||
					Bidder:          s.addresses[1],
 | 
			
		||||
					Bid:             sdk.NewInt64Coin("kava", 12),
 | 
			
		||||
					EndTime:         now,
 | 
			
		||||
					MaxEndTime:      now,
 | 
			
		||||
					HasReceivedBids: false,
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "debt auction",
 | 
			
		||||
			oldAuction: v015auction.DebtAuction{
 | 
			
		||||
				BaseAuction: v015auction.BaseAuction{
 | 
			
		||||
					ID:              3,
 | 
			
		||||
					Initiator:       s.addresses[0].String(),
 | 
			
		||||
					Lot:             sdk.NewInt64Coin("kava", 1),
 | 
			
		||||
					Bidder:          s.addresses[1],
 | 
			
		||||
					Bid:             sdk.NewInt64Coin("kava", 1),
 | 
			
		||||
					EndTime:         now,
 | 
			
		||||
					MaxEndTime:      now,
 | 
			
		||||
					HasReceivedBids: true,
 | 
			
		||||
				},
 | 
			
		||||
				CorrespondingDebt: sdk.NewInt64Coin("kava", 20),
 | 
			
		||||
			},
 | 
			
		||||
			newAuction: &v016auction.DebtAuction{
 | 
			
		||||
				BaseAuction: v016auction.BaseAuction{
 | 
			
		||||
					ID:              3,
 | 
			
		||||
					Initiator:       s.addresses[0].String(),
 | 
			
		||||
					Lot:             sdk.NewInt64Coin("kava", 1),
 | 
			
		||||
					Bidder:          s.addresses[1],
 | 
			
		||||
					Bid:             sdk.NewInt64Coin("kava", 1),
 | 
			
		||||
					EndTime:         now,
 | 
			
		||||
					MaxEndTime:      now,
 | 
			
		||||
					HasReceivedBids: true,
 | 
			
		||||
				},
 | 
			
		||||
				CorrespondingDebt: sdk.NewInt64Coin("kava", 20),
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, tc := range testcases {
 | 
			
		||||
		s.Run(tc.name, func() {
 | 
			
		||||
			s.v15genstate.Auctions = v015auction.GenesisAuctions{tc.oldAuction}
 | 
			
		||||
			genState := Migrate(s.v15genstate)
 | 
			
		||||
			s.Require().Len(genState.Auctions, 1)
 | 
			
		||||
			expectedAuctions, err := v016auction.UnpackGenesisAuctions(genState.Auctions)
 | 
			
		||||
			s.Require().NoError(err)
 | 
			
		||||
			s.Equal(tc.newAuction, expectedAuctions[0])
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *migrateTestSuite) TestMigrate_GenState() {
 | 
			
		||||
	now := time.Now()
 | 
			
		||||
	v15params := v015auction.Params{
 | 
			
		||||
		MaxAuctionDuration:  time.Duration(time.Hour * 24 * 7),
 | 
			
		||||
		BidDuration:         time.Duration(time.Hour * 24 * 4),
 | 
			
		||||
		IncrementSurplus:    sdk.MustNewDecFromStr("0.01"),
 | 
			
		||||
		IncrementDebt:       sdk.MustNewDecFromStr("0.02"),
 | 
			
		||||
		IncrementCollateral: sdk.MustNewDecFromStr("0.03"),
 | 
			
		||||
	}
 | 
			
		||||
	v16params := v016auction.Params{
 | 
			
		||||
		MaxAuctionDuration:  v15params.MaxAuctionDuration,
 | 
			
		||||
		BidDuration:         v15params.BidDuration,
 | 
			
		||||
		IncrementSurplus:    v15params.IncrementSurplus,
 | 
			
		||||
		IncrementDebt:       v15params.IncrementDebt,
 | 
			
		||||
		IncrementCollateral: v15params.IncrementCollateral,
 | 
			
		||||
	}
 | 
			
		||||
	expectedAuction := &v016auction.SurplusAuction{
 | 
			
		||||
		BaseAuction: v016auction.BaseAuction{
 | 
			
		||||
			ID:              2,
 | 
			
		||||
			Initiator:       s.addresses[0].String(),
 | 
			
		||||
			Lot:             sdk.NewInt64Coin("kava", 12),
 | 
			
		||||
			Bidder:          s.addresses[1],
 | 
			
		||||
			Bid:             sdk.NewInt64Coin("kava", 12),
 | 
			
		||||
			EndTime:         now,
 | 
			
		||||
			MaxEndTime:      now,
 | 
			
		||||
			HasReceivedBids: false,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Prepare v015genstate
 | 
			
		||||
	s.v15genstate = v015auction.GenesisState{
 | 
			
		||||
		NextAuctionID: 10,
 | 
			
		||||
		Params:        v15params,
 | 
			
		||||
		Auctions: v015auction.GenesisAuctions{
 | 
			
		||||
			v015auction.SurplusAuction{
 | 
			
		||||
				BaseAuction: v015auction.BaseAuction{
 | 
			
		||||
					ID:              2,
 | 
			
		||||
					Initiator:       s.addresses[0].String(),
 | 
			
		||||
					Lot:             sdk.NewInt64Coin("kava", 12),
 | 
			
		||||
					Bidder:          s.addresses[1],
 | 
			
		||||
					Bid:             sdk.NewInt64Coin("kava", 12),
 | 
			
		||||
					EndTime:         now,
 | 
			
		||||
					MaxEndTime:      now,
 | 
			
		||||
					HasReceivedBids: false,
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	expectedGenState, err := v016auction.NewGenesisState(10, v16params, []v016auction.GenesisAuction{expectedAuction})
 | 
			
		||||
	s.Require().NoError(err)
 | 
			
		||||
 | 
			
		||||
	genState := Migrate(s.v15genstate)
 | 
			
		||||
	s.Equal(expectedGenState, genState)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMigrateTestSuite(t *testing.T) {
 | 
			
		||||
	suite.Run(t, new(migrateTestSuite))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										25
									
								
								x/auction/legacy/v0_17/migrate.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								x/auction/legacy/v0_17/migrate.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
			
		||||
package v0_17
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	v016auction "github.com/kava-labs/kava/x/auction/legacy/v0_16"
 | 
			
		||||
	v017auction "github.com/kava-labs/kava/x/auction/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Migrate(oldState v016auction.GenesisState) *v017auction.GenesisState {
 | 
			
		||||
	return &v017auction.GenesisState{
 | 
			
		||||
		NextAuctionId: oldState.NextAuctionId,
 | 
			
		||||
		Params:        migrateParams(oldState.Params),
 | 
			
		||||
		Auctions:      oldState.Auctions,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func migrateParams(params v016auction.Params) v017auction.Params {
 | 
			
		||||
	return v017auction.Params{
 | 
			
		||||
		MaxAuctionDuration:  params.MaxAuctionDuration,
 | 
			
		||||
		ForwardBidDuration:  v017auction.DefaultForwardBidDuration,
 | 
			
		||||
		ReverseBidDuration:  v017auction.DefaultReverseBidDuration,
 | 
			
		||||
		IncrementSurplus:    params.IncrementSurplus,
 | 
			
		||||
		IncrementDebt:       params.IncrementDebt,
 | 
			
		||||
		IncrementCollateral: params.IncrementCollateral,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -74,8 +74,8 @@ var xxx_messageInfo_GenesisState proto.InternalMessageInfo
 | 
			
		||||
// Params defines the parameters for the issuance module.
 | 
			
		||||
type Params struct {
 | 
			
		||||
	MaxAuctionDuration  time.Duration                          `protobuf:"bytes,1,opt,name=max_auction_duration,json=maxAuctionDuration,proto3,stdduration" json:"max_auction_duration"`
 | 
			
		||||
	ForwardBidDuration  time.Duration                          `protobuf:"bytes,2,opt,name=forward_bid_duration,json=forwardBidDuration,proto3,stdduration" json:"forward_bid_duration"`
 | 
			
		||||
	ReverseBidDuration  time.Duration                          `protobuf:"bytes,6,opt,name=reverse_bid_duration,json=reverseBidDuration,proto3,stdduration" json:"reverse_bid_duration"`
 | 
			
		||||
	ForwardBidDuration  time.Duration                          `protobuf:"bytes,6,opt,name=forward_bid_duration,json=forwardBidDuration,proto3,stdduration" json:"forward_bid_duration"`
 | 
			
		||||
	ReverseBidDuration  time.Duration                          `protobuf:"bytes,7,opt,name=reverse_bid_duration,json=reverseBidDuration,proto3,stdduration" json:"reverse_bid_duration"`
 | 
			
		||||
	IncrementSurplus    github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=increment_surplus,json=incrementSurplus,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"increment_surplus"`
 | 
			
		||||
	IncrementDebt       github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=increment_debt,json=incrementDebt,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"increment_debt"`
 | 
			
		||||
	IncrementCollateral github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=increment_collateral,json=incrementCollateral,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"increment_collateral"`
 | 
			
		||||
@ -124,38 +124,38 @@ func init() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_d0e5cb58293042f7 = []byte{
 | 
			
		||||
	// 487 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x93, 0x4f, 0x6f, 0xd3, 0x30,
 | 
			
		||||
	0x18, 0xc6, 0xe3, 0xad, 0x54, 0x93, 0xbb, 0x0d, 0x30, 0x39, 0x64, 0x13, 0x4a, 0xab, 0x1e, 0xa6,
 | 
			
		||||
	0x72, 0xa8, 0xa3, 0x95, 0x1b, 0xb7, 0x85, 0x4a, 0x13, 0x37, 0x94, 0x69, 0x17, 0x38, 0x44, 0x4e,
 | 
			
		||||
	0xe2, 0x85, 0x68, 0x49, 0x5c, 0xd9, 0x4e, 0x69, 0xbf, 0x05, 0x47, 0x3e, 0x00, 0x1f, 0x81, 0x03,
 | 
			
		||||
	0x1f, 0xa1, 0xe2, 0xb4, 0x23, 0xe2, 0x30, 0xa0, 0xfd, 0x22, 0x28, 0xb6, 0x9b, 0x96, 0x3f, 0x97,
 | 
			
		||||
	0xed, 0x14, 0xfb, 0x7d, 0x9f, 0xe7, 0xf7, 0x3e, 0x4e, 0x1c, 0xd8, 0xbf, 0x26, 0x53, 0xe2, 0x91,
 | 
			
		||||
	0x2a, 0x96, 0x19, 0x2b, 0xbd, 0xe9, 0x69, 0x44, 0x25, 0x39, 0xf5, 0x52, 0x5a, 0x52, 0x91, 0x09,
 | 
			
		||||
	0x3c, 0xe1, 0x4c, 0x32, 0x64, 0xd7, 0x1a, 0x6c, 0x34, 0xd8, 0x68, 0x8e, 0xed, 0x94, 0xa5, 0x4c,
 | 
			
		||||
	0x09, 0xbc, 0x7a, 0xa5, 0xb5, 0xc7, 0x47, 0x29, 0x63, 0x69, 0x4e, 0x3d, 0xb5, 0x8b, 0xaa, 0x2b,
 | 
			
		||||
	0x8f, 0x94, 0xf3, 0x75, 0x2b, 0x66, 0xa2, 0x60, 0x22, 0xd4, 0x1e, 0xbd, 0x31, 0x2d, 0xf7, 0x6f,
 | 
			
		||||
	0x57, 0x52, 0x71, 0xa2, 0xa6, 0xa9, 0x4a, 0xff, 0x0b, 0x80, 0xfb, 0xe7, 0x3a, 0xd3, 0x85, 0x24,
 | 
			
		||||
	0x92, 0xa2, 0x13, 0xf8, 0xb0, 0xa4, 0x33, 0x19, 0x9a, 0x50, 0x61, 0x96, 0x38, 0xa0, 0x07, 0x06,
 | 
			
		||||
	0xad, 0xe0, 0xa0, 0x2e, 0x9f, 0xe9, 0xea, 0xab, 0x04, 0xbd, 0x80, 0xed, 0x09, 0xe1, 0xa4, 0x10,
 | 
			
		||||
	0xce, 0x4e, 0x0f, 0x0c, 0x3a, 0xa3, 0xa7, 0xf8, 0x7f, 0x67, 0xc1, 0xaf, 0x95, 0xc6, 0x6f, 0x2d,
 | 
			
		||||
	0x6e, 0xbb, 0x56, 0x60, 0x1c, 0x68, 0x0c, 0xf7, 0x8c, 0x4e, 0x38, 0xbb, 0xbd, 0xdd, 0x41, 0x67,
 | 
			
		||||
	0x64, 0x63, 0x9d, 0x13, 0xaf, 0x73, 0xe2, 0xb3, 0x72, 0xee, 0xa3, 0xaf, 0x9f, 0x87, 0x87, 0x26,
 | 
			
		||||
	0x9d, 0x99, 0x1c, 0x34, 0xce, 0xfe, 0xa7, 0x16, 0x6c, 0x6b, 0x3c, 0xba, 0x84, 0x76, 0x41, 0x66,
 | 
			
		||||
	0x4d, 0xe6, 0xf5, 0x19, 0x55, 0xf2, 0xce, 0xe8, 0xe8, 0x1f, 0xf8, 0xd8, 0x08, 0xfc, 0xbd, 0x3a,
 | 
			
		||||
	0xd7, 0xc7, 0x1f, 0x5d, 0x10, 0xa0, 0x82, 0xcc, 0xcc, 0x8c, 0x75, 0xb7, 0xc6, 0x5e, 0x31, 0xfe,
 | 
			
		||||
	0x9e, 0xf0, 0x24, 0x8c, 0xb2, 0x64, 0x83, 0xdd, 0xb9, 0x03, 0xd6, 0x00, 0xfc, 0x2c, 0xd9, 0xc6,
 | 
			
		||||
	0x72, 0x3a, 0xa5, 0x5c, 0xd0, 0x3f, 0xb1, 0xed, 0x3b, 0x60, 0x0d, 0x60, 0x1b, 0xfb, 0x16, 0x3e,
 | 
			
		||||
	0xce, 0xca, 0x98, 0xd3, 0x82, 0x96, 0x32, 0x14, 0x15, 0x9f, 0xe4, 0x55, 0xfd, 0x7a, 0xc1, 0x60,
 | 
			
		||||
	0xdf, 0xc7, 0xb5, 0xf1, 0xfb, 0x6d, 0xf7, 0x24, 0xcd, 0xe4, 0xbb, 0x2a, 0xc2, 0x31, 0x2b, 0xcc,
 | 
			
		||||
	0x35, 0x31, 0x8f, 0xa1, 0x48, 0xae, 0x3d, 0x39, 0x9f, 0x50, 0x81, 0xc7, 0x34, 0x0e, 0x1e, 0x35,
 | 
			
		||||
	0xa0, 0x0b, 0xcd, 0x41, 0x97, 0xf0, 0x70, 0x03, 0x4f, 0x68, 0x24, 0x9d, 0xd6, 0xbd, 0xc8, 0x07,
 | 
			
		||||
	0x0d, 0x65, 0x4c, 0x23, 0x89, 0x08, 0xb4, 0x37, 0xd8, 0x98, 0xe5, 0x39, 0x91, 0x94, 0x93, 0xdc,
 | 
			
		||||
	0x79, 0x70, 0x2f, 0xf8, 0x93, 0x86, 0xf5, 0xb2, 0x41, 0xf9, 0xe7, 0x8b, 0x5f, 0xae, 0xb5, 0x58,
 | 
			
		||||
	0xba, 0xe0, 0x66, 0xe9, 0x82, 0x9f, 0x4b, 0x17, 0x7c, 0x58, 0xb9, 0xd6, 0xcd, 0xca, 0xb5, 0xbe,
 | 
			
		||||
	0xad, 0x5c, 0xeb, 0xcd, 0xb3, 0x2d, 0x74, 0x7d, 0x81, 0x87, 0x39, 0x89, 0x84, 0x5a, 0x79, 0xb3,
 | 
			
		||||
	0xe6, 0xe7, 0x55, 0x13, 0xa2, 0xb6, 0xfa, 0x20, 0xcf, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x71,
 | 
			
		||||
	0x67, 0x8c, 0x47, 0xd9, 0x03, 0x00, 0x00,
 | 
			
		||||
	// 496 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x93, 0xc1, 0x6e, 0xd3, 0x30,
 | 
			
		||||
	0x18, 0xc7, 0x93, 0x35, 0x94, 0xca, 0xed, 0xc6, 0x30, 0x39, 0x64, 0x13, 0x4a, 0xab, 0x1e, 0xa6,
 | 
			
		||||
	0x72, 0xa8, 0xa3, 0x95, 0x1b, 0xb7, 0x85, 0x4a, 0x13, 0x9c, 0x50, 0xa6, 0x5d, 0xe0, 0x10, 0x39,
 | 
			
		||||
	0x89, 0x17, 0xa2, 0x25, 0x71, 0x65, 0x3b, 0xa5, 0x7d, 0x0b, 0x8e, 0x3c, 0x08, 0x87, 0x3d, 0x42,
 | 
			
		||||
	0xc5, 0x69, 0x47, 0xc4, 0x61, 0x40, 0xfb, 0x22, 0x28, 0x8e, 0x9b, 0x16, 0xd8, 0x65, 0x3d, 0xd5,
 | 
			
		||||
	0xfe, 0xbe, 0xff, 0xf7, 0xfb, 0xff, 0xed, 0x3a, 0xa0, 0x7f, 0x8d, 0xa7, 0xd8, 0xc1, 0x45, 0x28,
 | 
			
		||||
	0x12, 0x9a, 0x3b, 0xd3, 0xd3, 0x80, 0x08, 0x7c, 0xea, 0xc4, 0x24, 0x27, 0x3c, 0xe1, 0x68, 0xc2,
 | 
			
		||||
	0xa8, 0xa0, 0xd0, 0x2c, 0x35, 0x48, 0x69, 0x90, 0xd2, 0x1c, 0x9b, 0x31, 0x8d, 0xa9, 0x14, 0x38,
 | 
			
		||||
	0xe5, 0xaa, 0xd2, 0x1e, 0x1f, 0xc5, 0x94, 0xc6, 0x29, 0x71, 0xe4, 0x2e, 0x28, 0xae, 0x1c, 0x9c,
 | 
			
		||||
	0xcf, 0xd7, 0xad, 0x90, 0xf2, 0x8c, 0x72, 0xbf, 0x9a, 0xa9, 0x36, 0xaa, 0x65, 0xff, 0x3b, 0x15,
 | 
			
		||||
	0x15, 0x0c, 0x4b, 0x37, 0x59, 0xe9, 0xdf, 0xe8, 0xa0, 0x73, 0x5e, 0x65, 0xba, 0x10, 0x58, 0x10,
 | 
			
		||||
	0x78, 0x02, 0x9e, 0xe4, 0x64, 0x26, 0x7c, 0x15, 0xca, 0x4f, 0x22, 0x4b, 0xef, 0xe9, 0x03, 0xc3,
 | 
			
		||||
	0xdb, 0x2f, 0xcb, 0x67, 0x55, 0xf5, 0x4d, 0x04, 0x5f, 0x81, 0xe6, 0x04, 0x33, 0x9c, 0x71, 0x6b,
 | 
			
		||||
	0xaf, 0xa7, 0x0f, 0xda, 0xa3, 0xe7, 0xe8, 0xbe, 0xb3, 0xa0, 0x77, 0x52, 0xe3, 0x1a, 0x8b, 0xbb,
 | 
			
		||||
	0xae, 0xe6, 0xa9, 0x09, 0x38, 0x06, 0x2d, 0xa5, 0xe3, 0x56, 0xa3, 0xd7, 0x18, 0xb4, 0x47, 0x26,
 | 
			
		||||
	0xaa, 0x72, 0xa2, 0x75, 0x4e, 0x74, 0x96, 0xcf, 0x5d, 0xf8, 0xed, 0xeb, 0xf0, 0x40, 0xa5, 0x53,
 | 
			
		||||
	0xce, 0x5e, 0x3d, 0xd9, 0xbf, 0x31, 0x40, 0xb3, 0xc2, 0xc3, 0x4b, 0x60, 0x66, 0x78, 0x56, 0x67,
 | 
			
		||||
	0x5e, 0x9f, 0x51, 0x26, 0x6f, 0x8f, 0x8e, 0xfe, 0x83, 0x8f, 0x95, 0xc0, 0x6d, 0x95, 0xb9, 0xbe,
 | 
			
		||||
	0xfc, 0xec, 0xea, 0x1e, 0xcc, 0xf0, 0x4c, 0x79, 0xac, 0xbb, 0x25, 0xf6, 0x8a, 0xb2, 0x4f, 0x98,
 | 
			
		||||
	0x45, 0x7e, 0x90, 0x44, 0x1b, 0x6c, 0xf3, 0x01, 0x58, 0x05, 0x70, 0x93, 0x68, 0x1b, 0xcb, 0xc8,
 | 
			
		||||
	0x94, 0x30, 0x4e, 0xfe, 0xc6, 0x3e, 0x7e, 0x00, 0x56, 0x01, 0xb6, 0xb1, 0x1f, 0xc0, 0xd3, 0x24,
 | 
			
		||||
	0x0f, 0x19, 0xc9, 0x48, 0x2e, 0x7c, 0x5e, 0xb0, 0x49, 0x5a, 0x94, 0xd7, 0xab, 0x0f, 0x3a, 0x2e,
 | 
			
		||||
	0x2a, 0x07, 0x7f, 0xdc, 0x75, 0x4f, 0xe2, 0x44, 0x7c, 0x2c, 0x02, 0x14, 0xd2, 0x4c, 0x3d, 0x13,
 | 
			
		||||
	0xf5, 0x33, 0xe4, 0xd1, 0xb5, 0x23, 0xe6, 0x13, 0xc2, 0xd1, 0x98, 0x84, 0xde, 0x61, 0x0d, 0xba,
 | 
			
		||||
	0xa8, 0x38, 0xf0, 0x12, 0x1c, 0x6c, 0xe0, 0x11, 0x09, 0x84, 0x65, 0xec, 0x44, 0xde, 0xaf, 0x29,
 | 
			
		||||
	0x63, 0x12, 0x08, 0x88, 0x81, 0xb9, 0xc1, 0x86, 0x34, 0x4d, 0xb1, 0x20, 0x0c, 0xa7, 0xd6, 0xa3,
 | 
			
		||||
	0x9d, 0xe0, 0xcf, 0x6a, 0xd6, 0xeb, 0x1a, 0xf5, 0xd6, 0x68, 0xed, 0x1d, 0x36, 0xbc, 0xce, 0xf6,
 | 
			
		||||
	0x4d, 0xbb, 0xe7, 0x8b, 0xdf, 0xb6, 0xb6, 0x58, 0xda, 0xfa, 0xed, 0xd2, 0xd6, 0x7f, 0x2d, 0x6d,
 | 
			
		||||
	0xfd, 0xf3, 0xca, 0xd6, 0x6e, 0x57, 0xb6, 0xf6, 0x7d, 0x65, 0x6b, 0xef, 0x5f, 0x6c, 0xd9, 0x95,
 | 
			
		||||
	0x8f, 0x7a, 0x98, 0xe2, 0x80, 0xcb, 0x95, 0x33, 0xab, 0x3f, 0x68, 0xe9, 0x1a, 0x34, 0xe5, 0x9f,
 | 
			
		||||
	0xf4, 0xf2, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x72, 0x5f, 0x95, 0x2e, 0xed, 0x03, 0x00, 0x00,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *GenesisState) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
@ -237,6 +237,14 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	i -= n2
 | 
			
		||||
	i = encodeVarintGenesis(dAtA, i, uint64(n2))
 | 
			
		||||
	i--
 | 
			
		||||
	dAtA[i] = 0x3a
 | 
			
		||||
	n3, err3 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.ForwardBidDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.ForwardBidDuration):])
 | 
			
		||||
	if err3 != nil {
 | 
			
		||||
		return 0, err3
 | 
			
		||||
	}
 | 
			
		||||
	i -= n3
 | 
			
		||||
	i = encodeVarintGenesis(dAtA, i, uint64(n3))
 | 
			
		||||
	i--
 | 
			
		||||
	dAtA[i] = 0x32
 | 
			
		||||
	{
 | 
			
		||||
		size := m.IncrementCollateral.Size()
 | 
			
		||||
@ -268,14 +276,6 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	}
 | 
			
		||||
	i--
 | 
			
		||||
	dAtA[i] = 0x1a
 | 
			
		||||
	n3, err3 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.ForwardBidDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.ForwardBidDuration):])
 | 
			
		||||
	if err3 != nil {
 | 
			
		||||
		return 0, err3
 | 
			
		||||
	}
 | 
			
		||||
	i -= n3
 | 
			
		||||
	i = encodeVarintGenesis(dAtA, i, uint64(n3))
 | 
			
		||||
	i--
 | 
			
		||||
	dAtA[i] = 0x12
 | 
			
		||||
	n4, err4 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MaxAuctionDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxAuctionDuration):])
 | 
			
		||||
	if err4 != nil {
 | 
			
		||||
		return 0, err4
 | 
			
		||||
@ -326,14 +326,14 @@ func (m *Params) Size() (n int) {
 | 
			
		||||
	_ = l
 | 
			
		||||
	l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxAuctionDuration)
 | 
			
		||||
	n += 1 + l + sovGenesis(uint64(l))
 | 
			
		||||
	l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.ForwardBidDuration)
 | 
			
		||||
	n += 1 + l + sovGenesis(uint64(l))
 | 
			
		||||
	l = m.IncrementSurplus.Size()
 | 
			
		||||
	n += 1 + l + sovGenesis(uint64(l))
 | 
			
		||||
	l = m.IncrementDebt.Size()
 | 
			
		||||
	n += 1 + l + sovGenesis(uint64(l))
 | 
			
		||||
	l = m.IncrementCollateral.Size()
 | 
			
		||||
	n += 1 + l + sovGenesis(uint64(l))
 | 
			
		||||
	l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.ForwardBidDuration)
 | 
			
		||||
	n += 1 + l + sovGenesis(uint64(l))
 | 
			
		||||
	l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.ReverseBidDuration)
 | 
			
		||||
	n += 1 + l + sovGenesis(uint64(l))
 | 
			
		||||
	return n
 | 
			
		||||
@ -543,39 +543,6 @@ func (m *Params) Unmarshal(dAtA []byte) error {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		case 2:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field ForwardBidDuration", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var msglen int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowGenesis
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				msglen |= int(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if msglen < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + msglen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.ForwardBidDuration, dAtA[iNdEx:postIndex]); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		case 3:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field IncrementSurplus", wireType)
 | 
			
		||||
@ -676,6 +643,39 @@ func (m *Params) Unmarshal(dAtA []byte) error {
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		case 6:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field ForwardBidDuration", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var msglen int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowGenesis
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				msglen |= int(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if msglen < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + msglen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthGenesis
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.ForwardBidDuration, dAtA[iNdEx:postIndex]); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		case 7:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field ReverseBidDuration", wireType)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@ const (
 | 
			
		||||
	// DefaultMaxAuctionDuration max length of auction
 | 
			
		||||
	DefaultMaxAuctionDuration time.Duration = 2 * 24 * time.Hour
 | 
			
		||||
	// DefaultForwardBidDuration how long an auction gets extended when someone bids for a forward auction
 | 
			
		||||
	DefaultForwardBidDuration time.Duration = 8 * time.Hour
 | 
			
		||||
	DefaultForwardBidDuration time.Duration = 24 * time.Hour
 | 
			
		||||
	// DefaultReverseBidDuration how long an auction gets extended when someone bids for a reverse auction
 | 
			
		||||
	DefaultReverseBidDuration time.Duration = 1 * time.Hour
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user