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  }