From 23a6f30b652c7dec678bd5ebaed1b80739649361 Mon Sep 17 00:00:00 2001 From: 0xHansLee Date: Sat, 7 Feb 2026 14:29:39 +0900 Subject: [PATCH] feat: use on chain staking params for locked token APR multiplier --- pkg/server/handler.go | 59 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/pkg/server/handler.go b/pkg/server/handler.go index e94279f..ec3491f 100644 --- a/pkg/server/handler.go +++ b/pkg/server/handler.go @@ -470,6 +470,33 @@ func (s *Server) StakingValidatorsHandler() gin.HandlerFunc { return } + // Get staking params for locked token type multiplier + stakingParamsResp, err := GetStakingParams(s.conf.Blockchain.StoryAPIEndpoint) + if err != nil { + logger.Error().Err(err).Msg("failed to get staking params") + c.JSON(http.StatusOK, Response{ + Code: http.StatusInternalServerError, + Error: ErrInternalAPIServiceError.Error(), + }) + return + } + + var lockedTokenMultiplier decimal.Decimal + for _, tt := range stakingParamsResp.Msg.Params.TokenTypes { + if tt.TokenType == TokenTypeLocked { + lockedTokenMultiplier, err = decimal.NewFromString(tt.RewardsMultiplier) + if err != nil { + logger.Error().Err(err).Msg("failed to parse locked token type multiplier") + c.JSON(http.StatusOK, Response{ + Code: http.StatusInternalServerError, + Error: ErrInternalAPIServiceError.Error(), + }) + return + } + break + } + } + // Query from API and database stakingValidatorsResp, err := GetStakingValidators(s.conf.Blockchain.StoryAPIEndpoint, params) if err != nil { @@ -517,9 +544,9 @@ func (s *Server) StakingValidatorsHandler() gin.HandlerFunc { } valAPR := sysAPR.Mul(decimal.NewFromInt(1).Sub(commissionRate)) - // Locked token type has 0.5x APR + // Apply locked token type multiplier from staking params if val.SupportTokenType == 0 { - valAPR = valAPR.Div(decimal.NewFromInt(2)) + valAPR = valAPR.Mul(lockedTokenMultiplier) } validators = append(validators, StakingValidatorData{ @@ -609,9 +636,33 @@ func (s *Server) StakingValidatorHandler() gin.HandlerFunc { } valAPR := sysAPR.Mul(decimal.NewFromInt(1).Sub(commissionRate)) - // Locked token type has 0.5x APR + // Apply locked token type multiplier from staking params if val.SupportTokenType == 0 { - valAPR = valAPR.Div(decimal.NewFromInt(2)) + stakingParamsResp, err := GetStakingParams(s.conf.Blockchain.StoryAPIEndpoint) + if err != nil { + logger.Error().Err(err).Msg("failed to get staking params") + c.JSON(http.StatusOK, Response{ + Code: http.StatusInternalServerError, + Error: ErrInternalAPIServiceError.Error(), + }) + return + } + + for _, tt := range stakingParamsResp.Msg.Params.TokenTypes { + if tt.TokenType == TokenTypeLocked { + lockedTokenMultiplier, err := decimal.NewFromString(tt.RewardsMultiplier) + if err != nil { + logger.Error().Err(err).Msg("failed to parse locked token type multiplier") + c.JSON(http.StatusOK, Response{ + Code: http.StatusInternalServerError, + Error: ErrInternalAPIServiceError.Error(), + }) + return + } + valAPR = valAPR.Mul(lockedTokenMultiplier) + break + } + } } msg := StakingValidatorData{