diff --git a/cmd/kvd/add_account.go b/cmd/kvd/add_account.go index 7a4f4fb2..2982a309 100644 --- a/cmd/kvd/add_account.go +++ b/cmd/kvd/add_account.go @@ -3,26 +3,33 @@ package main import ( "errors" "fmt" + "io/ioutil" + "strings" "github.com/spf13/cobra" "github.com/spf13/viper" + validatorvesting "github.com/kava-labs/kava/x/validator-vesting" "github.com/tendermint/tendermint/libs/cli" "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/x/auth" authexported "github.com/cosmos/cosmos-sdk/x/auth/exported" + "github.com/cosmos/cosmos-sdk/x/auth/vesting" "github.com/cosmos/cosmos-sdk/x/genutil" ) const ( - flagClientHome = "home-client" - flagVestingStart = "vesting-start-time" - flagVestingEnd = "vesting-end-time" - flagVestingAmt = "vesting-amount" + flagClientHome = "home-client" + flagVestingStart = "vesting-start-time" + flagVestingEnd = "vesting-end-time" + flagVestingAmt = "vesting-amount" + flagVestingPeriodsFile = "vesting-periods-file" + flagValidatorVestingFile = "validator-vesting-file" ) // AddGenesisAccountCmd returns an add-genesis-account cobra Command. @@ -33,11 +40,17 @@ func AddGenesisAccountCmd( cmd := &cobra.Command{ Use: "add-genesis-account [address_or_key_name] [coin][,[coin]]", Short: "Add a genesis account to genesis.json", - Long: `Add a genesis account to genesis.json. The provided account must specify + Long: strings.TrimSpace( + fmt.Sprintf(`Add a genesis account to genesis.json. The provided account must specify the account address or key name and a list of initial coins. If a key name is given, the address will be looked up in the local Keybase. The list of initial tokens must contain valid denominations. Accounts may optionally be supplied with vesting parameters. - `, + If the account is a periodic or validator vesting account, vesting periods must be suppleid + via a JSON file using the 'vesting-periods-file' flag or 'validator-vesting-file' flag, + respectively. + Example: + %s add-genesis-account --vesting-amount --vesting-end-time --vesting-start-time --vesting-periods `, version.ClientName), + ), Args: cobra.ExactArgs(2), RunE: func(_ *cobra.Command, args []string) error { config := ctx.Config @@ -70,22 +83,43 @@ func AddGenesisAccountCmd( if err != nil { return fmt.Errorf("failed to parse vesting amount: %w", err) } + vestingPeriodsFile := viper.GetString(flagVestingPeriodsFile) + validatorVestingFile := viper.GetString(flagValidatorVestingFile) + if vestingPeriodsFile != "" && validatorVestingFile != "" { + return errors.New("Cannot specify both vesting-periods-file and validator-vesting-file") + } // create concrete account type based on input parameters var genAccount authexported.GenesisAccount baseAccount := auth.NewBaseAccount(addr, coins.Sort(), nil, 0, 0) if !vestingAmt.IsZero() { - baseVestingAccount := auth.NewBaseVestingAccount( - baseAccount, vestingAmt.Sort(), sdk.Coins{}, sdk.Coins{}, vestingEnd, + baseVestingAccount := vesting.NewBaseVestingAccount( + baseAccount, vestingAmt.Sort(), vestingEnd, ) switch { + case vestingPeriodsFile != "": + vestingPeriodsJSON, err := ParsePeriodicVestingJSON(cdc, vestingPeriodsFile) + if err != nil { + return fmt.Errorf("failed to parse periodic vesting account json file: %w", err) + } + genAccount = vesting.NewPeriodicVestingAccountRaw(baseVestingAccount, vestingStart, vestingPeriodsJSON.Periods) + case validatorVestingFile != "": + validatorVestingJSON, err := ParseValidatorVestingJSON(cdc, validatorVestingFile) + if err != nil { + return fmt.Errorf("failed to parse validator vesting account json file: %w", err) + } + consAddr, err := sdk.ConsAddressFromHex(validatorVestingJSON.ValidatorAddress) + if err != nil { + return fmt.Errorf("failed to convert validator address to bytes: %w", err) + } + genAccount = validatorvesting.NewValidatorVestingAccountRaw(baseVestingAccount, vestingStart, validatorVestingJSON.Periods, consAddr, validatorVestingJSON.ReturnAddress, validatorVestingJSON.SigningThreshold) case vestingStart != 0 && vestingEnd != 0: - genAccount = auth.NewContinuousVestingAccountRaw(baseVestingAccount, vestingStart) + genAccount = vesting.NewContinuousVestingAccountRaw(baseVestingAccount, vestingStart) case vestingEnd != 0: - genAccount = auth.NewDelayedVestingAccountRaw(baseVestingAccount) + genAccount = vesting.NewDelayedVestingAccountRaw(baseVestingAccount) default: return errors.New("invalid vesting parameters; must supply start and end time or end time") @@ -136,6 +170,52 @@ func AddGenesisAccountCmd( cmd.Flags().String(flagVestingAmt, "", "amount of coins for vesting accounts") cmd.Flags().Uint64(flagVestingStart, 0, "schedule start time (unix epoch) for vesting accounts") cmd.Flags().Uint64(flagVestingEnd, 0, "schedule end time (unix epoch) for vesting accounts") - + cmd.Flags().String(flagVestingPeriodsFile, "", "path to file where periodic vesting schedule is specified") + cmd.Flags().String(flagValidatorVestingFile, "", "path to file where validator vesting schedule is specified") return cmd } + +// ValidatorVestingJSON input json for validator-vesting-file flag +type ValidatorVestingJSON struct { + Periods vesting.Periods `json:"periods" yaml:"periods"` + ValidatorAddress string `json:"validator_address" yaml:"validator_address"` + SigningThreshold int64 `json:"signing_threshold" yaml:"signing_threshold"` + ReturnAddress sdk.AccAddress `json:"return_address,omitempty" yaml:"return_address,omitempty"` +} + +// PeriodicVestingJSON input json for vesting-periods-file flag +type PeriodicVestingJSON struct { + Periods vesting.Periods `json:"periods" yaml:"periods"` +} + +// ParsePeriodicVestingJSON reads and parses ParsePeriodicVestingJSON from the file +func ParsePeriodicVestingJSON(cdc *codec.Codec, inputFile string) (PeriodicVestingJSON, error) { + periodsInput := PeriodicVestingJSON{} + + content, err := ioutil.ReadFile(inputFile) + + if err != nil { + return periodsInput, err + } + + if err := cdc.UnmarshalJSON(content, &periodsInput); err != nil { + return periodsInput, err + } + + return periodsInput, nil +} + +// ParseValidatorVestingJSON reads and parses ParseValidatorVestingJSON from the file +func ParseValidatorVestingJSON(cdc *codec.Codec, inputFile string) (ValidatorVestingJSON, error) { + validatorVestingInput := ValidatorVestingJSON{} + content, err := ioutil.ReadFile(inputFile) + + if err != nil { + return validatorVestingInput, err + } + + if err := cdc.UnmarshalJSON(content, &validatorVestingInput); err != nil { + return validatorVestingInput, err + } + return validatorVestingInput, nil +} diff --git a/go.mod b/go.mod index 6e688a90..b0f6d7a8 100644 --- a/go.mod +++ b/go.mod @@ -9,9 +9,9 @@ require ( github.com/spf13/viper v1.4.0 github.com/stretchr/testify v1.4.0 github.com/tendermint/go-amino v0.15.0 - github.com/tendermint/tendermint v0.32.3 + github.com/tendermint/tendermint v0.32.5 github.com/tendermint/tm-db v0.2.0 - gopkg.in/yaml.v2 v2.2.2 + gopkg.in/yaml.v2 v2.2.3 ) replace github.com/cosmos/cosmos-sdk => ../../cosmos/cosmos-sdk diff --git a/go.sum b/go.sum index 5ddef612..0154b17c 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/Workiva/go-datastructures v1.0.50/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -73,6 +74,8 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/go-kit/kit v0.6.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= @@ -143,8 +146,12 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= @@ -189,6 +196,8 @@ github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165/go.mod h1:bCqn github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= @@ -237,6 +246,8 @@ github.com/tendermint/iavl v0.12.4/go.mod h1:8LHakzt8/0G3/I8FUU0ReNx98S/EP6eyPJk github.com/tendermint/tendermint v0.32.1/go.mod h1:jmPDAKuNkev9793/ivn/fTBnfpA9mGBww8MPRNPNxnU= github.com/tendermint/tendermint v0.32.3 h1:GEnWpGQ795h5oTFNbfBLsY0LW/CW2j6p6HtiYNfxsgg= github.com/tendermint/tendermint v0.32.3/go.mod h1:ZK2c29jl1QRYznIRyRWRDsmm1yvtPzBRT00x4t1JToY= +github.com/tendermint/tendermint v0.32.5 h1:2hCLwuzfCKZxXSe/+iMEl+ChJWKJx6g/Wcvq3NMxVN4= +github.com/tendermint/tendermint v0.32.5/go.mod h1:D2+A3pNjY+Po72X0mTfaXorFhiVI8dh/Zg640FGyGtE= github.com/tendermint/tm-db v0.1.1 h1:G3Xezy3sOk9+ekhjZ/kjArYIs1SmwV+1OUgNkj7RgV0= github.com/tendermint/tm-db v0.1.1/go.mod h1:0cPKWu2Mou3IlxecH+MEUSYc1Ch537alLe6CpFrKzgw= github.com/tendermint/tm-db v0.2.0 h1:rJxgdqn6fIiVJZy4zLpY1qVlyD0TU6vhkT4kEf71TQQ= @@ -310,6 +321,8 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.22.0 h1:J0UbZOIrCAl+fpTOf8YLs4dJo8L/owV4LYVtAXQoPkw= google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1 h1:q4XQuHFC6I28BKZpo6IYyb3mNO+l7lSOxRuYTCiDfXk= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= @@ -323,5 +336,7 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/x/validator-vesting/genesis.go b/x/validator-vesting/genesis.go index 7ee5b460..17762ec3 100644 --- a/x/validator-vesting/genesis.go +++ b/x/validator-vesting/genesis.go @@ -11,7 +11,7 @@ func InitGenesis(ctx sdk.Context, keeper Keeper, accountKeeper types.AccountKeep accounts := accountKeeper.GetAllAccounts(ctx) for _, a := range accounts { - vv, ok := a.(ValidatorVestingAccount) + vv, ok := a.(*ValidatorVestingAccount) if ok { keeper.SetValidatorVestingAccountKey(ctx, vv.Address) } diff --git a/x/validator-vesting/internal/keeper/keeper.go b/x/validator-vesting/internal/keeper/keeper.go index 96fc2ecd..f1cf48b1 100644 --- a/x/validator-vesting/internal/keeper/keeper.go +++ b/x/validator-vesting/internal/keeper/keeper.go @@ -163,6 +163,7 @@ func (k Keeper) HandleVestingDebt(ctx sdk.Context, addr sdk.AccAddress, blockTim panic(err) } } + vv = k.GetAccountFromAuthKeeper(ctx, addr) vv.DebtAfterFailedVesting = sdk.NewCoins() k.ak.SetAccount(ctx, vv) } else { diff --git a/x/validator-vesting/internal/keeper/keeper_test.go b/x/validator-vesting/internal/keeper/keeper_test.go index 8299226a..792d7a70 100644 --- a/x/validator-vesting/internal/keeper/keeper_test.go +++ b/x/validator-vesting/internal/keeper/keeper_test.go @@ -203,7 +203,6 @@ func TestHandleVestingDebtNoDebt(t *testing.T) { vva = keeper.GetAccountFromAuthKeeper(ctx, vva.Address) require.Equal(t, origCoins, vva.DelegatedVesting) require.Nil(t, vva.DelegatedFree) - require.Nil(t, vva.GetCoins()) } diff --git a/x/validator-vesting/internal/types/validator_vesting_account.go b/x/validator-vesting/internal/types/validator_vesting_account.go index 35092f55..fb39111f 100644 --- a/x/validator-vesting/internal/types/validator_vesting_account.go +++ b/x/validator-vesting/internal/types/validator_vesting_account.go @@ -43,13 +43,11 @@ type ValidatorVestingAccount struct { // NewValidatorVestingAccountRaw creates a new ValidatorVestingAccount object from BaseVestingAccount func NewValidatorVestingAccountRaw(bva *vestingtypes.BaseVestingAccount, startTime int64, periods vestingtypes.Periods, validatorAddress sdk.ConsAddress, returnAddress sdk.AccAddress, signingThreshold int64) *ValidatorVestingAccount { - cva := &vestingtypes.ContinuousVestingAccount{ - StartTime: startTime, - BaseVestingAccount: bva, - } + pva := &vestingtypes.PeriodicVestingAccount{ - ContinuousVestingAccount: cva, - VestingPeriods: periods, + BaseVestingAccount: bva, + StartTime: startTime, + VestingPeriods: periods, } var vestingPeriodProgress = make([][]int, len(periods)) for i := range vestingPeriodProgress { @@ -79,13 +77,10 @@ func NewValidatorVestingAccount(baseAcc *authtypes.BaseAccount, startTime int64, OriginalVesting: baseAcc.Coins, EndTime: endTime, } - cva := &vestingtypes.ContinuousVestingAccount{ - StartTime: startTime, - BaseVestingAccount: baseVestingAcc, - } pva := &vestingtypes.PeriodicVestingAccount{ - ContinuousVestingAccount: cva, - VestingPeriods: periods, + BaseVestingAccount: baseVestingAcc, + StartTime: startTime, + VestingPeriods: periods, } var vestingPeriodProgress = make([][]int, len(periods)) for i := range vestingPeriodProgress { diff --git a/x/validator-vesting/internal/types/validator_vesting_account_test.go b/x/validator-vesting/internal/types/validator_vesting_account_test.go index b830cd0a..b5e7db4a 100644 --- a/x/validator-vesting/internal/types/validator_vesting_account_test.go +++ b/x/validator-vesting/internal/types/validator_vesting_account_test.go @@ -286,8 +286,6 @@ func TestTrackDelegationValidatorVestingAcc(t *testing.T) { vva.TrackDelegation(now, origCoins) require.Equal(t, origCoins, vva.DelegatedVesting) require.Nil(t, vva.DelegatedFree) - require.Nil(t, vva.GetCoins()) - require.Nil(t, vva.SpendableCoins(now)) // all periods pass successfully bacc.SetCoins(origCoins) @@ -299,8 +297,6 @@ func TestTrackDelegationValidatorVestingAcc(t *testing.T) { // require all delegated coins are free require.Equal(t, origCoins, vva.DelegatedFree) require.Nil(t, vva.DelegatedVesting) - require.Nil(t, vva.GetCoins()) - require.Nil(t, vva.SpendableCoins(now.Add(48*time.Hour))) // require the ability to delegate all vesting coins (50%) and all vested coins (50%) bacc.SetCoins(origCoins) @@ -313,7 +309,6 @@ func TestTrackDelegationValidatorVestingAcc(t *testing.T) { vva.TrackDelegation(now.Add(12*time.Hour), sdk.Coins{sdk.NewInt64Coin(stakeDenom, 50)}) require.Equal(t, sdk.Coins{sdk.NewInt64Coin(stakeDenom, 50)}, vva.DelegatedVesting) require.Equal(t, sdk.Coins{sdk.NewInt64Coin(stakeDenom, 50)}, vva.DelegatedFree) - require.Equal(t, sdk.Coins{sdk.NewInt64Coin(feeDenom, 1000)}, vva.GetCoins()) // require no modifications when delegation amount is zero or not enough funds bacc.SetCoins(origCoins) @@ -323,7 +318,6 @@ func TestTrackDelegationValidatorVestingAcc(t *testing.T) { }) require.Nil(t, vva.DelegatedVesting) require.Nil(t, vva.DelegatedFree) - require.Equal(t, origCoins, vva.GetCoins()) } func TestTrackUndelegationPeriodicVestingAcc(t *testing.T) { @@ -347,7 +341,6 @@ func TestTrackUndelegationPeriodicVestingAcc(t *testing.T) { vva.TrackUndelegation(origCoins) require.Nil(t, vva.DelegatedFree) require.Nil(t, vva.DelegatedVesting) - require.Equal(t, origCoins, vva.GetCoins()) // require the ability to delegate all coins after they have successfully vested bacc.SetCoins(origCoins) @@ -359,7 +352,6 @@ func TestTrackUndelegationPeriodicVestingAcc(t *testing.T) { vva.TrackUndelegation(origCoins) require.Nil(t, vva.DelegatedFree) require.Nil(t, vva.DelegatedVesting) - require.Equal(t, origCoins, vva.GetCoins()) // require panic and no modifications when attempting to undelegate zero coins bacc.SetCoins(origCoins) @@ -369,7 +361,6 @@ func TestTrackUndelegationPeriodicVestingAcc(t *testing.T) { }) require.Nil(t, vva.DelegatedFree) require.Nil(t, vva.DelegatedVesting) - require.Equal(t, origCoins, vva.GetCoins()) // successfuly vest period 1 and delegate to two validators vva = NewValidatorVestingAccount(&bacc, now.Unix(), periods, testConsAddr, nil, 90) @@ -381,13 +372,11 @@ func TestTrackUndelegationPeriodicVestingAcc(t *testing.T) { vva.TrackUndelegation(sdk.Coins{sdk.NewInt64Coin(stakeDenom, 25)}) require.Equal(t, sdk.Coins{sdk.NewInt64Coin(stakeDenom, 25)}, vva.DelegatedFree) require.Equal(t, sdk.Coins{sdk.NewInt64Coin(stakeDenom, 50)}, vva.DelegatedVesting) - require.Equal(t, sdk.Coins{sdk.NewInt64Coin(feeDenom, 1000), sdk.NewInt64Coin(stakeDenom, 25)}, vva.GetCoins()) // undelegate from the other validator that did not get slashed vva.TrackUndelegation(sdk.Coins{sdk.NewInt64Coin(stakeDenom, 50)}) require.Nil(t, vva.DelegatedFree) require.Equal(t, sdk.Coins{sdk.NewInt64Coin(stakeDenom, 25)}, vva.DelegatedVesting) - require.Equal(t, sdk.Coins{sdk.NewInt64Coin(feeDenom, 1000), sdk.NewInt64Coin(stakeDenom, 75)}, vva.GetCoins()) } func TestGenesisAccountValidate(t *testing.T) {