Skip to content

Commit

Permalink
Merge pull request #232 from InjectiveLabs/feat/add_exchange_messages…
Browse files Browse the repository at this point in the history
…_from_v1_13

feat/add_exchange_messages_from_v1_13
  • Loading branch information
aarmoa authored Aug 6, 2024
2 parents 907ab57 + 0b4fbfd commit b7a68cc
Show file tree
Hide file tree
Showing 15 changed files with 1,712 additions and 337 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/run-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,4 @@ jobs:
- name: Run test and calculate coverage
run: make coverage
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
uses: codecov/codecov-action@v4
10 changes: 10 additions & 0 deletions client/chain/markets_assistant.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@ func NewMarketsAssistant(networkName string) (MarketsAssistant, error) {

minPriceTickSize := decimal.RequireFromString(section.Key("min_price_tick_size").String())
minQuantityTickSize := decimal.RequireFromString(section.Key("min_quantity_tick_size").String())
minNotional := decimal.Zero
if section.HasKey("min_notional") {
minNotional = decimal.RequireFromString(section.Key("min_notional").String())
}

if strings.Contains(description, "Spot") {
baseDecimals, _ := section.Key("quote").Int()
Expand All @@ -97,6 +101,7 @@ func NewMarketsAssistant(networkName string) (MarketsAssistant, error) {
ServiceProviderFee: decimal.NewFromInt32(0),
MinPriceTickSize: minPriceTickSize,
MinQuantityTickSize: minQuantityTickSize,
MinNotional: minNotional,
}

assistant.spotMarkets[market.Id] = market
Expand All @@ -117,6 +122,7 @@ func NewMarketsAssistant(networkName string) (MarketsAssistant, error) {
ServiceProviderFee: decimal.NewFromInt32(0),
MinPriceTickSize: minPriceTickSize,
MinQuantityTickSize: minQuantityTickSize,
MinNotional: minNotional,
}

assistant.derivativeMarkets[market.Id] = market
Expand Down Expand Up @@ -190,6 +196,7 @@ func NewMarketsAssistantInitializedFromChain(ctx context.Context, exchangeClient
serviceProviderFee := decimal.RequireFromString(marketInfo.GetServiceProviderFee())
minPriceTickSize := decimal.RequireFromString(marketInfo.GetMinPriceTickSize())
minQuantityTickSize := decimal.RequireFromString(marketInfo.GetMinQuantityTickSize())
minNotional := decimal.RequireFromString(marketInfo.GetMinNotional())

market := core.SpotMarket{
Id: marketInfo.GetMarketId(),
Expand All @@ -202,6 +209,7 @@ func NewMarketsAssistantInitializedFromChain(ctx context.Context, exchangeClient
ServiceProviderFee: serviceProviderFee,
MinPriceTickSize: minPriceTickSize,
MinQuantityTickSize: minQuantityTickSize,
MinNotional: minNotional,
}

assistant.spotMarkets[market.Id] = market
Expand Down Expand Up @@ -232,6 +240,7 @@ func NewMarketsAssistantInitializedFromChain(ctx context.Context, exchangeClient
serviceProviderFee := decimal.RequireFromString(marketInfo.GetServiceProviderFee())
minPriceTickSize := decimal.RequireFromString(marketInfo.GetMinPriceTickSize())
minQuantityTickSize := decimal.RequireFromString(marketInfo.GetMinQuantityTickSize())
minNotional := decimal.RequireFromString(marketInfo.GetMinNotional())

market := core.DerivativeMarket{
Id: marketInfo.GetMarketId(),
Expand All @@ -249,6 +258,7 @@ func NewMarketsAssistantInitializedFromChain(ctx context.Context, exchangeClient
ServiceProviderFee: serviceProviderFee,
MinPriceTickSize: minPriceTickSize,
MinQuantityTickSize: minQuantityTickSize,
MinNotional: minNotional,
}

assistant.derivativeMarkets[market.Id] = market
Expand Down
3 changes: 3 additions & 0 deletions client/chain/markets_assistant_test_support.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ func createINJUSDTSpotMarketInfo() *spotExchangePB.SpotMarketInfo {
ServiceProviderFee: "0.4",
MinPriceTickSize: "0.000000000000001",
MinQuantityTickSize: "1000000000000000",
MinNotional: "1000000",
}

return &marketInfo
Expand All @@ -87,6 +88,7 @@ func createAPEUSDTSpotMarketInfo() *spotExchangePB.SpotMarketInfo {
ServiceProviderFee: "0.4",
MinPriceTickSize: "0.000000000000001",
MinQuantityTickSize: "1000000000000000",
MinNotional: "1000000",
}

return &marketInfo
Expand Down Expand Up @@ -128,6 +130,7 @@ func createBTCUSDTDerivativeMarketInfo() *derivativeExchangePB.DerivativeMarketI
MinQuantityTickSize: "0.0001",
PerpetualMarketInfo: &perpetualMarketInfo,
PerpetualMarketFunding: &perpetualmarketFunding,
MinNotional: "1000000",
}

return &marketInfo
Expand Down
42 changes: 36 additions & 6 deletions client/core/market.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ type SpotMarket struct {
ServiceProviderFee decimal.Decimal
MinPriceTickSize decimal.Decimal
MinQuantityTickSize decimal.Decimal
MinNotional decimal.Decimal
}

func (spotMarket SpotMarket) QuantityToChainFormat(humanReadableValue decimal.Decimal) sdkmath.LegacyDec {
Expand All @@ -38,6 +39,14 @@ func (spotMarket SpotMarket) PriceToChainFormat(humanReadableValue decimal.Decim
return valueInChainFormat
}

func (spotMarket SpotMarket) NotionalToChainFormat(humanReadableValue decimal.Decimal) sdkmath.LegacyDec {
decimals := spotMarket.QuoteToken.Decimals
chainFormattedValue := humanReadableValue.Mul(decimal.New(1, decimals))
valueInChainFormat, _ := sdkmath.LegacyNewDecFromStr(chainFormattedValue.String())

return valueInChainFormat
}

func (spotMarket SpotMarket) QuantityFromChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal {
return decimal.RequireFromString(chainValue.String()).Div(decimal.New(1, spotMarket.BaseToken.Decimals))
}
Expand All @@ -47,6 +56,11 @@ func (spotMarket SpotMarket) PriceFromChainFormat(chainValue sdkmath.LegacyDec)
return decimal.RequireFromString(chainValue.String()).Mul(decimal.New(1, decimals))
}

func (spotMarket SpotMarket) NotionalFromChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal {
decimals := -spotMarket.QuoteToken.Decimals
return decimal.RequireFromString(chainValue.String()).Mul(decimal.New(1, decimals))
}

func (spotMarket SpotMarket) QuantityFromExtendedChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal {
return common.RemoveExtraDecimals(spotMarket.QuantityFromChainFormat(chainValue), AdditionalChainFormatDecimals)
}
Expand All @@ -55,6 +69,10 @@ func (spotMarket SpotMarket) PriceFromExtendedChainFormat(chainValue sdkmath.Leg
return common.RemoveExtraDecimals(spotMarket.PriceFromChainFormat(chainValue), AdditionalChainFormatDecimals)
}

func (spotMarket SpotMarket) NotionalFromExtendedChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal {
return common.RemoveExtraDecimals(spotMarket.NotionalFromChainFormat(chainValue), AdditionalChainFormatDecimals)
}

type DerivativeMarket struct {
Id string
Status string
Expand All @@ -71,6 +89,7 @@ type DerivativeMarket struct {
ServiceProviderFee decimal.Decimal
MinPriceTickSize decimal.Decimal
MinQuantityTickSize decimal.Decimal
MinNotional decimal.Decimal
}

func (derivativeMarket DerivativeMarket) QuantityToChainFormat(humanReadableValue decimal.Decimal) sdkmath.LegacyDec {
Expand All @@ -91,12 +110,7 @@ func (derivativeMarket DerivativeMarket) PriceToChainFormat(humanReadableValue d
}

func (derivativeMarket DerivativeMarket) MarginToChainFormat(humanReadableValue decimal.Decimal) sdkmath.LegacyDec {
decimals := derivativeMarket.QuoteToken.Decimals
chainFormattedValue := humanReadableValue.Mul(decimal.New(1, decimals))
quantizedValue := chainFormattedValue.DivRound(derivativeMarket.MinQuantityTickSize, 0).Mul(derivativeMarket.MinQuantityTickSize)
valueInChainFormat, _ := sdkmath.LegacyNewDecFromStr(quantizedValue.String())

return valueInChainFormat
return derivativeMarket.NotionalToChainFormat(humanReadableValue)
}

func (derivativeMarket DerivativeMarket) CalculateMarginInChainFormat(humanReadableQuantity, humanReadablePrice, leverage decimal.Decimal) sdkmath.LegacyDec {
Expand All @@ -112,6 +126,14 @@ func (derivativeMarket DerivativeMarket) CalculateMarginInChainFormat(humanReada
return valueInChainFormat
}

func (derivativeMarket DerivativeMarket) NotionalToChainFormat(humanReadableValue decimal.Decimal) sdkmath.LegacyDec {
decimals := derivativeMarket.QuoteToken.Decimals
chainFormattedValue := humanReadableValue.Mul(decimal.New(1, decimals))
valueInChainFormat, _ := sdkmath.LegacyNewDecFromStr(chainFormattedValue.String())

return valueInChainFormat
}

func (derivativeMarket DerivativeMarket) QuantityFromChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal {
return decimal.RequireFromString(chainValue.String())
}
Expand All @@ -122,6 +144,10 @@ func (derivativeMarket DerivativeMarket) PriceFromChainFormat(chainValue sdkmath
}

func (derivativeMarket DerivativeMarket) MarginFromChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal {
return derivativeMarket.NotionalFromChainFormat(chainValue)
}

func (derivativeMarket DerivativeMarket) NotionalFromChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal {
decimals := -derivativeMarket.QuoteToken.Decimals
return decimal.RequireFromString(chainValue.String()).Mul(decimal.New(1, decimals))
}
Expand All @@ -137,3 +163,7 @@ func (derivativeMarket DerivativeMarket) PriceFromExtendedChainFormat(chainValue
func (derivativeMarket DerivativeMarket) MarginFromExtendedChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal {
return common.RemoveExtraDecimals(derivativeMarket.MarginFromChainFormat(chainValue), AdditionalChainFormatDecimals)
}

func (derivativeMarket DerivativeMarket) NotionalFromExtendedChainFormat(chainValue sdkmath.LegacyDec) decimal.Decimal {
return common.RemoveExtraDecimals(derivativeMarket.NotionalFromChainFormat(chainValue), AdditionalChainFormatDecimals)
}
72 changes: 72 additions & 0 deletions client/core/market_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ func createINJUSDTSpotMarket() SpotMarket {
serviceProviderFee := decimal.RequireFromString("0.4")
minPriceTickSize := decimal.RequireFromString("0.000000000000001")
minQuantityTickSize := decimal.RequireFromString("1000000000000000")
minNotional := decimal.RequireFromString("1000000")

market := SpotMarket{
Id: "0x7a57e705bb4e09c88aecfc295569481dbf2fe1d5efe364651fbe72385938e9b0",
Expand All @@ -30,6 +31,7 @@ func createINJUSDTSpotMarket() SpotMarket {
ServiceProviderFee: serviceProviderFee,
MinPriceTickSize: minPriceTickSize,
MinQuantityTickSize: minQuantityTickSize,
MinNotional: minNotional,
}
return market
}
Expand All @@ -44,6 +46,7 @@ func createBTCUSDTPerpMarket() DerivativeMarket {
serviceProviderFee := decimal.RequireFromString("0.4")
minPriceTickSize := decimal.RequireFromString("1000000")
minQuantityTickSize := decimal.RequireFromString("0.0001")
minNotional := decimal.RequireFromString("1000000")

market := DerivativeMarket{
Id: "0x4ca0f92fc28be0c9761326016b5a1a2177dd6375558365116b5bdda9abc229ce",
Expand All @@ -61,6 +64,7 @@ func createBTCUSDTPerpMarket() DerivativeMarket {
ServiceProviderFee: serviceProviderFee,
MinPriceTickSize: minPriceTickSize,
MinQuantityTickSize: minQuantityTickSize,
MinNotional: minNotional,
}
return market
}
Expand Down Expand Up @@ -92,6 +96,18 @@ func TestConvertPriceToChainFormatForSpotMarket(t *testing.T) {
assert.Assert(t, quantizedChainFormatValue.Equal(chainValue))
}

func TestConvertNotionalToChainFormatForSpotMarket(t *testing.T) {
spotMarket := createINJUSDTSpotMarket()
originalNotional := decimal.RequireFromString("123.456789")

chainValue := spotMarket.NotionalToChainFormat(originalNotional)
notionalDecimals := spotMarket.QuoteToken.Decimals
expectedValue := originalNotional.Mul(decimal.New(1, notionalDecimals))
chainFormatValue := sdkmath.LegacyMustNewDecFromStr(expectedValue.String())

assert.Assert(t, chainFormatValue.Equal(chainValue))
}

func TestConvertQuantityFromChainFormatForSpotMarket(t *testing.T) {
spotMarket := createINJUSDTSpotMarket()
expectedQuantity := decimal.RequireFromString("123.456")
Expand All @@ -113,6 +129,17 @@ func TestConvertPriceFromChainFormatForSpotMarket(t *testing.T) {
assert.Assert(t, expectedPrice.Equal(humanReadablePrice))
}

func TestConvertNotionalFromChainFormatForSpotMarket(t *testing.T) {
spotMarket := createINJUSDTSpotMarket()
expectedNotional := decimal.RequireFromString("123.456")

notionalDecimals := spotMarket.QuoteToken.Decimals
chainFormatPrice := expectedNotional.Mul(decimal.New(1, notionalDecimals))
humanReadableNotional := spotMarket.NotionalFromChainFormat(sdkmath.LegacyMustNewDecFromStr(chainFormatPrice.String()))

assert.Assert(t, expectedNotional.Equal(humanReadableNotional))
}

func TestConvertQuantityFromExtendedChainFormatForSpotMarket(t *testing.T) {
spotMarket := createINJUSDTSpotMarket()
expectedQuantity := decimal.RequireFromString("123.456")
Expand All @@ -134,6 +161,17 @@ func TestConvertPriceFromExtendedChainFormatForSpotMarket(t *testing.T) {
assert.Assert(t, expectedPrice.Equal(humanReadablePrice))
}

func TestConvertNotionalFromExtendedChainFormatForSpotMarket(t *testing.T) {
spotMarket := createINJUSDTSpotMarket()
expectedNotional := decimal.RequireFromString("123.456")

notionalDecimals := spotMarket.QuoteToken.Decimals
chainFormatNotional := expectedNotional.Mul(decimal.New(1, notionalDecimals)).Mul(decimal.New(1, AdditionalChainFormatDecimals))
humanReadableNotional := spotMarket.NotionalFromExtendedChainFormat(sdkmath.LegacyMustNewDecFromStr(chainFormatNotional.String()))

assert.Assert(t, expectedNotional.Equal(humanReadableNotional))
}

// Derivative markets tests

func TestConvertQuantityToChainFormatForDerivativeMarket(t *testing.T) {
Expand Down Expand Up @@ -188,6 +226,18 @@ func TestCalculateMarginInChainFormatForDerivativeMarket(t *testing.T) {
assert.Assert(t, chainValue.Equal(legacyDecimalQuantizedValue))
}

func TestConvertNotionalToChainFormatForDerivativeMarket(t *testing.T) {
derivativeMarket := createBTCUSDTPerpMarket()
originalNotional := decimal.RequireFromString("123.456789")

chainValue := derivativeMarket.NotionalToChainFormat(originalNotional)
notionalDecimals := derivativeMarket.QuoteToken.Decimals
expectedValue := originalNotional.Mul(decimal.New(1, notionalDecimals))
expectedChainFormatValue := sdkmath.LegacyMustNewDecFromStr(expectedValue.String())

assert.Assert(t, expectedChainFormatValue.Equal(chainValue))
}

func TestConvertQuantityFromChainFormatForDerivativeMarket(t *testing.T) {
derivativeMarket := createBTCUSDTPerpMarket()
expectedQuantity := decimal.RequireFromString("123.456")
Expand Down Expand Up @@ -220,6 +270,17 @@ func TestConvertMarginFromChainFormatForDerivativeMarket(t *testing.T) {
assert.Assert(t, expectedMargin.Equal(humanReadablePrice))
}

func TestConvertNotionalFromChainFormatForDerivativeMarket(t *testing.T) {
derivativeMarket := createBTCUSDTPerpMarket()
expectedNotional := decimal.RequireFromString("123.456")

notionalDecimals := derivativeMarket.QuoteToken.Decimals
chainFormatPrice := expectedNotional.Mul(decimal.New(1, notionalDecimals))
humanReadableNotional := derivativeMarket.NotionalFromChainFormat(sdkmath.LegacyMustNewDecFromStr(chainFormatPrice.String()))

assert.Assert(t, expectedNotional.Equal(humanReadableNotional))
}

func TestConvertQuantityFromExtendedChainFormatForDerivativeMarket(t *testing.T) {
derivativeMarket := createBTCUSDTPerpMarket()
expectedQuantity := decimal.RequireFromString("123.456")
Expand Down Expand Up @@ -251,3 +312,14 @@ func TestConvertMarginFromExtendedChainFormatForDerivativeMarket(t *testing.T) {

assert.Assert(t, expectedMargin.Equal(humanReadablePrice))
}

func TestConvertNotionalFromExtendedChainFormatForDerivativeMarket(t *testing.T) {
derivativeMarket := createBTCUSDTPerpMarket()
expectedNotional := decimal.RequireFromString("123.456")

notionalDecimals := derivativeMarket.QuoteToken.Decimals
chainFormatNotional := expectedNotional.Mul(decimal.New(1, notionalDecimals)).Mul(decimal.New(1, AdditionalChainFormatDecimals))
humanReadableNotional := derivativeMarket.NotionalFromExtendedChainFormat(sdkmath.LegacyMustNewDecFromStr(chainFormatNotional.String()))

assert.Assert(t, expectedNotional.Equal(humanReadableNotional))
}
Loading

0 comments on commit b7a68cc

Please sign in to comment.