Skip to content

Commit

Permalink
(feat) Added support for the new messages in exchange module, include…
Browse files Browse the repository at this point in the history
…d in the chain upgrade v1.13. Added unit tests and example scripts
  • Loading branch information
aarmoa committed Aug 6, 2024
1 parent 907ab57 commit 5d51307
Show file tree
Hide file tree
Showing 15 changed files with 1,709 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 5d51307

Please sign in to comment.