github.com/InjectiveLabs/sdk-go@v1.53.0/chain/exchange/types/fee_discounts.go (about) 1 package types 2 3 import ( 4 "cosmossdk.io/math" 5 ) 6 7 type FeeDiscountRates struct { 8 MakerDiscountRate math.LegacyDec 9 TakerDiscountRate math.LegacyDec 10 } 11 12 func (s *FeeDiscountSchedule) CalculateFeeDiscountTier( 13 stakedAmount math.Int, 14 tradingVolume math.LegacyDec, 15 ) ( 16 feeDiscountRates *FeeDiscountRates, 17 tierLevel uint64, 18 ) { 19 highestTierLevel := 0 20 // O(N) but probably the most efficient way nonetheless since we just have 10 tiers and most will be on low tiers 21 for idx, tier := range s.TierInfos { 22 // both tier conditions must be satisfied to reach a tier level 23 if stakedAmount.LT(tier.StakedAmount) || tradingVolume.LT(tier.Volume) { 24 break 25 } 26 highestTierLevel = idx + 1 27 } 28 29 tierLevel = uint64(highestTierLevel) 30 31 if tierLevel == 0 { 32 feeDiscountRates = &FeeDiscountRates{ 33 MakerDiscountRate: math.LegacyZeroDec(), 34 TakerDiscountRate: math.LegacyZeroDec(), 35 } 36 } else { 37 feeDiscountRates = &FeeDiscountRates{ 38 MakerDiscountRate: s.TierInfos[highestTierLevel-1].MakerDiscountRate, 39 TakerDiscountRate: s.TierInfos[highestTierLevel-1].TakerDiscountRate, 40 } 41 } 42 43 return feeDiscountRates, tierLevel 44 } 45 46 func (s *FeeDiscountSchedule) TierOneRequirements() ( 47 minStakedAmount math.Int, 48 minTradingFeePaid math.LegacyDec, 49 ) { 50 // s.TierInfos[0] is tier one, since tier 0 is implicit 51 return s.TierInfos[0].StakedAmount, s.TierInfos[0].Volume 52 } 53 54 type FeeDiscountRatesMap map[uint64]*FeeDiscountRates 55 56 func (s *FeeDiscountSchedule) GetFeeDiscountRatesMap() FeeDiscountRatesMap { 57 if s == nil { 58 return make(FeeDiscountRatesMap) 59 } 60 61 feeDiscountRatesMap := make(FeeDiscountRatesMap, len(s.TierInfos)) 62 feeDiscountRatesMap[0] = &FeeDiscountRates{ 63 MakerDiscountRate: math.LegacyZeroDec(), 64 TakerDiscountRate: math.LegacyZeroDec(), 65 } 66 67 for idx, tierInfo := range s.TierInfos { 68 feeDiscountRatesMap[uint64(idx+1)] = &FeeDiscountRates{ 69 MakerDiscountRate: tierInfo.MakerDiscountRate, 70 TakerDiscountRate: tierInfo.TakerDiscountRate, 71 } 72 } 73 return feeDiscountRatesMap 74 } 75 76 func NewFeeDiscountTierTTL(tier uint64, ttlTimestamp int64) *FeeDiscountTierTTL { 77 return &FeeDiscountTierTTL{ 78 Tier: tier, 79 TtlTimestamp: ttlTimestamp, 80 } 81 }