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  }