From e1440f13ffd1e90ea30d9e890715f308a279ab4a Mon Sep 17 00:00:00 2001 From: modelsbridgeaicom-ship-it Date: Sun, 7 Jun 2026 00:30:01 +0800 Subject: [PATCH] fix(wstaking): allow historical fixed deposit migration rates --- x/wstaking/keeper/kyc_reward.go | 26 ++++++++----- .../kyc_reward_transfer_deposit_test.go | 38 +++++++++++++++++++ 2 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 x/wstaking/keeper/kyc_reward_transfer_deposit_test.go diff --git a/x/wstaking/keeper/kyc_reward.go b/x/wstaking/keeper/kyc_reward.go index ac0f1cb5a..a630c667d 100755 --- a/x/wstaking/keeper/kyc_reward.go +++ b/x/wstaking/keeper/kyc_reward.go @@ -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) @@ -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 { diff --git a/x/wstaking/keeper/kyc_reward_transfer_deposit_test.go b/x/wstaking/keeper/kyc_reward_transfer_deposit_test.go new file mode 100644 index 000000000..c771671eb --- /dev/null +++ b/x/wstaking/keeper/kyc_reward_transfer_deposit_test.go @@ -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, + }, + })) +}