From 6db4a97439deaf0ec671c4069013282efe7ced3c Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Tue, 9 Jan 2024 20:24:14 +0700 Subject: [PATCH 01/18] use types errors of sdk --- x/multi-staking/types/msg.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x/multi-staking/types/msg.go b/x/multi-staking/types/msg.go index 4556fa48..3a060fbb 100644 --- a/x/multi-staking/types/msg.go +++ b/x/multi-staking/types/msg.go @@ -94,7 +94,7 @@ func (msg MsgCreateValidator) ValidateBasic() error { // note that unmarshaling from bech32 ensures both non-empty and valid multiStakerAddr, valAddr, err := AccAddrAndValAddrFromStrings(msg.MultiStakerAddress, msg.ValidatorAddress) if err != nil { - return err + return sdkerrors.ErrInvalidAddress.Wrap(err.Error()) } if !sdk.AccAddress(valAddr).Equals(multiStakerAddr) { @@ -229,7 +229,7 @@ func (msg MsgDelegate) GetSignBytes() []byte { // ValidateBasic implements the sdk.Msg interface. func (msg MsgDelegate) ValidateBasic() error { if _, _, err := AccAddrAndValAddrFromStrings(msg.MultiStakerAddress, msg.ValidatorAddress); err != nil { - return err + return sdkerrors.ErrInvalidAddress.Wrap(err.Error()) } if !msg.Amount.IsValid() || !msg.Amount.Amount.IsPositive() { @@ -328,7 +328,7 @@ func (msg MsgUndelegate) GetSignBytes() []byte { // ValidateBasic implements the sdk.Msg interface. func (msg MsgUndelegate) ValidateBasic() error { if _, _, err := AccAddrAndValAddrFromStrings(msg.MultiStakerAddress, msg.ValidatorAddress); err != nil { - return err + return sdkerrors.ErrInvalidAddress.Wrap(err.Error()) } if !msg.Amount.IsValid() || !msg.Amount.Amount.IsPositive() { From bea2df2dca1062f7d3b413d78b277cedf17bbd52 Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Tue, 9 Jan 2024 20:24:37 +0700 Subject: [PATCH 02/18] msg types test --- x/multi-staking/types/msg_test.go | 588 ++++++++++++++++++++++++++++++ 1 file changed, 588 insertions(+) create mode 100644 x/multi-staking/types/msg_test.go diff --git a/x/multi-staking/types/msg_test.go b/x/multi-staking/types/msg_test.go new file mode 100644 index 00000000..a26d66d3 --- /dev/null +++ b/x/multi-staking/types/msg_test.go @@ -0,0 +1,588 @@ +package types_test + +import ( + "testing" + + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + // govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + // govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/stretchr/testify/require" + + "github.com/realio-tech/multi-staking-module/testutil" + "github.com/realio-tech/multi-staking-module/x/multi-staking/types" +) + +// MsgBeginRedelegate +func TestMsgBeginRedelegate_ValidateBasic(t *testing.T) { + mulStakeAddr := testutil.GenAddress() + valSrcAddr := testutil.GenValAddress() + valDstAddr := testutil.GenValAddress() + denom := "ario" + coin := sdk.NewCoin(denom, sdk.NewInt(10000)) + + tests := []struct { + name string + msg types.MsgBeginRedelegate + err error + }{ + { + name: "happy path", + msg: types.MsgBeginRedelegate{ + MultiStakerAddress: mulStakeAddr.String(), + ValidatorSrcAddress: valSrcAddr.String(), + ValidatorDstAddress: valDstAddr.String(), + Amount: coin, + }, + }, + { + name: "invalid address", + msg: types.MsgBeginRedelegate{ + MultiStakerAddress: "", + ValidatorSrcAddress: "", + ValidatorDstAddress: "", + Amount: coin, + }, + err: sdkerrors.ErrInvalidAddress, + }, + { + name: "invalid shares amount", + msg: types.MsgBeginRedelegate{ + MultiStakerAddress: mulStakeAddr.String(), + ValidatorSrcAddress: valSrcAddr.String(), + ValidatorDstAddress: valDstAddr.String(), + Amount: sdk.NewCoin(denom, sdk.ZeroInt()), + }, + err: sdkerrors.ErrInvalidRequest, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} + +// MsgCancelUnbonding +func TestMsgCancelUnbondingDelegation_ValidateBasic(t *testing.T) { + mulStakeAddr := testutil.GenAddress() + valAddr := testutil.GenValAddress() + denom := "ario" + coin := sdk.NewCoin(denom, sdk.NewInt(10000)) + + tests := []struct { + name string + msg types.MsgCancelUnbonding + err error + }{ + { + name: "happy path", + msg: types.MsgCancelUnbonding{ + MultiStakerAddress: mulStakeAddr.String(), + ValidatorAddress: valAddr.String(), + Amount: coin, + CreationHeight: 1, + }, + }, + { + name: "invalid address", + msg: types.MsgCancelUnbonding{ + MultiStakerAddress: "", + ValidatorAddress: "", + Amount: coin, + CreationHeight: 1, + }, + err: sdkerrors.ErrInvalidAddress, + }, + { + name: "invalid height", + msg: types.MsgCancelUnbonding{ + MultiStakerAddress: mulStakeAddr.String(), + ValidatorAddress: valAddr.String(), + Amount: coin, + CreationHeight: 0, + }, + err: sdkerrors.ErrInvalidRequest, + }, + { + name: "invalid amount", + msg: types.MsgCancelUnbonding{ + MultiStakerAddress: mulStakeAddr.String(), + ValidatorAddress: valAddr.String(), + Amount: sdk.NewCoin(denom, sdk.ZeroInt()), + CreationHeight: 1, + }, + err: sdkerrors.ErrInvalidRequest, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} + +// MsgCreateValidator +func TestMsgCreateValidator_ValidateBasic(t *testing.T) { + valPubKey := testutil.GenPubKey() + valAddr := sdk.ValAddress(valPubKey.Address()) + mulStakeAddr := sdk.AccAddress(valAddr) + pubKey := codectypes.UnsafePackAny(valPubKey) + denom := "ario" + coin := sdk.NewCoin(denom, sdk.NewInt(10000)) + + tests := []struct { + name string + msg types.MsgCreateValidator + err error + }{ + { + name: "happy path", + msg: types.MsgCreateValidator{ + MultiStakerAddress: mulStakeAddr.String(), + ValidatorAddress: valAddr.String(), + Value: coin, + Pubkey: pubKey, + Description: stakingtypes.Description{ + Website: "https://validator.cosmos", + Details: "Test validator", + }, + Commission: stakingtypes.CommissionRates{ + Rate: sdk.OneDec(), + MaxRate: sdk.OneDec(), + MaxChangeRate: sdk.OneDec(), + }, + MinSelfDelegation: sdk.NewInt(1), + }, + }, + { + name: "invalid address", + msg: types.MsgCreateValidator{ + MultiStakerAddress: "", + ValidatorAddress: "", + Value: coin, + Pubkey: pubKey, + Description: stakingtypes.Description{ + Website: "https://validator.cosmos", + Details: "Test validator", + }, + Commission: stakingtypes.CommissionRates{ + Rate: sdk.OneDec(), + MaxRate: sdk.OneDec(), + MaxChangeRate: sdk.OneDec(), + }, + MinSelfDelegation: sdk.NewInt(1), + }, + err: sdkerrors.ErrInvalidAddress, + }, + { + name: "validator address is invalid", + msg: types.MsgCreateValidator{ + MultiStakerAddress: testutil.GenAddress().String(), + ValidatorAddress: valAddr.String(), + Value: coin, + Pubkey: pubKey, + Description: stakingtypes.Description{ + Website: "https://validator.cosmos", + Details: "Test validator", + }, + Commission: stakingtypes.CommissionRates{ + Rate: sdk.OneDec(), + MaxRate: sdk.OneDec(), + MaxChangeRate: sdk.OneDec(), + }, + MinSelfDelegation: sdk.NewInt(1), + }, + err: sdkerrors.ErrInvalidRequest, + }, + { + name: "minimum self delegation must be a positive integer", + msg: types.MsgCreateValidator{ + MultiStakerAddress: testutil.GenAddress().String(), + ValidatorAddress: valAddr.String(), + Value: coin, + Pubkey: pubKey, + Description: stakingtypes.Description{ + Website: "https://validator.cosmos", + Details: "Test validator", + }, + Commission: stakingtypes.CommissionRates{ + Rate: sdk.OneDec(), + MaxRate: sdk.OneDec(), + MaxChangeRate: sdk.OneDec(), + }, + MinSelfDelegation: sdk.NewInt(0), + }, + err: sdkerrors.ErrInvalidRequest, + }, + { + name: "empty commission, description", + msg: types.MsgCreateValidator{ + MultiStakerAddress: mulStakeAddr.String(), + ValidatorAddress: valAddr.String(), + Value: coin, + Pubkey: pubKey, + }, + err: sdkerrors.ErrInvalidRequest, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} + +// MsgDelegate +func TestMsgMsgDelegate_ValidateBasic(t *testing.T) { + mulStakeAddr := testutil.GenAddress() + valAddr := testutil.GenValAddress() + denom := "ario" + coin := sdk.NewCoin(denom, sdk.NewInt(10000)) + + tests := []struct { + name string + msg types.MsgDelegate + err error + }{ + { + name: "happy path", + msg: types.MsgDelegate{ + MultiStakerAddress: mulStakeAddr.String(), + ValidatorAddress: valAddr.String(), + Amount: coin, + }, + }, + { + name: "empty address string is not allowed", + msg: types.MsgDelegate{ + MultiStakerAddress: "", + ValidatorAddress: "", + Amount: coin, + }, + err: sdkerrors.ErrInvalidAddress, + }, + { + name: "invalid delegation amount", + msg: types.MsgDelegate{ + MultiStakerAddress: mulStakeAddr.String(), + ValidatorAddress: valAddr.String(), + Amount: sdk.NewCoin(denom, sdk.ZeroInt()), + }, + err: sdkerrors.ErrInvalidRequest, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} + +// MsgEditValidator +func TestMsgEditValidator_ValidateBasic(t *testing.T) { + valAddr := testutil.GenValAddress() + commissionRate := sdk.NewDec(1) + minselfDelegation := sdk.NewInt(1) + + tests := []struct { + name string + msg types.MsgEditValidator + err error + }{ + { + name: "happy path", + msg: types.MsgEditValidator{ + Description: stakingtypes.Description{ + Website: "https://validator.cosmos", + Details: "Test validator", + }, + ValidatorAddress: valAddr.String(), + CommissionRate: &commissionRate, + MinSelfDelegation: &minselfDelegation, + }, + }, + { + name: "invalid validator address", + msg: types.MsgEditValidator{ + Description: stakingtypes.Description{ + Website: "https://validator.cosmos", + Details: "Test validator", + }, + ValidatorAddress: "", + CommissionRate: &commissionRate, + MinSelfDelegation: &minselfDelegation, + }, + err: sdkerrors.ErrInvalidAddress, + }, + { + name: "invalid commissionrate and minselfdelegation", + msg: types.MsgEditValidator{ + Description: stakingtypes.Description{}, + ValidatorAddress: valAddr.String(), + CommissionRate: nil, + MinSelfDelegation: nil, + }, + err: sdkerrors.ErrInvalidRequest, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} + +// // MsgSetWithdrawAddress +// func TestMsgSetWithdrawAddress_ValidateBasic(t *testing.T) { +// mulStakeAddr := testutil.GenAddress() +// withdrawAddr := testutil.GenAddress() + +// tests := []struct { +// name string +// msg types.MsgSetWithdrawAddress +// err error +// }{ +// { +// name: "happy path", +// msg: types.MsgSetWithdrawAddress{ +// MultiStakerAddress: mulStakeAddr.String(), +// WithdrawAddress: withdrawAddr.String(), +// }, +// }, +// { +// name: "invalid address", +// msg: types.MsgSetWithdrawAddress{ +// MultiStakerAddress: "", +// WithdrawAddress: "", +// }, +// err: sdkerrors.ErrInvalidAddress, +// }, +// } +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// err := tt.msg.ValidateBasic() +// if tt.err != nil { +// require.ErrorIs(t, err, tt.err) +// return +// } +// require.NoError(t, err) +// }) +// } +// } + +// MsgUndelegate +func TestMsgUndelegate_ValidateBasic(t *testing.T) { + mulStakeAddr := testutil.GenAddress() + valAddr := testutil.GenValAddress() + denom := "ario" + coin := sdk.NewCoin(denom, sdk.NewInt(10000)) + + tests := []struct { + name string + msg types.MsgUndelegate + err error + }{ + { + name: "happy path", + msg: types.MsgUndelegate{ + MultiStakerAddress: mulStakeAddr.String(), + ValidatorAddress: valAddr.String(), + Amount: coin, + }, + }, + { + name: "invalid address", + msg: types.MsgUndelegate{ + MultiStakerAddress: "", + ValidatorAddress: "", + Amount: coin, + }, + err: sdkerrors.ErrInvalidAddress, + }, + { + name: "invalid shares amount", + msg: types.MsgUndelegate{ + MultiStakerAddress: mulStakeAddr.String(), + ValidatorAddress: valAddr.String(), + Amount: sdk.NewCoin(denom, sdk.ZeroInt()), + }, + err: sdkerrors.ErrInvalidRequest, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} + +// // MsgVote +// func TestMsgVote_ValidateBasic(t *testing.T) { +// mulStakeAddr := testutil.GenAddress() + +// tests := []struct { +// name string +// msg types.MsgVote +// err error +// }{ +// { +// name: "happy path", +// msg: types.MsgVote{ +// ProposalId: 1, +// Voter: mulStakeAddr.String(), +// Option: govv1.VoteOption_VOTE_OPTION_NO_WITH_VETO, +// Metadata: "", +// }, +// }, +// { +// name: "invalid voter address", +// msg: types.MsgVote{ +// ProposalId: 1, +// Voter: "", +// Option: govv1.OptionYes, +// Metadata: "", +// }, +// err: sdkerrors.ErrInvalidAddress, +// }, +// { +// name: "invalid vote option", +// msg: types.MsgVote{ +// ProposalId: 1, +// Voter: mulStakeAddr.String(), +// Metadata: "", +// }, +// err: govtypes.ErrInvalidVote, +// }, +// } +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// err := tt.msg.ValidateBasic() +// if tt.err != nil { +// require.ErrorIs(t, err, tt.err) +// return +// } +// require.NoError(t, err) +// }) +// } +// } + +// // MsgVoteWeighted +// func TestMsgVoteWeighted_ValidateBasic(t *testing.T) { +// mulStakeAddr := testutil.GenAddress() + +// tests := []struct { +// name string +// msg types.MsgVoteWeighted +// err error +// }{ +// { +// name: "happy path", +// msg: types.MsgVoteWeighted{ +// ProposalId: 1, +// Voter: mulStakeAddr.String(), +// Options: govv1.NewNonSplitVoteOption(govv1.OptionYes), +// Metadata: "", +// }, +// }, +// { +// name: "invalid voter address", +// msg: types.MsgVoteWeighted{ +// ProposalId: 1, +// Voter: "", +// Options: govv1.NewNonSplitVoteOption(govv1.OptionYes), +// Metadata: "", +// }, +// err: sdkerrors.ErrInvalidAddress, +// }, +// { +// name: "invalid vote options", +// msg: types.MsgVoteWeighted{ +// ProposalId: 1, +// Voter: mulStakeAddr.String(), +// Metadata: "", +// }, +// err: sdkerrors.ErrInvalidRequest, +// }, +// } +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// err := tt.msg.ValidateBasic() +// if tt.err != nil { +// require.ErrorIs(t, err, tt.err) +// return +// } +// require.NoError(t, err) +// }) +// } +// } + +// // MsgWithdrawDelegatorReward +// func TestMsgWithdrawDelegatorReward_ValidateBasic(t *testing.T) { +// mulStakeAddr := testutil.GenAddress() +// valAddr := testutil.GenValAddress() + +// tests := []struct { +// name string +// msg types.MsgWithdrawDelegatorReward +// err error +// }{ +// { +// name: "happy path", +// msg: types.MsgWithdrawDelegatorReward{ +// MultiStakerAddress: mulStakeAddr.String(), +// ValidatorAddress: valAddr.String(), +// }, +// }, +// { +// name: "invalid address", +// msg: types.MsgWithdrawDelegatorReward{ +// MultiStakerAddress: "", +// ValidatorAddress: "", +// }, +// err: sdkerrors.ErrInvalidAddress, +// }, +// } +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// err := tt.msg.ValidateBasic() +// if tt.err != nil { +// require.ErrorIs(t, err, tt.err) +// return +// } +// require.NoError(t, err) +// }) +// } +// } From 0f640061333ffbc4b25ab0173203f52805c4d352 Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Tue, 9 Jan 2024 20:25:04 +0700 Subject: [PATCH 03/18] test genesis --- x/multi-staking/types/genesis_test.go | 66 +++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 x/multi-staking/types/genesis_test.go diff --git a/x/multi-staking/types/genesis_test.go b/x/multi-staking/types/genesis_test.go new file mode 100644 index 00000000..9e0568d6 --- /dev/null +++ b/x/multi-staking/types/genesis_test.go @@ -0,0 +1,66 @@ +package types_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + + "github.com/realio-tech/multi-staking-module/testutil" + "github.com/realio-tech/multi-staking-module/x/multi-staking/types" +) + +func TestGenesisState_Validate(t *testing.T) { + multiStakerAddress := testutil.GenAddress() + valPubKey := testutil.GenPubKey() + valAddr := sdk.ValAddress(valPubKey.Address()) + denom := "ario" + + for _, tc := range []struct { + desc string + genState *types.GenesisState + valid bool + }{ + { + desc: "default is valid", + genState: types.DefaultGenesis(), + valid: true, + }, + { + desc: "valid genesis state", + genState: &types.GenesisState{ + MultiStakingLocks: []types.MultiStakingLock{ + { + LockID: &types.LockID{ + MultiStakerAddr: multiStakerAddress.String(), + ValAddr: valAddr.String(), + }, + LockedCoin: types.MultiStakingCoin{ + Denom: denom, + Amount: sdk.NewInt(1000), + BondWeight: sdk.NewDec(1), + }, + }, + }, + ValidatorMultiStakingCoins: []types.ValidatorMultiStakingCoin{ + { + ValAddr: valAddr.String(), + CoinDenom: denom, + }, + }, + StakingGenesisState: types.DefaultGenesis().StakingGenesisState, + }, + valid: true, + }, + // this line is used by starport scaffolding # types/genesis/testcase + } { + t.Run(tc.desc, func(t *testing.T) { + err := tc.genState.Validate() + if tc.valid { + require.NoError(t, err) + } else { + require.Error(t, err) + } + }) + } +} From 21620c4d85bc7bb4e557954b8bc9a3b3b3ac95bb Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Tue, 9 Jan 2024 20:26:34 +0700 Subject: [PATCH 04/18] test AccAddrAndValAddrFromStrings --- x/multi-staking/types/utils_test.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 x/multi-staking/types/utils_test.go diff --git a/x/multi-staking/types/utils_test.go b/x/multi-staking/types/utils_test.go new file mode 100644 index 00000000..4e0f5521 --- /dev/null +++ b/x/multi-staking/types/utils_test.go @@ -0,0 +1,20 @@ +package types_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/realio-tech/multi-staking-module/testutil" + "github.com/realio-tech/multi-staking-module/x/multi-staking/types" +) + +func TestAccAddrAndValAddrFromStrings(t *testing.T) { + accountAddress := testutil.GenAddress() + valAddress := testutil.GenValAddress() + + actualAccAddr, actualValAddr, err := types.AccAddrAndValAddrFromStrings(accountAddress.String(), valAddress.String()) + require.NoError(t, err) + require.Equal(t, accountAddress, actualAccAddr) + require.Equal(t, valAddress, actualValAddr) +} From 8814918c3b64ccb892ff2359375ab049fb3253cd Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Tue, 9 Jan 2024 20:34:59 +0700 Subject: [PATCH 05/18] update testing/simapp and keeper test --- testing/simapp/app.go | 1 + testing/simapp/export.go | 21 +++++++-------------- testing/simapp/simd/cmd/cmd_test.go | 24 ++++++++++++++++++++++++ testing/simapp/state.go | 6 +++--- testing/simapp/test_helpers.go | 2 +- testutil/address.go | 6 ++++++ x/multi-staking/keeper/keeper_test.go | 11 +++++++---- 7 files changed, 49 insertions(+), 22 deletions(-) create mode 100644 testing/simapp/simd/cmd/cmd_test.go diff --git a/testing/simapp/app.go b/testing/simapp/app.go index ef4094a6..5d1cbe12 100644 --- a/testing/simapp/app.go +++ b/testing/simapp/app.go @@ -171,6 +171,7 @@ var ( authtypes.FeeCollectorName: nil, distrtypes.ModuleName: nil, minttypes.ModuleName: {authtypes.Minter}, + multistakingtypes.ModuleName: {authtypes.Minter, authtypes.Burner}, stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, govtypes.ModuleName: {authtypes.Burner}, diff --git a/testing/simapp/export.go b/testing/simapp/export.go index 3d436bc4..e1b4fecf 100644 --- a/testing/simapp/export.go +++ b/testing/simapp/export.go @@ -9,6 +9,7 @@ import ( slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/realio-tech/multi-staking-module/x/multi-staking/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) @@ -78,15 +79,11 @@ func (app *SimApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [] // withdraw all delegator rewards dels := app.StakingKeeper.GetAllDelegations(ctx) for _, delegation := range dels { - valAddr, err := sdk.ValAddressFromBech32(delegation.ValidatorAddress) + delAddr, valAddr, err := types.AccAddrAndValAddrFromStrings(delegation.DelegatorAddress, delegation.ValidatorAddress) if err != nil { panic(err) } - delAddr, err := sdk.AccAddressFromBech32(delegation.DelegatorAddress) - if err != nil { - panic(err) - } _, _ = app.DistrKeeper.WithdrawDelegationRewards(ctx, delAddr, valAddr) } @@ -114,11 +111,7 @@ func (app *SimApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [] // reinitialize all delegations for _, del := range dels { - valAddr, err := sdk.ValAddressFromBech32(del.ValidatorAddress) - if err != nil { - panic(err) - } - delAddr, err := sdk.AccAddressFromBech32(del.DelegatorAddress) + delAddr, valAddr, err := types.AccAddrAndValAddrFromStrings(del.DelegatorAddress, del.ValidatorAddress) if err != nil { panic(err) } @@ -147,11 +140,11 @@ func (app *SimApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [] }) // iterate through unbonding delegations, reset creation height - app.StakingKeeper.IterateUnbondingDelegations(ctx, func(_ int64, ubd stakingtypes.UnbondingDelegation) (stop bool) { - for i := range ubd.Entries { - ubd.Entries[i].CreationHeight = 0 + app.StakingKeeper.IterateUnbondingDelegations(ctx, func(_ int64, unlock stakingtypes.UnbondingDelegation) (stop bool) { + for i := range unlock.Entries { + unlock.Entries[i].CreationHeight = 0 } - app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) + app.StakingKeeper.SetUnbondingDelegation(ctx, unlock) return false }) diff --git a/testing/simapp/simd/cmd/cmd_test.go b/testing/simapp/simd/cmd/cmd_test.go new file mode 100644 index 00000000..afeacbb0 --- /dev/null +++ b/testing/simapp/simd/cmd/cmd_test.go @@ -0,0 +1,24 @@ +package cmd_test + +import ( + "fmt" + "testing" + + svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" + "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" + "github.com/stretchr/testify/require" + + "github.com/cosmos/ibc-go/v6/testing/simapp" + "github.com/cosmos/ibc-go/v6/testing/simapp/simd/cmd" +) + +func TestInitCmd(t *testing.T) { + rootCmd, _ := cmd.NewRootCmd() + rootCmd.SetArgs([]string{ + "init", // Test the init cmd + "simapp-test", // Moniker + fmt.Sprintf("--%s=%s", cli.FlagOverwrite, "true"), // Overwrite genesis.json, in case it already exists + }) + + require.NoError(t, svrcmd.Execute(rootCmd, "simd", simapp.DefaultNodeHome)) +} diff --git a/testing/simapp/state.go b/testing/simapp/state.go index 2848c9fe..1651c2b1 100644 --- a/testing/simapp/state.go +++ b/testing/simapp/state.go @@ -88,14 +88,14 @@ func AppStateFn(cdc codec.JSONCodec, simManager *module.SimulationManager) simty panic(err) } // compute not bonded balance - notBondedTokens := sdk.ZeroInt() + notBondedAmount := sdk.ZeroInt() for _, val := range stakingState.Validators { if val.Status != stakingtypes.Unbonded { continue } - notBondedTokens = notBondedTokens.Add(val.GetTokens()) + notBondedAmount = notBondedAmount.Add(val.GetTokens()) } - notBondedCoins := sdk.NewCoin(stakingState.Params.BondDenom, notBondedTokens) + notBondedCoins := sdk.NewCoin(stakingState.Params.BondDenom, notBondedAmount) // edit bank state to make it have the not bonded pool tokens bankStateBz, ok := rawState[banktypes.ModuleName] // TODO(fdymylja/jonathan): should we panic in this case diff --git a/testing/simapp/test_helpers.go b/testing/simapp/test_helpers.go index 859f1357..3abdf34b 100644 --- a/testing/simapp/test_helpers.go +++ b/testing/simapp/test_helpers.go @@ -87,7 +87,7 @@ func Setup(isCheckTx bool) *SimApp { // SetupWithGenesisValSet initializes a new SimApp with a validator set and genesis accounts // that also act as delegators. For simplicity, each validator is bonded with a delegation -// of one consensus engine unit in the default token of the simapp from first genesis +// of one consensus engine unit in the default coin of the simapp from first genesis // account. A Nop logger is set in SimApp. func SetupWithGenesisValSet(valSet *tmtypes.ValidatorSet, genAccs []authtypes.GenesisAccount, balances ...banktypes.Balance) *SimApp { app, genesisState := setup(true, 5) diff --git a/testutil/address.go b/testutil/address.go index 51b22a2a..54ca8f51 100644 --- a/testutil/address.go +++ b/testutil/address.go @@ -2,6 +2,7 @@ package testutil import ( "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -16,3 +17,8 @@ func GenValAddress() sdk.ValAddress { return sdk.ValAddress(priv.PubKey().Address()) } + +func GenPubKey() cryptotypes.PubKey { + priv := secp256k1.GenPrivKey() + return priv.PubKey() +} diff --git a/x/multi-staking/keeper/keeper_test.go b/x/multi-staking/keeper/keeper_test.go index fe1e4c6d..aeabfd1b 100644 --- a/x/multi-staking/keeper/keeper_test.go +++ b/x/multi-staking/keeper/keeper_test.go @@ -4,24 +4,27 @@ import ( "github.com/stretchr/testify/suite" "testing" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" sdk "github.com/cosmos/cosmos-sdk/types" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/realio-tech/multi-staking-module/testing/simapp" multistakingkeeper "github.com/realio-tech/multi-staking-module/x/multi-staking/keeper" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) type KeeperTestSuite struct { suite.Suite - ctx sdk.Context - msKeeper *multistakingkeeper.Keeper + ctx sdk.Context + app simapp.SimApp + msKeeper *multistakingkeeper.Keeper + stakingKeeper *stakingkeeper.Keeper } func (suite *KeeperTestSuite) SetupTest() { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - suite.ctx, suite.msKeeper = ctx, &app.MultiStakingKeeper + suite.app, suite.ctx, suite.msKeeper, suite.stakingKeeper = *app, ctx, &app.MultiStakingKeeper, &app.StakingKeeper } func TestKeeperTestSuite(t *testing.T) { From 137291d535655782a5e2bb747bd5753ddf5abd2f Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Tue, 9 Jan 2024 20:35:23 +0700 Subject: [PATCH 06/18] test endblock --- x/multi-staking/keeper/abci_test.go | 73 +++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 x/multi-staking/keeper/abci_test.go diff --git a/x/multi-staking/keeper/abci_test.go b/x/multi-staking/keeper/abci_test.go new file mode 100644 index 00000000..5c1d25e8 --- /dev/null +++ b/x/multi-staking/keeper/abci_test.go @@ -0,0 +1,73 @@ +package keeper_test + +import ( + // "fmt" + + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + "github.com/realio-tech/multi-staking-module/testutil" + "github.com/realio-tech/multi-staking-module/x/multi-staking/types" +) + +func (suite *KeeperTestSuite) TestEndBlocker() { + suite.SetupTest() + + mulStaker := testutil.GenAddress() + valPubKey := testutil.GenPubKey() + valAddr := sdk.ValAddress(valPubKey.Address()) + gasDenom := "ario" + + suite.msKeeper.SetValidatorMultiStakingCoin(suite.ctx, valAddr, gasDenom) + + mulBalance := sdk.NewCoins(sdk.NewCoin(stakingtypes.DefaultParams().BondDenom, sdk.NewInt(10000)), sdk.NewCoin(gasDenom, sdk.NewInt(10000))) + err := suite.app.BankKeeper.MintCoins(suite.ctx, minttypes.ModuleName, mulBalance) + suite.NoError(err) + err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, minttypes.ModuleName, mulStaker, mulBalance) + suite.NoError(err) + + unlockEntry := types.UnlockEntry{ + CreationHeight: suite.ctx.BlockHeight(), + UnlockingCoin: types.MultiStakingCoin{ + Denom: gasDenom, + Amount: sdk.NewInt(10000), + BondWeight: sdk.NewDec(1), + }, + } + newUbd := types.MultiStakingUnlock{ + UnlockID: &types.UnlockID{ + MultiStakerAddr: mulStaker.String(), + ValAddr: valAddr.String(), + }, + Entries: []types.UnlockEntry{unlockEntry}, + } + + suite.msKeeper.SetMultiStakingUnlock(suite.ctx, newUbd) + matureUnbondingDelegations := suite.msKeeper.GetMatureUnbondingDelegations(suite.ctx) + completionTime := suite.ctx.BlockHeader().Time + + unDT := stakingtypes.UnbondingDelegationEntry{ + CreationHeight: suite.ctx.BlockHeight(), + CompletionTime: completionTime, + InitialBalance: sdk.NewInt(1000), + Balance: sdk.NewInt(1000), + } + + unD := stakingtypes.UnbondingDelegation{ + DelegatorAddress: mulStaker.String(), + ValidatorAddress: valAddr.String(), + Entries: []stakingtypes.UnbondingDelegationEntry{unDT}, + } + + matureUnbondingDelegations = append(matureUnbondingDelegations, unD) + + a := suite.app.AccountKeeper.GetModuleAccount(suite.ctx, "mint") + if a == nil { + fmt.Println("nill") + } + suite.msKeeper.EndBlocker(suite.ctx, matureUnbondingDelegations) + +} From 3f1122ec10c2463e81f0613a9376aa18d5090a9e Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Wed, 10 Jan 2024 11:34:53 +0700 Subject: [PATCH 07/18] remove msg test --- x/multi-staking/types/msg.go | 0 x/multi-staking/types/msg_test.go | 588 ------------------------------ 2 files changed, 588 deletions(-) delete mode 100644 x/multi-staking/types/msg.go delete mode 100644 x/multi-staking/types/msg_test.go diff --git a/x/multi-staking/types/msg.go b/x/multi-staking/types/msg.go deleted file mode 100644 index e69de29b..00000000 diff --git a/x/multi-staking/types/msg_test.go b/x/multi-staking/types/msg_test.go deleted file mode 100644 index a26d66d3..00000000 --- a/x/multi-staking/types/msg_test.go +++ /dev/null @@ -1,588 +0,0 @@ -package types_test - -import ( - "testing" - - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - // govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - // govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/stretchr/testify/require" - - "github.com/realio-tech/multi-staking-module/testutil" - "github.com/realio-tech/multi-staking-module/x/multi-staking/types" -) - -// MsgBeginRedelegate -func TestMsgBeginRedelegate_ValidateBasic(t *testing.T) { - mulStakeAddr := testutil.GenAddress() - valSrcAddr := testutil.GenValAddress() - valDstAddr := testutil.GenValAddress() - denom := "ario" - coin := sdk.NewCoin(denom, sdk.NewInt(10000)) - - tests := []struct { - name string - msg types.MsgBeginRedelegate - err error - }{ - { - name: "happy path", - msg: types.MsgBeginRedelegate{ - MultiStakerAddress: mulStakeAddr.String(), - ValidatorSrcAddress: valSrcAddr.String(), - ValidatorDstAddress: valDstAddr.String(), - Amount: coin, - }, - }, - { - name: "invalid address", - msg: types.MsgBeginRedelegate{ - MultiStakerAddress: "", - ValidatorSrcAddress: "", - ValidatorDstAddress: "", - Amount: coin, - }, - err: sdkerrors.ErrInvalidAddress, - }, - { - name: "invalid shares amount", - msg: types.MsgBeginRedelegate{ - MultiStakerAddress: mulStakeAddr.String(), - ValidatorSrcAddress: valSrcAddr.String(), - ValidatorDstAddress: valDstAddr.String(), - Amount: sdk.NewCoin(denom, sdk.ZeroInt()), - }, - err: sdkerrors.ErrInvalidRequest, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := tt.msg.ValidateBasic() - if tt.err != nil { - require.ErrorIs(t, err, tt.err) - return - } - require.NoError(t, err) - }) - } -} - -// MsgCancelUnbonding -func TestMsgCancelUnbondingDelegation_ValidateBasic(t *testing.T) { - mulStakeAddr := testutil.GenAddress() - valAddr := testutil.GenValAddress() - denom := "ario" - coin := sdk.NewCoin(denom, sdk.NewInt(10000)) - - tests := []struct { - name string - msg types.MsgCancelUnbonding - err error - }{ - { - name: "happy path", - msg: types.MsgCancelUnbonding{ - MultiStakerAddress: mulStakeAddr.String(), - ValidatorAddress: valAddr.String(), - Amount: coin, - CreationHeight: 1, - }, - }, - { - name: "invalid address", - msg: types.MsgCancelUnbonding{ - MultiStakerAddress: "", - ValidatorAddress: "", - Amount: coin, - CreationHeight: 1, - }, - err: sdkerrors.ErrInvalidAddress, - }, - { - name: "invalid height", - msg: types.MsgCancelUnbonding{ - MultiStakerAddress: mulStakeAddr.String(), - ValidatorAddress: valAddr.String(), - Amount: coin, - CreationHeight: 0, - }, - err: sdkerrors.ErrInvalidRequest, - }, - { - name: "invalid amount", - msg: types.MsgCancelUnbonding{ - MultiStakerAddress: mulStakeAddr.String(), - ValidatorAddress: valAddr.String(), - Amount: sdk.NewCoin(denom, sdk.ZeroInt()), - CreationHeight: 1, - }, - err: sdkerrors.ErrInvalidRequest, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := tt.msg.ValidateBasic() - if tt.err != nil { - require.ErrorIs(t, err, tt.err) - return - } - require.NoError(t, err) - }) - } -} - -// MsgCreateValidator -func TestMsgCreateValidator_ValidateBasic(t *testing.T) { - valPubKey := testutil.GenPubKey() - valAddr := sdk.ValAddress(valPubKey.Address()) - mulStakeAddr := sdk.AccAddress(valAddr) - pubKey := codectypes.UnsafePackAny(valPubKey) - denom := "ario" - coin := sdk.NewCoin(denom, sdk.NewInt(10000)) - - tests := []struct { - name string - msg types.MsgCreateValidator - err error - }{ - { - name: "happy path", - msg: types.MsgCreateValidator{ - MultiStakerAddress: mulStakeAddr.String(), - ValidatorAddress: valAddr.String(), - Value: coin, - Pubkey: pubKey, - Description: stakingtypes.Description{ - Website: "https://validator.cosmos", - Details: "Test validator", - }, - Commission: stakingtypes.CommissionRates{ - Rate: sdk.OneDec(), - MaxRate: sdk.OneDec(), - MaxChangeRate: sdk.OneDec(), - }, - MinSelfDelegation: sdk.NewInt(1), - }, - }, - { - name: "invalid address", - msg: types.MsgCreateValidator{ - MultiStakerAddress: "", - ValidatorAddress: "", - Value: coin, - Pubkey: pubKey, - Description: stakingtypes.Description{ - Website: "https://validator.cosmos", - Details: "Test validator", - }, - Commission: stakingtypes.CommissionRates{ - Rate: sdk.OneDec(), - MaxRate: sdk.OneDec(), - MaxChangeRate: sdk.OneDec(), - }, - MinSelfDelegation: sdk.NewInt(1), - }, - err: sdkerrors.ErrInvalidAddress, - }, - { - name: "validator address is invalid", - msg: types.MsgCreateValidator{ - MultiStakerAddress: testutil.GenAddress().String(), - ValidatorAddress: valAddr.String(), - Value: coin, - Pubkey: pubKey, - Description: stakingtypes.Description{ - Website: "https://validator.cosmos", - Details: "Test validator", - }, - Commission: stakingtypes.CommissionRates{ - Rate: sdk.OneDec(), - MaxRate: sdk.OneDec(), - MaxChangeRate: sdk.OneDec(), - }, - MinSelfDelegation: sdk.NewInt(1), - }, - err: sdkerrors.ErrInvalidRequest, - }, - { - name: "minimum self delegation must be a positive integer", - msg: types.MsgCreateValidator{ - MultiStakerAddress: testutil.GenAddress().String(), - ValidatorAddress: valAddr.String(), - Value: coin, - Pubkey: pubKey, - Description: stakingtypes.Description{ - Website: "https://validator.cosmos", - Details: "Test validator", - }, - Commission: stakingtypes.CommissionRates{ - Rate: sdk.OneDec(), - MaxRate: sdk.OneDec(), - MaxChangeRate: sdk.OneDec(), - }, - MinSelfDelegation: sdk.NewInt(0), - }, - err: sdkerrors.ErrInvalidRequest, - }, - { - name: "empty commission, description", - msg: types.MsgCreateValidator{ - MultiStakerAddress: mulStakeAddr.String(), - ValidatorAddress: valAddr.String(), - Value: coin, - Pubkey: pubKey, - }, - err: sdkerrors.ErrInvalidRequest, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := tt.msg.ValidateBasic() - if tt.err != nil { - require.ErrorIs(t, err, tt.err) - return - } - require.NoError(t, err) - }) - } -} - -// MsgDelegate -func TestMsgMsgDelegate_ValidateBasic(t *testing.T) { - mulStakeAddr := testutil.GenAddress() - valAddr := testutil.GenValAddress() - denom := "ario" - coin := sdk.NewCoin(denom, sdk.NewInt(10000)) - - tests := []struct { - name string - msg types.MsgDelegate - err error - }{ - { - name: "happy path", - msg: types.MsgDelegate{ - MultiStakerAddress: mulStakeAddr.String(), - ValidatorAddress: valAddr.String(), - Amount: coin, - }, - }, - { - name: "empty address string is not allowed", - msg: types.MsgDelegate{ - MultiStakerAddress: "", - ValidatorAddress: "", - Amount: coin, - }, - err: sdkerrors.ErrInvalidAddress, - }, - { - name: "invalid delegation amount", - msg: types.MsgDelegate{ - MultiStakerAddress: mulStakeAddr.String(), - ValidatorAddress: valAddr.String(), - Amount: sdk.NewCoin(denom, sdk.ZeroInt()), - }, - err: sdkerrors.ErrInvalidRequest, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := tt.msg.ValidateBasic() - if tt.err != nil { - require.ErrorIs(t, err, tt.err) - return - } - require.NoError(t, err) - }) - } -} - -// MsgEditValidator -func TestMsgEditValidator_ValidateBasic(t *testing.T) { - valAddr := testutil.GenValAddress() - commissionRate := sdk.NewDec(1) - minselfDelegation := sdk.NewInt(1) - - tests := []struct { - name string - msg types.MsgEditValidator - err error - }{ - { - name: "happy path", - msg: types.MsgEditValidator{ - Description: stakingtypes.Description{ - Website: "https://validator.cosmos", - Details: "Test validator", - }, - ValidatorAddress: valAddr.String(), - CommissionRate: &commissionRate, - MinSelfDelegation: &minselfDelegation, - }, - }, - { - name: "invalid validator address", - msg: types.MsgEditValidator{ - Description: stakingtypes.Description{ - Website: "https://validator.cosmos", - Details: "Test validator", - }, - ValidatorAddress: "", - CommissionRate: &commissionRate, - MinSelfDelegation: &minselfDelegation, - }, - err: sdkerrors.ErrInvalidAddress, - }, - { - name: "invalid commissionrate and minselfdelegation", - msg: types.MsgEditValidator{ - Description: stakingtypes.Description{}, - ValidatorAddress: valAddr.String(), - CommissionRate: nil, - MinSelfDelegation: nil, - }, - err: sdkerrors.ErrInvalidRequest, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := tt.msg.ValidateBasic() - if tt.err != nil { - require.ErrorIs(t, err, tt.err) - return - } - require.NoError(t, err) - }) - } -} - -// // MsgSetWithdrawAddress -// func TestMsgSetWithdrawAddress_ValidateBasic(t *testing.T) { -// mulStakeAddr := testutil.GenAddress() -// withdrawAddr := testutil.GenAddress() - -// tests := []struct { -// name string -// msg types.MsgSetWithdrawAddress -// err error -// }{ -// { -// name: "happy path", -// msg: types.MsgSetWithdrawAddress{ -// MultiStakerAddress: mulStakeAddr.String(), -// WithdrawAddress: withdrawAddr.String(), -// }, -// }, -// { -// name: "invalid address", -// msg: types.MsgSetWithdrawAddress{ -// MultiStakerAddress: "", -// WithdrawAddress: "", -// }, -// err: sdkerrors.ErrInvalidAddress, -// }, -// } -// for _, tt := range tests { -// t.Run(tt.name, func(t *testing.T) { -// err := tt.msg.ValidateBasic() -// if tt.err != nil { -// require.ErrorIs(t, err, tt.err) -// return -// } -// require.NoError(t, err) -// }) -// } -// } - -// MsgUndelegate -func TestMsgUndelegate_ValidateBasic(t *testing.T) { - mulStakeAddr := testutil.GenAddress() - valAddr := testutil.GenValAddress() - denom := "ario" - coin := sdk.NewCoin(denom, sdk.NewInt(10000)) - - tests := []struct { - name string - msg types.MsgUndelegate - err error - }{ - { - name: "happy path", - msg: types.MsgUndelegate{ - MultiStakerAddress: mulStakeAddr.String(), - ValidatorAddress: valAddr.String(), - Amount: coin, - }, - }, - { - name: "invalid address", - msg: types.MsgUndelegate{ - MultiStakerAddress: "", - ValidatorAddress: "", - Amount: coin, - }, - err: sdkerrors.ErrInvalidAddress, - }, - { - name: "invalid shares amount", - msg: types.MsgUndelegate{ - MultiStakerAddress: mulStakeAddr.String(), - ValidatorAddress: valAddr.String(), - Amount: sdk.NewCoin(denom, sdk.ZeroInt()), - }, - err: sdkerrors.ErrInvalidRequest, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := tt.msg.ValidateBasic() - if tt.err != nil { - require.ErrorIs(t, err, tt.err) - return - } - require.NoError(t, err) - }) - } -} - -// // MsgVote -// func TestMsgVote_ValidateBasic(t *testing.T) { -// mulStakeAddr := testutil.GenAddress() - -// tests := []struct { -// name string -// msg types.MsgVote -// err error -// }{ -// { -// name: "happy path", -// msg: types.MsgVote{ -// ProposalId: 1, -// Voter: mulStakeAddr.String(), -// Option: govv1.VoteOption_VOTE_OPTION_NO_WITH_VETO, -// Metadata: "", -// }, -// }, -// { -// name: "invalid voter address", -// msg: types.MsgVote{ -// ProposalId: 1, -// Voter: "", -// Option: govv1.OptionYes, -// Metadata: "", -// }, -// err: sdkerrors.ErrInvalidAddress, -// }, -// { -// name: "invalid vote option", -// msg: types.MsgVote{ -// ProposalId: 1, -// Voter: mulStakeAddr.String(), -// Metadata: "", -// }, -// err: govtypes.ErrInvalidVote, -// }, -// } -// for _, tt := range tests { -// t.Run(tt.name, func(t *testing.T) { -// err := tt.msg.ValidateBasic() -// if tt.err != nil { -// require.ErrorIs(t, err, tt.err) -// return -// } -// require.NoError(t, err) -// }) -// } -// } - -// // MsgVoteWeighted -// func TestMsgVoteWeighted_ValidateBasic(t *testing.T) { -// mulStakeAddr := testutil.GenAddress() - -// tests := []struct { -// name string -// msg types.MsgVoteWeighted -// err error -// }{ -// { -// name: "happy path", -// msg: types.MsgVoteWeighted{ -// ProposalId: 1, -// Voter: mulStakeAddr.String(), -// Options: govv1.NewNonSplitVoteOption(govv1.OptionYes), -// Metadata: "", -// }, -// }, -// { -// name: "invalid voter address", -// msg: types.MsgVoteWeighted{ -// ProposalId: 1, -// Voter: "", -// Options: govv1.NewNonSplitVoteOption(govv1.OptionYes), -// Metadata: "", -// }, -// err: sdkerrors.ErrInvalidAddress, -// }, -// { -// name: "invalid vote options", -// msg: types.MsgVoteWeighted{ -// ProposalId: 1, -// Voter: mulStakeAddr.String(), -// Metadata: "", -// }, -// err: sdkerrors.ErrInvalidRequest, -// }, -// } -// for _, tt := range tests { -// t.Run(tt.name, func(t *testing.T) { -// err := tt.msg.ValidateBasic() -// if tt.err != nil { -// require.ErrorIs(t, err, tt.err) -// return -// } -// require.NoError(t, err) -// }) -// } -// } - -// // MsgWithdrawDelegatorReward -// func TestMsgWithdrawDelegatorReward_ValidateBasic(t *testing.T) { -// mulStakeAddr := testutil.GenAddress() -// valAddr := testutil.GenValAddress() - -// tests := []struct { -// name string -// msg types.MsgWithdrawDelegatorReward -// err error -// }{ -// { -// name: "happy path", -// msg: types.MsgWithdrawDelegatorReward{ -// MultiStakerAddress: mulStakeAddr.String(), -// ValidatorAddress: valAddr.String(), -// }, -// }, -// { -// name: "invalid address", -// msg: types.MsgWithdrawDelegatorReward{ -// MultiStakerAddress: "", -// ValidatorAddress: "", -// }, -// err: sdkerrors.ErrInvalidAddress, -// }, -// } -// for _, tt := range tests { -// t.Run(tt.name, func(t *testing.T) { -// err := tt.msg.ValidateBasic() -// if tt.err != nil { -// require.ErrorIs(t, err, tt.err) -// return -// } -// require.NoError(t, err) -// }) -// } -// } From bca6a18ec48a015ce6dd3340e30869525738f806 Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Wed, 10 Jan 2024 11:36:09 +0700 Subject: [PATCH 08/18] minor --- testing/simapp/export.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/testing/simapp/export.go b/testing/simapp/export.go index e1b4fecf..450fdb7f 100644 --- a/testing/simapp/export.go +++ b/testing/simapp/export.go @@ -140,11 +140,11 @@ func (app *SimApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [] }) // iterate through unbonding delegations, reset creation height - app.StakingKeeper.IterateUnbondingDelegations(ctx, func(_ int64, unlock stakingtypes.UnbondingDelegation) (stop bool) { - for i := range unlock.Entries { - unlock.Entries[i].CreationHeight = 0 + app.StakingKeeper.IterateUnbondingDelegations(ctx, func(_ int64, ubd stakingtypes.UnbondingDelegation) (stop bool) { + for i := range ubd.Entries { + ubd.Entries[i].CreationHeight = 0 } - app.StakingKeeper.SetUnbondingDelegation(ctx, unlock) + app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) return false }) From 473e081f4c936fc9ccb03dfb1b3ed816cb66f496 Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Thu, 11 Jan 2024 10:51:36 +0700 Subject: [PATCH 09/18] remove TestInitCmd --- testing/simapp/simd/cmd/cmd_test.go | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 testing/simapp/simd/cmd/cmd_test.go diff --git a/testing/simapp/simd/cmd/cmd_test.go b/testing/simapp/simd/cmd/cmd_test.go deleted file mode 100644 index afeacbb0..00000000 --- a/testing/simapp/simd/cmd/cmd_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package cmd_test - -import ( - "fmt" - "testing" - - svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" - "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - "github.com/stretchr/testify/require" - - "github.com/cosmos/ibc-go/v6/testing/simapp" - "github.com/cosmos/ibc-go/v6/testing/simapp/simd/cmd" -) - -func TestInitCmd(t *testing.T) { - rootCmd, _ := cmd.NewRootCmd() - rootCmd.SetArgs([]string{ - "init", // Test the init cmd - "simapp-test", // Moniker - fmt.Sprintf("--%s=%s", cli.FlagOverwrite, "true"), // Overwrite genesis.json, in case it already exists - }) - - require.NoError(t, svrcmd.Execute(rootCmd, "simd", simapp.DefaultNodeHome)) -} From d2e07f823315ca44147e15fb2c170c750f1f67b8 Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Sat, 13 Jan 2024 21:46:42 +0700 Subject: [PATCH 10/18] updates --- testutil/address.go | 6 ------ x/multi-staking/keeper/abci_test.go | 3 +-- x/multi-staking/types/genesis_test.go | 3 +-- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/testutil/address.go b/testutil/address.go index 54ca8f51..51b22a2a 100644 --- a/testutil/address.go +++ b/testutil/address.go @@ -2,7 +2,6 @@ package testutil import ( "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -17,8 +16,3 @@ func GenValAddress() sdk.ValAddress { return sdk.ValAddress(priv.PubKey().Address()) } - -func GenPubKey() cryptotypes.PubKey { - priv := secp256k1.GenPrivKey() - return priv.PubKey() -} diff --git a/x/multi-staking/keeper/abci_test.go b/x/multi-staking/keeper/abci_test.go index 5c1d25e8..519d531b 100644 --- a/x/multi-staking/keeper/abci_test.go +++ b/x/multi-staking/keeper/abci_test.go @@ -17,8 +17,7 @@ func (suite *KeeperTestSuite) TestEndBlocker() { suite.SetupTest() mulStaker := testutil.GenAddress() - valPubKey := testutil.GenPubKey() - valAddr := sdk.ValAddress(valPubKey.Address()) + valAddr := testutil.GenValAddress() gasDenom := "ario" suite.msKeeper.SetValidatorMultiStakingCoin(suite.ctx, valAddr, gasDenom) diff --git a/x/multi-staking/types/genesis_test.go b/x/multi-staking/types/genesis_test.go index 9e0568d6..345d5071 100644 --- a/x/multi-staking/types/genesis_test.go +++ b/x/multi-staking/types/genesis_test.go @@ -12,8 +12,7 @@ import ( func TestGenesisState_Validate(t *testing.T) { multiStakerAddress := testutil.GenAddress() - valPubKey := testutil.GenPubKey() - valAddr := sdk.ValAddress(valPubKey.Address()) + valAddr := testutil.GenValAddress() denom := "ario" for _, tc := range []struct { From b69fdd074130db86d5f9a4e4a0e6527b94b4b8ac Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Sat, 13 Jan 2024 21:52:44 +0700 Subject: [PATCH 11/18] updates --- testing/simapp/export.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/testing/simapp/export.go b/testing/simapp/export.go index 450fdb7f..4f47e669 100644 --- a/testing/simapp/export.go +++ b/testing/simapp/export.go @@ -79,7 +79,12 @@ func (app *SimApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [] // withdraw all delegator rewards dels := app.StakingKeeper.GetAllDelegations(ctx) for _, delegation := range dels { - delAddr, valAddr, err := types.AccAddrAndValAddrFromStrings(delegation.DelegatorAddress, delegation.ValidatorAddress) + delAddr, err := sdk.AccAddressFromBech32(delegation.DelegatorAddress) + if err != nil { + panic(err) + } + + valAddr, err := sdk.ValAddressFromBech32(delegation.ValidatorAddress) if err != nil { panic(err) } From 83bd5387c24893b764d48c1de00aae7813e26f4f Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Sat, 13 Jan 2024 22:04:29 +0700 Subject: [PATCH 12/18] lint --- x/multi-staking/keeper/abci_test.go | 11 ++++------- x/multi-staking/types/genesis_test.go | 6 +++--- x/multi-staking/types/utils_test.go | 3 +-- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/x/multi-staking/keeper/abci_test.go b/x/multi-staking/keeper/abci_test.go index 519d531b..b4efb46e 100644 --- a/x/multi-staking/keeper/abci_test.go +++ b/x/multi-staking/keeper/abci_test.go @@ -1,16 +1,14 @@ package keeper_test import ( - // "fmt" - "fmt" + "github.com/realio-tech/multi-staking-module/testutil" + "github.com/realio-tech/multi-staking-module/x/multi-staking/types" + sdk "github.com/cosmos/cosmos-sdk/types" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - - "github.com/realio-tech/multi-staking-module/testutil" - "github.com/realio-tech/multi-staking-module/x/multi-staking/types" ) func (suite *KeeperTestSuite) TestEndBlocker() { @@ -18,7 +16,7 @@ func (suite *KeeperTestSuite) TestEndBlocker() { mulStaker := testutil.GenAddress() valAddr := testutil.GenValAddress() - gasDenom := "ario" + const gasDenom = "ario" suite.msKeeper.SetValidatorMultiStakingCoin(suite.ctx, valAddr, gasDenom) @@ -68,5 +66,4 @@ func (suite *KeeperTestSuite) TestEndBlocker() { fmt.Println("nill") } suite.msKeeper.EndBlocker(suite.ctx, matureUnbondingDelegations) - } diff --git a/x/multi-staking/types/genesis_test.go b/x/multi-staking/types/genesis_test.go index 345d5071..54d7afd4 100644 --- a/x/multi-staking/types/genesis_test.go +++ b/x/multi-staking/types/genesis_test.go @@ -3,11 +3,11 @@ package types_test import ( "testing" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - "github.com/realio-tech/multi-staking-module/testutil" "github.com/realio-tech/multi-staking-module/x/multi-staking/types" + "github.com/stretchr/testify/require" + + sdk "github.com/cosmos/cosmos-sdk/types" ) func TestGenesisState_Validate(t *testing.T) { diff --git a/x/multi-staking/types/utils_test.go b/x/multi-staking/types/utils_test.go index 4e0f5521..721085c6 100644 --- a/x/multi-staking/types/utils_test.go +++ b/x/multi-staking/types/utils_test.go @@ -3,10 +3,9 @@ package types_test import ( "testing" - "github.com/stretchr/testify/require" - "github.com/realio-tech/multi-staking-module/testutil" "github.com/realio-tech/multi-staking-module/x/multi-staking/types" + "github.com/stretchr/testify/require" ) func TestAccAddrAndValAddrFromStrings(t *testing.T) { From 258a57ea4e7b7e1fba4824de871a6c56b6699130 Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Sat, 13 Jan 2024 22:20:11 +0700 Subject: [PATCH 13/18] fix merge main --- x/multi-staking/keeper/keeper_test.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/x/multi-staking/keeper/keeper_test.go b/x/multi-staking/keeper/keeper_test.go index c991af4c..6e56f60e 100644 --- a/x/multi-staking/keeper/keeper_test.go +++ b/x/multi-staking/keeper/keeper_test.go @@ -3,27 +3,28 @@ package keeper_test import ( "testing" + sdk "github.com/cosmos/cosmos-sdk/types" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/realio-tech/multi-staking-module/testing/simapp" multistakingkeeper "github.com/realio-tech/multi-staking-module/x/multi-staking/keeper" "github.com/stretchr/testify/suite" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - - sdk "github.com/cosmos/cosmos-sdk/types" ) type KeeperTestSuite struct { suite.Suite - ctx sdk.Context - app simapp.SimApp - msKeeper *multistakingkeeper.Keeper + ctx sdk.Context + app simapp.SimApp + msKeeper *multistakingkeeper.Keeper + stakingKeeper *stakingkeeper.Keeper } func (suite *KeeperTestSuite) SetupTest() { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - suite.ctx, suite.msKeeper = ctx, &app.MultiStakingKeeper + suite.app, suite.ctx, suite.msKeeper, suite.stakingKeeper = *app, ctx, &app.MultiStakingKeeper, &app.StakingKeeper } func TestKeeperTestSuite(t *testing.T) { From 64ff1d6c493c9340bf77247a499b6022f9c761e5 Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Sat, 13 Jan 2024 22:21:28 +0700 Subject: [PATCH 14/18] lint --- x/multi-staking/keeper/keeper_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/x/multi-staking/keeper/keeper_test.go b/x/multi-staking/keeper/keeper_test.go index 6e56f60e..3214bd51 100644 --- a/x/multi-staking/keeper/keeper_test.go +++ b/x/multi-staking/keeper/keeper_test.go @@ -3,12 +3,13 @@ package keeper_test import ( "testing" - sdk "github.com/cosmos/cosmos-sdk/types" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/realio-tech/multi-staking-module/testing/simapp" multistakingkeeper "github.com/realio-tech/multi-staking-module/x/multi-staking/keeper" "github.com/stretchr/testify/suite" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" ) type KeeperTestSuite struct { From 83a8e6b056bdc072a91212fc9fd61a77e91a610a Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Sun, 14 Jan 2024 14:20:42 +0700 Subject: [PATCH 15/18] minor --- testing/simapp/export.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testing/simapp/export.go b/testing/simapp/export.go index 118840df..7525f9fb 100644 --- a/testing/simapp/export.go +++ b/testing/simapp/export.go @@ -80,12 +80,12 @@ func (app *SimApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [] // withdraw all delegator rewards dels := app.StakingKeeper.GetAllDelegations(ctx) for _, delegation := range dels { - delAddr, err := sdk.AccAddressFromBech32(delegation.DelegatorAddress) + valAddr, err := sdk.ValAddressFromBech32(delegation.ValidatorAddress) if err != nil { panic(err) } - valAddr, err := sdk.ValAddressFromBech32(delegation.ValidatorAddress) + delAddr, err := sdk.AccAddressFromBech32(delegation.DelegatorAddress) if err != nil { panic(err) } From b6bc58331102f2a2ef7f90a2ee16d829408a5a0e Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Sun, 14 Jan 2024 14:23:53 +0700 Subject: [PATCH 16/18] minor --- testing/simapp/export.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/testing/simapp/export.go b/testing/simapp/export.go index 7525f9fb..baa2d2d5 100644 --- a/testing/simapp/export.go +++ b/testing/simapp/export.go @@ -4,7 +4,6 @@ import ( "encoding/json" "log" - "github.com/realio-tech/multi-staking-module/x/multi-staking/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" servertypes "github.com/cosmos/cosmos-sdk/server/types" @@ -89,7 +88,6 @@ func (app *SimApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [] if err != nil { panic(err) } - _, _ = app.DistrKeeper.WithdrawDelegationRewards(ctx, delAddr, valAddr) } @@ -117,7 +115,11 @@ func (app *SimApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [] // reinitialize all delegations for _, del := range dels { - delAddr, valAddr, err := types.AccAddrAndValAddrFromStrings(del.DelegatorAddress, del.ValidatorAddress) + valAddr, err := sdk.ValAddressFromBech32(del.ValidatorAddress) + if err != nil { + panic(err) + } + delAddr, err := sdk.AccAddressFromBech32(del.DelegatorAddress) if err != nil { panic(err) } From f587b0d514dad6c351ec83d21d6db3ee96d964b8 Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Tue, 16 Jan 2024 23:27:35 +0700 Subject: [PATCH 17/18] rename variable --- x/multi-staking/keeper/abci_test.go | 24 +++++++++--------------- x/multi-staking/types/genesis_test.go | 9 ++++----- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/x/multi-staking/keeper/abci_test.go b/x/multi-staking/keeper/abci_test.go index b4efb46e..052247b1 100644 --- a/x/multi-staking/keeper/abci_test.go +++ b/x/multi-staking/keeper/abci_test.go @@ -1,8 +1,6 @@ package keeper_test import ( - "fmt" - "github.com/realio-tech/multi-staking-module/testutil" "github.com/realio-tech/multi-staking-module/x/multi-staking/types" @@ -16,11 +14,11 @@ func (suite *KeeperTestSuite) TestEndBlocker() { mulStaker := testutil.GenAddress() valAddr := testutil.GenValAddress() - const gasDenom = "ario" + const multiStakingDenom = "ario" - suite.msKeeper.SetValidatorMultiStakingCoin(suite.ctx, valAddr, gasDenom) + suite.msKeeper.SetValidatorMultiStakingCoin(suite.ctx, valAddr, multiStakingDenom) - mulBalance := sdk.NewCoins(sdk.NewCoin(stakingtypes.DefaultParams().BondDenom, sdk.NewInt(10000)), sdk.NewCoin(gasDenom, sdk.NewInt(10000))) + mulBalance := sdk.NewCoins(sdk.NewCoin(stakingtypes.DefaultParams().BondDenom, sdk.NewInt(10000)), sdk.NewCoin(multiStakingDenom, sdk.NewInt(10000))) err := suite.app.BankKeeper.MintCoins(suite.ctx, minttypes.ModuleName, mulBalance) suite.NoError(err) err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, minttypes.ModuleName, mulStaker, mulBalance) @@ -29,13 +27,13 @@ func (suite *KeeperTestSuite) TestEndBlocker() { unlockEntry := types.UnlockEntry{ CreationHeight: suite.ctx.BlockHeight(), UnlockingCoin: types.MultiStakingCoin{ - Denom: gasDenom, + Denom: multiStakingDenom, Amount: sdk.NewInt(10000), BondWeight: sdk.NewDec(1), }, } newUbd := types.MultiStakingUnlock{ - UnlockID: &types.UnlockID{ + UnlockID: types.UnlockID{ MultiStakerAddr: mulStaker.String(), ValAddr: valAddr.String(), }, @@ -46,24 +44,20 @@ func (suite *KeeperTestSuite) TestEndBlocker() { matureUnbondingDelegations := suite.msKeeper.GetMatureUnbondingDelegations(suite.ctx) completionTime := suite.ctx.BlockHeader().Time - unDT := stakingtypes.UnbondingDelegationEntry{ + unbondingDelegationEntry := stakingtypes.UnbondingDelegationEntry{ CreationHeight: suite.ctx.BlockHeight(), CompletionTime: completionTime, InitialBalance: sdk.NewInt(1000), Balance: sdk.NewInt(1000), } - unD := stakingtypes.UnbondingDelegation{ + unbondingDelegation := stakingtypes.UnbondingDelegation{ DelegatorAddress: mulStaker.String(), ValidatorAddress: valAddr.String(), - Entries: []stakingtypes.UnbondingDelegationEntry{unDT}, + Entries: []stakingtypes.UnbondingDelegationEntry{unbondingDelegationEntry}, } - matureUnbondingDelegations = append(matureUnbondingDelegations, unD) + matureUnbondingDelegations = append(matureUnbondingDelegations, unbondingDelegation) - a := suite.app.AccountKeeper.GetModuleAccount(suite.ctx, "mint") - if a == nil { - fmt.Println("nill") - } suite.msKeeper.EndBlocker(suite.ctx, matureUnbondingDelegations) } diff --git a/x/multi-staking/types/genesis_test.go b/x/multi-staking/types/genesis_test.go index 54d7afd4..846c4d2d 100644 --- a/x/multi-staking/types/genesis_test.go +++ b/x/multi-staking/types/genesis_test.go @@ -13,7 +13,7 @@ import ( func TestGenesisState_Validate(t *testing.T) { multiStakerAddress := testutil.GenAddress() valAddr := testutil.GenValAddress() - denom := "ario" + const multiStakingDenom = "ario" for _, tc := range []struct { desc string @@ -30,12 +30,12 @@ func TestGenesisState_Validate(t *testing.T) { genState: &types.GenesisState{ MultiStakingLocks: []types.MultiStakingLock{ { - LockID: &types.LockID{ + LockID: types.LockID{ MultiStakerAddr: multiStakerAddress.String(), ValAddr: valAddr.String(), }, LockedCoin: types.MultiStakingCoin{ - Denom: denom, + Denom: multiStakingDenom, Amount: sdk.NewInt(1000), BondWeight: sdk.NewDec(1), }, @@ -44,14 +44,13 @@ func TestGenesisState_Validate(t *testing.T) { ValidatorMultiStakingCoins: []types.ValidatorMultiStakingCoin{ { ValAddr: valAddr.String(), - CoinDenom: denom, + CoinDenom: multiStakingDenom, }, }, StakingGenesisState: types.DefaultGenesis().StakingGenesisState, }, valid: true, }, - // this line is used by starport scaffolding # types/genesis/testcase } { t.Run(tc.desc, func(t *testing.T) { err := tc.genState.Validate() From 5637ed83607604e752e53ba5b9fdc2c361e20978 Mon Sep 17 00:00:00 2001 From: Dong Lieu Date: Thu, 25 Jan 2024 23:28:30 +0700 Subject: [PATCH 18/18] lint --- x/multi-staking/keeper/abci.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/x/multi-staking/keeper/abci.go b/x/multi-staking/keeper/abci.go index d391cda9..15879d19 100644 --- a/x/multi-staking/keeper/abci.go +++ b/x/multi-staking/keeper/abci.go @@ -83,7 +83,10 @@ func (k Keeper) BurnUnbondedCoinAndUnlockedMultiStakingCoin( } // burn remaining coin in unlock remaningCoin := unlockEntry.UnlockingCoin.ToCoin().Sub(unlockedCoin) - k.bankKeeper.BurnCoins(ctx, types.ModuleName, sdk.NewCoins(remaningCoin)) + err = k.bankKeeper.BurnCoins(ctx, types.ModuleName, sdk.NewCoins(remaningCoin)) + if err != nil { + return sdk.Coin{}, err + } err = k.UnescrowCoinTo(ctx, multiStakerAddr, unlockedCoin) if err != nil {