diff --git a/x/multi-staking/keeper/msg_server.go b/x/multi-staking/keeper/msg_server.go index f628d6a..737bae1 100644 --- a/x/multi-staking/keeper/msg_server.go +++ b/x/multi-staking/keeper/msg_server.go @@ -117,6 +117,20 @@ func (k msgServer) Delegate(goCtx context.Context, msg *stakingtypes.MsgDelegate return nil, fmt.Errorf("not allowed coin") } + // Check if delegation exist, withdraw reward first + _, err = k.keeper.stakingKeeper.GetDelegation(ctx, multiStakerAddr, valAcc) + if err == nil { + err = k.keeper.stakingKeeper.Hooks().BeforeDelegationSharesModified(ctx, multiStakerAddr, valAcc) + if err != nil { + return nil, err + } + + err = k.keeper.stakingKeeper.Hooks().AfterDelegationModified(ctx, multiStakerAddr, valAcc) + if err != nil { + return nil, err + } + } + lockID := types.MultiStakingLockID(msg.DelegatorAddress, msg.ValidatorAddress) mintedBondCoin, err := k.keeper.LockCoinAndMintBondCoin(ctx, lockID, multiStakerAddr, multiStakerAddr, msg.Amount) @@ -152,6 +166,20 @@ func (k msgServer) BeginRedelegate(goCtx context.Context, msg *stakingtypes.MsgB return nil, fmt.Errorf("not allowed Coin") } + // Check if source delegation exist, withdraw reward first + _, err = k.keeper.stakingKeeper.GetDelegation(ctx, multiStakerAddr, srcValAcc) + if err == nil { + err = k.keeper.stakingKeeper.Hooks().BeforeDelegationSharesModified(ctx, multiStakerAddr, srcValAcc) + if err != nil { + return nil, err + } + + err = k.keeper.stakingKeeper.Hooks().AfterDelegationModified(ctx, multiStakerAddr, srcValAcc) + if err != nil { + return nil, err + } + } + fromLockID := types.MultiStakingLockID(msg.DelegatorAddress, msg.ValidatorSrcAddress) fromLock, found := k.keeper.GetMultiStakingLock(ctx, fromLockID) if !found {