Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 17 additions & 9 deletions x/wstaking/keeper/kyc_reward.go
Original file line number Diff line number Diff line change
Expand Up @@ -294,22 +294,19 @@ func (k Keeper) transferDeposit(ctx sdk.Context, fromRegion, toRegion *types.Reg
}
//It is a regional rule used to define parameters such as fixed deposit term and interest rate for a certain region.
depositConfig := k.GetAllFixedDepositCfg(ctx, toRegion.RegionId)
depositConfigMap := make(map[int64]sdk.Dec)
depositConfigMap := make(map[int64]types.FixedDepositCfg)
for _, cfg := range depositConfig {
if cfg.Status == types.RegionFixedDepositCfgStatusInactive {
return errors.New("fixed deposit cfg status is inactive")
}
depositConfigMap[cfg.Term] = cfg.Rate
depositConfigMap[cfg.Term] = cfg
}
totalFixedDepositByAcc := sdk.ZeroInt()
totalFixedInterestCoin := sdk.ZeroInt()
for _, fixed := range fixedDeposits {
totalFixedDepositByAcc = totalFixedDepositByAcc.Add(fixed.Principal.Amount)
totalFixedInterestCoin = totalFixedInterestCoin.Add(fixed.Interest.Amount)
//check toRegion deposit config is exist and deposit rate is equal
rate, exists := depositConfigMap[fixed.Term]
if !exists || !rate.Equal(fixed.Rate) {
return errors.New(fmt.Sprintf("deposit cfg not same.rate=%s,fixed.Rate=%s,exists=%v,fixed.Term=%v", rate.String(), fixed.Rate.String(), exists, fixed.Term))
// Historical deposits keep their stored rate and interest. Migration only
// needs the destination term to still exist and accept deposits.
if err := validateTransferFixedDepositCfg(fixed, depositConfigMap); err != nil {
return err
}

err := k.IncreaseFixedDepositCountOfCfg(ctx, toRegion.RegionId, fixed.Term)
Expand Down Expand Up @@ -363,6 +360,17 @@ func (k Keeper) transferDeposit(ctx sdk.Context, fromRegion, toRegion *types.Reg
return nil
}

func validateTransferFixedDepositCfg(fixed types.FixedDeposit, depositConfigMap map[int64]types.FixedDepositCfg) error {
cfg, exists := depositConfigMap[fixed.Term]
if !exists {
return errors.New(fmt.Sprintf("deposit cfg not found.exists=%v,fixed.Term=%v", exists, fixed.Term))
}
if cfg.Status != types.RegionFixedDepositCfgStatusActive {
return errors.New(fmt.Sprintf("fixed deposit cfg status is not active.term=%v,status=%v", fixed.Term, cfg.Status))
}
return nil
}

func (k Keeper) transferNewMeid(ctx sdk.Context, region *types.Region, address string, valAddr sdk.ValAddress, delegation stakingtypes.Delegation) error {
accAddr, err := sdk.AccAddressFromBech32(address)
if err != nil {
Expand Down
38 changes: 38 additions & 0 deletions x/wstaking/keeper/kyc_reward_transfer_deposit_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package keeper

import (
"testing"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/openmetaearth/me-hub/x/wstaking/types"
"github.com/stretchr/testify/require"
)

func TestValidateTransferFixedDepositCfgAllowsHistoricalRateMismatch(t *testing.T) {
fixed := types.FixedDeposit{
Term: 30,
Rate: sdk.NewDecWithPrec(1, 1),
}

cfgs := map[int64]types.FixedDepositCfg{
30: {
Term: 30,
Rate: sdk.NewDecWithPrec(2, 1),
Status: types.RegionFixedDepositCfgStatusActive,
},
}

require.NoError(t, validateTransferFixedDepositCfg(fixed, cfgs))
}

func TestValidateTransferFixedDepositCfgRejectsMissingOrInactiveTerm(t *testing.T) {
fixed := types.FixedDeposit{Term: 30}

require.Error(t, validateTransferFixedDepositCfg(fixed, map[int64]types.FixedDepositCfg{}))
require.Error(t, validateTransferFixedDepositCfg(fixed, map[int64]types.FixedDepositCfg{
30: {
Term: 30,
Status: types.RegionFixedDepositCfgStatusInactive,
},
}))
}
Loading