github.com/InjectiveLabs/sdk-go@v1.53.0/client/core/market.go (about) 1 package core 2 3 import ( 4 sdkmath "cosmossdk.io/math" 5 "github.com/InjectiveLabs/sdk-go/client/common" 6 "github.com/shopspring/decimal" 7 ) 8 9 const AdditionalChainFormatDecimals = 18 10 11 type SpotMarket struct { 12 Id string 13 Status string 14 Ticker string 15 BaseToken Token 16 QuoteToken Token 17 MakerFeeRate decimal.Decimal 18 TakerFeeRate decimal.Decimal 19 ServiceProviderFee decimal.Decimal 20 MinPriceTickSize decimal.Decimal 21 MinQuantityTickSize decimal.Decimal 22 MinNotional decimal.Decimal 23 } 24 25 func (spotMarket SpotMarket) QuantityToChainFormat(humanReadableValue decimal.Decimal) sdkmath.LegacyDec { 26 chainFormattedValue := humanReadableValue.Mul(decimal.New(1, spotMarket.BaseToken.Decimals)) 27 quantizedValue := chainFormattedValue.DivRound(spotMarket.MinQuantityTickSize, 0).Mul(spotMarket.MinQuantityTickSize) 28 valueInChainFormat, _ := sdkmath.LegacyNewDecFromStr(quantizedValue.String()) 29 30 return valueInChainFormat 31 } 32 33 func (spotMarket SpotMarket) PriceToChainFormat(humanReadableValue decimal.Decimal) sdkmath.LegacyDec { 34 decimals := spotMarket.QuoteToken.Decimals - spotMarket.BaseToken.Decimals 35 chainFormattedValue := humanReadableValue.Mul(decimal.New(1, decimals)) 36 quantizedValue := chainFormattedValue.DivRound(spotMarket.MinPriceTickSize, 0).Mul(spotMarket.MinPriceTickSize) 37 valueInChainFormat, _ := sdkmath.LegacyNewDecFromStr(quantizedValue.String()) 38 39 return valueInChainFormat 40 } 41 42 func (spotMarket SpotMarket) NotionalToChainFormat(humanReadableValue decimal.Decimal) sdkmath.LegacyDec { 43 decimals := spotMarket.QuoteToken.Decimals 44 chainFormattedValue := humanReadableValue.Mul(decimal.New(1, decimals)) 45 valueInChainFormat, _ := sdkmath.LegacyNewDecFromStr(chainFormattedValue.String()) 46 47 return valueInChainFormat 48 } 49 50 func (spotMarket SpotMarket) QuantityFromChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal { 51 return decimal.RequireFromString(chainValue.String()).Div(decimal.New(1, spotMarket.BaseToken.Decimals)) 52 } 53 54 func (spotMarket SpotMarket) PriceFromChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal { 55 decimals := spotMarket.BaseToken.Decimals - spotMarket.QuoteToken.Decimals 56 return decimal.RequireFromString(chainValue.String()).Mul(decimal.New(1, decimals)) 57 } 58 59 func (spotMarket SpotMarket) NotionalFromChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal { 60 decimals := -spotMarket.QuoteToken.Decimals 61 return decimal.RequireFromString(chainValue.String()).Mul(decimal.New(1, decimals)) 62 } 63 64 func (spotMarket SpotMarket) QuantityFromExtendedChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal { 65 return common.RemoveExtraDecimals(spotMarket.QuantityFromChainFormat(chainValue), AdditionalChainFormatDecimals) 66 } 67 68 func (spotMarket SpotMarket) PriceFromExtendedChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal { 69 return common.RemoveExtraDecimals(spotMarket.PriceFromChainFormat(chainValue), AdditionalChainFormatDecimals) 70 } 71 72 func (spotMarket SpotMarket) NotionalFromExtendedChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal { 73 return common.RemoveExtraDecimals(spotMarket.NotionalFromChainFormat(chainValue), AdditionalChainFormatDecimals) 74 } 75 76 type DerivativeMarket struct { 77 Id string 78 Status string 79 Ticker string 80 OracleBase string 81 OracleQuote string 82 OracleType string 83 OracleScaleFactor uint32 84 InitialMarginRatio decimal.Decimal 85 MaintenanceMarginRatio decimal.Decimal 86 QuoteToken Token 87 MakerFeeRate decimal.Decimal 88 TakerFeeRate decimal.Decimal 89 ServiceProviderFee decimal.Decimal 90 MinPriceTickSize decimal.Decimal 91 MinQuantityTickSize decimal.Decimal 92 MinNotional decimal.Decimal 93 } 94 95 func (derivativeMarket DerivativeMarket) QuantityToChainFormat(humanReadableValue decimal.Decimal) sdkmath.LegacyDec { 96 chainFormattedValue := humanReadableValue 97 quantizedValue := chainFormattedValue.DivRound(derivativeMarket.MinQuantityTickSize, 0).Mul(derivativeMarket.MinQuantityTickSize) 98 valueInChainFormat, _ := sdkmath.LegacyNewDecFromStr(quantizedValue.String()) 99 100 return valueInChainFormat 101 } 102 103 func (derivativeMarket DerivativeMarket) PriceToChainFormat(humanReadableValue decimal.Decimal) sdkmath.LegacyDec { 104 decimals := derivativeMarket.QuoteToken.Decimals 105 chainFormattedValue := humanReadableValue.Mul(decimal.New(1, decimals)) 106 quantizedValue := chainFormattedValue.DivRound(derivativeMarket.MinPriceTickSize, 0).Mul(derivativeMarket.MinPriceTickSize) 107 valueInChainFormat, _ := sdkmath.LegacyNewDecFromStr(quantizedValue.String()) 108 109 return valueInChainFormat 110 } 111 112 func (derivativeMarket DerivativeMarket) MarginToChainFormat(humanReadableValue decimal.Decimal) sdkmath.LegacyDec { 113 return derivativeMarket.NotionalToChainFormat(humanReadableValue) 114 } 115 116 func (derivativeMarket DerivativeMarket) CalculateMarginInChainFormat(humanReadableQuantity, humanReadablePrice, leverage decimal.Decimal) sdkmath.LegacyDec { 117 chainFormattedQuantity := humanReadableQuantity 118 chainFormattedPrice := humanReadablePrice.Mul(decimal.New(1, derivativeMarket.QuoteToken.Decimals)) 119 120 margin := chainFormattedQuantity.Mul(chainFormattedPrice).Div(leverage) 121 // We are using the min_quantity_tick_size to quantize the margin because that is the way margin is validated 122 // in the chain (it might be changed to a min_notional in the future) 123 quantizedMargin := margin.DivRound(derivativeMarket.MinQuantityTickSize, 0).Mul(derivativeMarket.MinQuantityTickSize) 124 valueInChainFormat, _ := sdkmath.LegacyNewDecFromStr(quantizedMargin.String()) 125 126 return valueInChainFormat 127 } 128 129 func (derivativeMarket DerivativeMarket) NotionalToChainFormat(humanReadableValue decimal.Decimal) sdkmath.LegacyDec { 130 decimals := derivativeMarket.QuoteToken.Decimals 131 chainFormattedValue := humanReadableValue.Mul(decimal.New(1, decimals)) 132 valueInChainFormat, _ := sdkmath.LegacyNewDecFromStr(chainFormattedValue.String()) 133 134 return valueInChainFormat 135 } 136 137 func (derivativeMarket DerivativeMarket) QuantityFromChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal { 138 return decimal.RequireFromString(chainValue.String()) 139 } 140 141 func (derivativeMarket DerivativeMarket) PriceFromChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal { 142 decimals := -derivativeMarket.QuoteToken.Decimals 143 return decimal.RequireFromString(chainValue.String()).Mul(decimal.New(1, decimals)) 144 } 145 146 func (derivativeMarket DerivativeMarket) MarginFromChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal { 147 return derivativeMarket.NotionalFromChainFormat(chainValue) 148 } 149 150 func (derivativeMarket DerivativeMarket) NotionalFromChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal { 151 decimals := -derivativeMarket.QuoteToken.Decimals 152 return decimal.RequireFromString(chainValue.String()).Mul(decimal.New(1, decimals)) 153 } 154 155 func (derivativeMarket DerivativeMarket) QuantityFromExtendedChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal { 156 return common.RemoveExtraDecimals(derivativeMarket.QuantityFromChainFormat(chainValue), AdditionalChainFormatDecimals) 157 } 158 159 func (derivativeMarket DerivativeMarket) PriceFromExtendedChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal { 160 return common.RemoveExtraDecimals(derivativeMarket.PriceFromChainFormat(chainValue), AdditionalChainFormatDecimals) 161 } 162 163 func (derivativeMarket DerivativeMarket) MarginFromExtendedChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal { 164 return common.RemoveExtraDecimals(derivativeMarket.MarginFromChainFormat(chainValue), AdditionalChainFormatDecimals) 165 } 166 167 func (derivativeMarket DerivativeMarket) NotionalFromExtendedChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal { 168 return common.RemoveExtraDecimals(derivativeMarket.NotionalFromChainFormat(chainValue), AdditionalChainFormatDecimals) 169 }