From 55fa4cc8f1c83ee572f6b173c98f3a2b1cec91c1 Mon Sep 17 00:00:00 2001 From: zenix Date: Fri, 17 Jun 2022 13:01:15 +0900 Subject: [PATCH 1/6] fix: apply gofmt on all files, add revive action --- .github/workflows/go.yml | 6 + cmd/bbgo-lorca/main.go | 2 +- cmd/bbgo-webview/main.go | 4 +- cmd/update-doc/main.go | 4 +- examples/kucoin/accounts.go | 1 - examples/kucoin/orders.go | 8 - examples/kucoin/symbols.go | 1 - examples/kucoin/tickers.go | 2 - examples/kucoin/websocket.go | 21 +- examples/okex-book/main.go | 1 - pkg/backtest/dumper_test.go | 26 +- pkg/backtest/matching.go | 1 + pkg/backtest/recorder_test.go | 1 - pkg/bbgo/environment.go | 2 +- pkg/bbgo/notifier.go | 1 - pkg/bbgo/profitstats.go | 1 - pkg/bbgo/reflect.go | 1 - pkg/bbgo/trader_test.go | 1 - pkg/cmd/cmdutil/exchange.go | 1 - pkg/exchange/batch/batch_test.go | 1 - pkg/exchange/batch/margin_interest.go | 4 +- pkg/exchange/batch/margin_liquidation.go | 4 +- pkg/exchange/batch/margin_repay.go | 4 +- pkg/exchange/batch/trade.go | 2 +- .../binance/binanceapi/client_test.go | 7 +- .../binanceapi/get_trade_fee_request.go | 4 +- pkg/exchange/ftx/convert_test.go | 1 - pkg/exchange/ftx/ftxapi/account.go | 1 - pkg/exchange/ftx/ftxapi/client.go | 2 - pkg/exchange/ftx/ftxapi/client_test.go | 12 +- pkg/exchange/ftx/ftxapi/market.go | 3 +- pkg/exchange/ftx/ftxapi/trade.go | 2 +- pkg/exchange/ftx/generate_symbol_map.go | 1 + pkg/exchange/ftx/rest_responses.go | 130 +- pkg/exchange/ftx/rest_wallet_request.go | 1 - pkg/exchange/ftx/symbols.go | 1619 ++++++------ pkg/exchange/kucoin/convert.go | 1 - pkg/exchange/kucoin/generate_symbol_map.go | 2 +- pkg/exchange/kucoin/kucoinapi/bullet.go | 1 - pkg/exchange/kucoin/stream.go | 10 +- pkg/exchange/kucoin/symbols.go | 2204 ++++++++--------- pkg/exchange/max/maxapi/account_test.go | 1 - pkg/exchange/max/maxapi/order_test.go | 2 - pkg/exchange/max/maxapi/v3/margin.go | 1 - pkg/exchange/max/maxapi/websocket.go | 1 - pkg/exchange/max/maxapi/withdrawal.go | 4 +- pkg/exchange/max/ticker_test.go | 1 - pkg/exchange/okex/exchange.go | 2 +- pkg/exchange/okex/gensymbols.go | 1 + pkg/exchange/okex/stream.go | 6 +- pkg/exchange/okex/symbols.go | 1021 ++++---- pkg/fixedpoint/dec.go | 4 +- pkg/fixedpoint/dec_legacy_test.go | 2 +- pkg/fixedpoint/dec_test.go | 5 +- pkg/grpc/convert.go | 16 +- pkg/indicator/dmi_test.go | 24 +- pkg/service/account.go | 32 +- pkg/service/persistence_json.go | 1 - pkg/service/reward.go | 6 +- pkg/service/reward_test.go | 3 +- pkg/service/withdraw_test.go | 2 +- pkg/strategy/factorzoo/strategy.go | 2 +- pkg/strategy/wall/strategy.go | 1 - pkg/strategy/xmaker/state.go | 4 +- pkg/types/indicator.go | 38 +- pkg/types/market_test.go | 15 +- pkg/types/profit.go | 1 - pkg/types/sort_test.go | 28 +- pkg/util/exchange_icon.go | 1 - pkg/version/dev.go | 2 +- pkg/version/version.go | 2 +- 71 files changed, 2650 insertions(+), 2680 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index dc75db151..59879902b 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -72,6 +72,12 @@ jobs: go test -race -coverprofile coverage_dnum.txt -covermode atomic -tags dnum ./pkg/... sed -i -e '/_requestgen.go/d' coverage_dnum.txt + - name: Revive Check + uses: morphy2k/revive-action@v2 + with: + reporter: github-pr-review + fail_on_error: true + - name: Upload Coverage Report uses: codecov/codecov-action@v3 with: diff --git a/cmd/bbgo-lorca/main.go b/cmd/bbgo-lorca/main.go index f9c44c200..361066164 100644 --- a/cmd/bbgo-lorca/main.go +++ b/cmd/bbgo-lorca/main.go @@ -102,7 +102,7 @@ func main() { return } - if err := trader.LoadState() ; err != nil { + if err := trader.LoadState(); err != nil { log.WithError(err).Error("failed to load strategy states") return } diff --git a/cmd/bbgo-webview/main.go b/cmd/bbgo-webview/main.go index 215d6d73e..3aff9361e 100644 --- a/cmd/bbgo-webview/main.go +++ b/cmd/bbgo-webview/main.go @@ -110,7 +110,7 @@ func main() { return } - if err := trader.LoadState() ; err != nil { + if err := trader.LoadState(); err != nil { log.WithError(err).Error("failed to load strategy states") return } @@ -123,7 +123,7 @@ func main() { } // find a free port for binding the server - ln, err := net.Listen("tcp", "127.0.0.1:" + strconv.Itoa(portNum)) + ln, err := net.Listen("tcp", "127.0.0.1:"+strconv.Itoa(portNum)) if err != nil { log.WithError(err).Error("can not bind listener") return diff --git a/cmd/update-doc/main.go b/cmd/update-doc/main.go index ae4fcdfcf..214ff608b 100644 --- a/cmd/update-doc/main.go +++ b/cmd/update-doc/main.go @@ -1,12 +1,12 @@ package main import ( + "fmt" "github.com/c9s/bbgo/pkg/cmd" "github.com/spf13/cobra/doc" + "log" "path" "runtime" - "fmt" - "log" ) func main() { diff --git a/examples/kucoin/accounts.go b/examples/kucoin/accounts.go index 087a5a4cc..7e09e13cc 100644 --- a/examples/kucoin/accounts.go +++ b/examples/kucoin/accounts.go @@ -39,4 +39,3 @@ var accountsCmd = &cobra.Command{ return nil }, } - diff --git a/examples/kucoin/orders.go b/examples/kucoin/orders.go index 8e13b874d..4acb01cbe 100644 --- a/examples/kucoin/orders.go +++ b/examples/kucoin/orders.go @@ -32,7 +32,6 @@ func init() { ordersCmd.AddCommand(historyOrdersCmd) } - // go run ./examples/kucoin orders var ordersCmd = &cobra.Command{ Use: "orders", @@ -73,7 +72,6 @@ var ordersCmd = &cobra.Command{ }, } - // go run ./examples/kucoin orders history var historyOrdersCmd = &cobra.Command{ Use: "history [--symbol SYMBOL]", @@ -105,7 +103,6 @@ var historyOrdersCmd = &cobra.Command{ }, } - // usage: // go run ./examples/kucoin orders place --symbol LTC-USDT --price 50 --size 1 --order-type limit --side buy var placeOrderCmd = &cobra.Command{ @@ -124,14 +121,12 @@ var placeOrderCmd = &cobra.Command{ req.OrderType(kucoinapi.OrderType(orderType)) - side, err := cmd.Flags().GetString("side") if err != nil { return err } req.Side(kucoinapi.SideType(side)) - symbol, err := cmd.Flags().GetString("symbol") if err != nil { return err @@ -155,7 +150,6 @@ var placeOrderCmd = &cobra.Command{ } - size, err := cmd.Flags().GetString("size") if err != nil { return err @@ -172,8 +166,6 @@ var placeOrderCmd = &cobra.Command{ }, } - - // usage: var cancelOrderCmd = &cobra.Command{ Use: "cancel", diff --git a/examples/kucoin/symbols.go b/examples/kucoin/symbols.go index 52656fdef..dd2420ce2 100644 --- a/examples/kucoin/symbols.go +++ b/examples/kucoin/symbols.go @@ -25,4 +25,3 @@ var symbolsCmd = &cobra.Command{ return nil }, } - diff --git a/examples/kucoin/tickers.go b/examples/kucoin/tickers.go index 6b7b060c6..0da748783 100644 --- a/examples/kucoin/tickers.go +++ b/examples/kucoin/tickers.go @@ -36,7 +36,6 @@ var tickersCmd = &cobra.Command{ logrus.Infof("ticker: %+v", ticker) - tickerStats, err := client.MarketDataService.GetTicker24HStat(args[0]) if err != nil { return err @@ -46,4 +45,3 @@ var tickersCmd = &cobra.Command{ return nil }, } - diff --git a/examples/kucoin/websocket.go b/examples/kucoin/websocket.go index 287d0e2e7..d522637d7 100644 --- a/examples/kucoin/websocket.go +++ b/examples/kucoin/websocket.go @@ -77,16 +77,16 @@ var websocketCmd = &cobra.Command{ id := time.Now().UnixNano() / int64(time.Millisecond) wsCmds := []kucoin.WebSocketCommand{ /* - { - Id: id+1, - Type: "subscribe", - Topic: "/market/ticker:ETH-USDT", - PrivateChannel: false, - Response: true, - }, + { + Id: id+1, + Type: "subscribe", + Topic: "/market/ticker:ETH-USDT", + PrivateChannel: false, + Response: true, + }, */ { - Id: id+2, + Id: id + 2, Type: "subscribe", Topic: "/market/candles:ETH-USDT_1min", PrivateChannel: false, @@ -131,7 +131,6 @@ var websocketCmd = &cobra.Command{ logrus.WithError(err).Error("websocket ping error", err) } - case <-interrupt: logrus.Infof("interrupt") @@ -144,8 +143,8 @@ var websocketCmd = &cobra.Command{ } select { - case <-done: - case <-time.After(time.Second): + case <-done: + case <-time.After(time.Second): } return nil } diff --git a/examples/okex-book/main.go b/examples/okex-book/main.go index dc9715c44..77218d81c 100644 --- a/examples/okex-book/main.go +++ b/examples/okex-book/main.go @@ -69,7 +69,6 @@ var rootCmd = &cobra.Command{ log.Infof("%+v", account) - log.Infof("ASSET BALANCES:") assetBalances, err := client.AssetBalances() if err != nil { diff --git a/pkg/backtest/dumper_test.go b/pkg/backtest/dumper_test.go index d5db13445..be13a2261 100644 --- a/pkg/backtest/dumper_test.go +++ b/pkg/backtest/dumper_test.go @@ -19,19 +19,19 @@ func TestKLineDumper(t *testing.T) { t1 := time.Now() err := dumper.Record(types.KLine{ - Exchange: types.ExchangeBinance, - Symbol: "BTCUSDT", - StartTime: types.Time(t1), - EndTime: types.Time(t1.Add(time.Minute)), - Interval: types.Interval1m, - Open: fixedpoint.NewFromFloat(1000.0), - High: fixedpoint.NewFromFloat(2000.0), - Low: fixedpoint.NewFromFloat(3000.0), - Close: fixedpoint.NewFromFloat(4000.0), - Volume: fixedpoint.NewFromFloat(5000.0), - QuoteVolume: fixedpoint.NewFromFloat(6000.0), - NumberOfTrades: 10, - Closed: true, + Exchange: types.ExchangeBinance, + Symbol: "BTCUSDT", + StartTime: types.Time(t1), + EndTime: types.Time(t1.Add(time.Minute)), + Interval: types.Interval1m, + Open: fixedpoint.NewFromFloat(1000.0), + High: fixedpoint.NewFromFloat(2000.0), + Low: fixedpoint.NewFromFloat(3000.0), + Close: fixedpoint.NewFromFloat(4000.0), + Volume: fixedpoint.NewFromFloat(5000.0), + QuoteVolume: fixedpoint.NewFromFloat(6000.0), + NumberOfTrades: 10, + Closed: true, }) assert.NoError(t, err) diff --git a/pkg/backtest/matching.go b/pkg/backtest/matching.go index d567af658..37cced39a 100644 --- a/pkg/backtest/matching.go +++ b/pkg/backtest/matching.go @@ -30,6 +30,7 @@ var klineMatchingLogger *logrus.Entry = nil // FeeToken is used to simulate the exchange platform fee token // This is to ease the back-testing environment for closing positions. const FeeToken = "FEE" + var useFeeToken = true func init() { diff --git a/pkg/backtest/recorder_test.go b/pkg/backtest/recorder_test.go index c95a6b394..3b6348d8e 100644 --- a/pkg/backtest/recorder_test.go +++ b/pkg/backtest/recorder_test.go @@ -34,7 +34,6 @@ func TestStateRecorder(t *testing.T) { assert.NoError(t, err) assert.Len(t, recorder.writers, 1) - st.Position.AddTrade(types.Trade{ OrderID: 1, Exchange: types.ExchangeBinance, diff --git a/pkg/bbgo/environment.go b/pkg/bbgo/environment.go index d6e55ff0f..bace19b25 100644 --- a/pkg/bbgo/environment.go +++ b/pkg/bbgo/environment.go @@ -596,7 +596,7 @@ func (environ *Environment) syncWithUserConfig(ctx context.Context, userConfig * syncSymbolMap, restSymbols := categorizeSyncSymbol(userConfig.Sync.Symbols) for _, session := range sessions { syncSymbols := restSymbols - if ss, ok := syncSymbolMap[session.Name] ; ok { + if ss, ok := syncSymbolMap[session.Name]; ok { syncSymbols = append(syncSymbols, ss...) } diff --git a/pkg/bbgo/notifier.go b/pkg/bbgo/notifier.go index daf4b29e3..d74021f5c 100644 --- a/pkg/bbgo/notifier.go +++ b/pkg/bbgo/notifier.go @@ -69,4 +69,3 @@ func (m *Notifiability) NotifyTo(channel string, obj interface{}, args ...interf n.NotifyTo(channel, obj, args...) } } - diff --git a/pkg/bbgo/profitstats.go b/pkg/bbgo/profitstats.go index 920078f66..f30d11b65 100644 --- a/pkg/bbgo/profitstats.go +++ b/pkg/bbgo/profitstats.go @@ -1,2 +1 @@ package bbgo - diff --git a/pkg/bbgo/reflect.go b/pkg/bbgo/reflect.go index 6488b166f..4f72e29ed 100644 --- a/pkg/bbgo/reflect.go +++ b/pkg/bbgo/reflect.go @@ -100,4 +100,3 @@ func newTypeValueInterface(typ reflect.Type) interface{} { dst := reflect.New(typ) return dst.Interface() } - diff --git a/pkg/bbgo/trader_test.go b/pkg/bbgo/trader_test.go index 920078f66..f30d11b65 100644 --- a/pkg/bbgo/trader_test.go +++ b/pkg/bbgo/trader_test.go @@ -1,2 +1 @@ package bbgo - diff --git a/pkg/cmd/cmdutil/exchange.go b/pkg/cmd/cmdutil/exchange.go index 3baca0880..b6eaaab51 100644 --- a/pkg/cmd/cmdutil/exchange.go +++ b/pkg/cmd/cmdutil/exchange.go @@ -1,2 +1 @@ package cmdutil - diff --git a/pkg/exchange/batch/batch_test.go b/pkg/exchange/batch/batch_test.go index 720b9c4f1..389c4ab2a 100644 --- a/pkg/exchange/batch/batch_test.go +++ b/pkg/exchange/batch/batch_test.go @@ -1,2 +1 @@ package batch - diff --git a/pkg/exchange/batch/margin_interest.go b/pkg/exchange/batch/margin_interest.go index 5ffe823b5..4e8224bc9 100644 --- a/pkg/exchange/batch/margin_interest.go +++ b/pkg/exchange/batch/margin_interest.go @@ -15,8 +15,8 @@ type MarginInterestBatchQuery struct { func (e *MarginInterestBatchQuery) Query(ctx context.Context, asset string, startTime, endTime time.Time) (c chan types.MarginInterest, errC chan error) { query := &AsyncTimeRangedBatchQuery{ - Type: types.MarginInterest{}, - Limiter: rate.NewLimiter(rate.Every(5*time.Second), 2), + Type: types.MarginInterest{}, + Limiter: rate.NewLimiter(rate.Every(5*time.Second), 2), JumpIfEmpty: time.Hour * 24 * 30, Q: func(startTime, endTime time.Time) (interface{}, error) { return e.QueryInterestHistory(ctx, asset, &startTime, &endTime) diff --git a/pkg/exchange/batch/margin_liquidation.go b/pkg/exchange/batch/margin_liquidation.go index 1f4425382..3726d1891 100644 --- a/pkg/exchange/batch/margin_liquidation.go +++ b/pkg/exchange/batch/margin_liquidation.go @@ -16,8 +16,8 @@ type MarginLiquidationBatchQuery struct { func (e *MarginLiquidationBatchQuery) Query(ctx context.Context, startTime, endTime time.Time) (c chan types.MarginLiquidation, errC chan error) { query := &AsyncTimeRangedBatchQuery{ - Type: types.MarginLiquidation{}, - Limiter: rate.NewLimiter(rate.Every(5*time.Second), 2), + Type: types.MarginLiquidation{}, + Limiter: rate.NewLimiter(rate.Every(5*time.Second), 2), JumpIfEmpty: time.Hour * 24 * 30, Q: func(startTime, endTime time.Time) (interface{}, error) { return e.QueryLiquidationHistory(ctx, &startTime, &endTime) diff --git a/pkg/exchange/batch/margin_repay.go b/pkg/exchange/batch/margin_repay.go index 0d5c29e25..a30ea1208 100644 --- a/pkg/exchange/batch/margin_repay.go +++ b/pkg/exchange/batch/margin_repay.go @@ -16,8 +16,8 @@ type MarginRepayBatchQuery struct { func (e *MarginRepayBatchQuery) Query(ctx context.Context, asset string, startTime, endTime time.Time) (c chan types.MarginRepay, errC chan error) { query := &AsyncTimeRangedBatchQuery{ - Type: types.MarginRepay{}, - Limiter: rate.NewLimiter(rate.Every(5*time.Second), 2), + Type: types.MarginRepay{}, + Limiter: rate.NewLimiter(rate.Every(5*time.Second), 2), JumpIfEmpty: time.Hour * 24 * 30, Q: func(startTime, endTime time.Time) (interface{}, error) { return e.QueryRepayHistory(ctx, asset, &startTime, &endTime) diff --git a/pkg/exchange/batch/trade.go b/pkg/exchange/batch/trade.go index 351800b06..dc5abce48 100644 --- a/pkg/exchange/batch/trade.go +++ b/pkg/exchange/batch/trade.go @@ -21,7 +21,7 @@ func (e TradeBatchQuery) Query(ctx context.Context, symbol string, options *type startTime := *options.StartTime endTime := *options.EndTime query := &AsyncTimeRangedBatchQuery{ - Type: types.Trade{}, + Type: types.Trade{}, Q: func(startTime, endTime time.Time) (interface{}, error) { return e.ExchangeTradeHistoryService.QueryTrades(ctx, symbol, options) }, diff --git a/pkg/exchange/binance/binanceapi/client_test.go b/pkg/exchange/binance/binanceapi/client_test.go index ac32a3f18..e86bba783 100644 --- a/pkg/exchange/binance/binanceapi/client_test.go +++ b/pkg/exchange/binance/binanceapi/client_test.go @@ -84,7 +84,6 @@ func TestClient_NewSpotRebateHistoryRequest(t *testing.T) { t.Logf("spot rebate history: %+v", history) } - func TestClient_NewGetMarginInterestRateHistoryRequest(t *testing.T) { client := getTestClientOrSkip(t) ctx := context.Background() @@ -121,8 +120,8 @@ func TestClient_privateCall(t *testing.T) { resp, err := client.SendRequest(req) if assert.NoError(t, err) { - var feeStructs []struct{ - Symbol string `json:"symbol"` + var feeStructs []struct { + Symbol string `json:"symbol"` MakerCommission string `json:"makerCommission"` TakerCommission string `json:"takerCommission"` } @@ -131,7 +130,7 @@ func TestClient_privateCall(t *testing.T) { assert.NotEmpty(t, feeStructs) } } else { - dump, _ := httputil.DumpRequest(req, true); + dump, _ := httputil.DumpRequest(req, true) log.Printf("request: %s", dump) } } diff --git a/pkg/exchange/binance/binanceapi/get_trade_fee_request.go b/pkg/exchange/binance/binanceapi/get_trade_fee_request.go index 1816f5f07..0b6c54406 100644 --- a/pkg/exchange/binance/binanceapi/get_trade_fee_request.go +++ b/pkg/exchange/binance/binanceapi/get_trade_fee_request.go @@ -7,9 +7,9 @@ import ( ) type TradeFee struct { - Symbol string `json:"symbol"` + Symbol string `json:"symbol"` MakerCommission fixedpoint.Value `json:"makerCommission"` - TakerCommission fixedpoint.Value `json:"takerCommission"` + TakerCommission fixedpoint.Value `json:"takerCommission"` } //go:generate requestgen -method GET -url "/sapi/v1/asset/tradeFee" -type GetTradeFeeRequest -responseType []TradeFee diff --git a/pkg/exchange/ftx/convert_test.go b/pkg/exchange/ftx/convert_test.go index 3eee61a6a..3a1ea7f1e 100644 --- a/pkg/exchange/ftx/convert_test.go +++ b/pkg/exchange/ftx/convert_test.go @@ -119,4 +119,3 @@ func Test_toLocalOrderTypeWithMarket(t *testing.T) { assert.NoError(t, err) assert.Equal(t, ftxapi.OrderTypeMarket, orderType) } - diff --git a/pkg/exchange/ftx/ftxapi/account.go b/pkg/exchange/ftx/ftxapi/account.go index 345ce7864..f6309f272 100644 --- a/pkg/exchange/ftx/ftxapi/account.go +++ b/pkg/exchange/ftx/ftxapi/account.go @@ -66,7 +66,6 @@ func (c *RestClient) NewGetPositionsRequest() *GetPositionsRequest { } } - type Balance struct { Coin string `json:"coin"` Free fixedpoint.Value `json:"free"` diff --git a/pkg/exchange/ftx/ftxapi/client.go b/pkg/exchange/ftx/ftxapi/client.go index 0da9ee516..58b2ddde0 100644 --- a/pkg/exchange/ftx/ftxapi/client.go +++ b/pkg/exchange/ftx/ftxapi/client.go @@ -200,5 +200,3 @@ func castPayload(payload interface{}) ([]byte, error) { return nil, nil } - - diff --git a/pkg/exchange/ftx/ftxapi/client_test.go b/pkg/exchange/ftx/ftxapi/client_test.go index 421c0d6a0..a73f59566 100644 --- a/pkg/exchange/ftx/ftxapi/client_test.go +++ b/pkg/exchange/ftx/ftxapi/client_test.go @@ -37,7 +37,7 @@ func TestClient_Requests(t *testing.T) { return } - ctx, cancel := context.WithTimeout(context.TODO(), 15 * time.Second) + ctx, cancel := context.WithTimeout(context.TODO(), 15*time.Second) defer cancel() client := NewClient() @@ -45,13 +45,13 @@ func TestClient_Requests(t *testing.T) { testCases := []struct { name string - tt func(t *testing.T) - } { + tt func(t *testing.T) + }{ { name: "GetMarketsRequest", tt: func(t *testing.T) { req := client.NewGetMarketsRequest() - markets ,err := req.Do(ctx) + markets, err := req.Do(ctx) assert.NoError(t, err) assert.NotNil(t, markets) t.Logf("markets: %+v", markets) @@ -61,7 +61,7 @@ func TestClient_Requests(t *testing.T) { name: "GetAccountRequest", tt: func(t *testing.T) { req := client.NewGetAccountRequest() - account ,err := req.Do(ctx) + account, err := req.Do(ctx) assert.NoError(t, err) assert.NotNil(t, account) t.Logf("account: %+v", account) @@ -78,7 +78,7 @@ func TestClient_Requests(t *testing.T) { Side(SideBuy). Market("LTC/USDT") - createdOrder,err := req.Do(ctx) + createdOrder, err := req.Do(ctx) if assert.NoError(t, err) { assert.NotNil(t, createdOrder) t.Logf("createdOrder: %+v", createdOrder) diff --git a/pkg/exchange/ftx/ftxapi/market.go b/pkg/exchange/ftx/ftxapi/market.go index 6035d3526..4cac2fee9 100644 --- a/pkg/exchange/ftx/ftxapi/market.go +++ b/pkg/exchange/ftx/ftxapi/market.go @@ -25,7 +25,7 @@ type Market struct { Underlying string `json:"underlying"` Enabled bool `json:"enabled"` Ask fixedpoint.Value `json:"ask"` - Bid fixedpoint.Value `json:"bid"` + Bid fixedpoint.Value `json:"bid"` Last fixedpoint.Value `json:"last"` PostOnly bool `json:"postOnly"` Price fixedpoint.Value `json:"price"` @@ -33,6 +33,7 @@ type Market struct { SizeIncrement fixedpoint.Value `json:"sizeIncrement"` Restricted bool `json:"restricted"` } + //go:generate GetRequest -url "api/markets" -type GetMarketsRequest -responseDataType []Market type GetMarketsRequest struct { client requestgen.APIClient diff --git a/pkg/exchange/ftx/ftxapi/trade.go b/pkg/exchange/ftx/ftxapi/trade.go index ccc390c39..323481d20 100644 --- a/pkg/exchange/ftx/ftxapi/trade.go +++ b/pkg/exchange/ftx/ftxapi/trade.go @@ -128,7 +128,7 @@ type Fill struct { BaseCurrency string `json:"baseCurrency"` QuoteCurrency string `json:"quoteCurrency"` OrderId uint64 `json:"orderId"` - TradeId uint64 `json:"tradeId"` + TradeId uint64 `json:"tradeId"` Price fixedpoint.Value `json:"price"` Side Side `json:"side"` Size fixedpoint.Value `json:"size"` diff --git a/pkg/exchange/ftx/generate_symbol_map.go b/pkg/exchange/ftx/generate_symbol_map.go index 1096494b0..b2c68072e 100644 --- a/pkg/exchange/ftx/generate_symbol_map.go +++ b/pkg/exchange/ftx/generate_symbol_map.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main diff --git a/pkg/exchange/ftx/rest_responses.go b/pkg/exchange/ftx/rest_responses.go index cb6c318af..6174d6846 100644 --- a/pkg/exchange/ftx/rest_responses.go +++ b/pkg/exchange/ftx/rest_responses.go @@ -5,8 +5,8 @@ import ( "strings" "time" - "github.com/c9s/bbgo/pkg/types" "github.com/c9s/bbgo/pkg/fixedpoint" + "github.com/c9s/bbgo/pkg/types" ) // ex: 2019-03-05T09:56:55.728933+00:00 @@ -121,7 +121,7 @@ type position struct { Cost fixedpoint.Value `json:"cost"` EntryPrice fixedpoint.Value `json:"entryPrice"` EstimatedLiquidationPrice fixedpoint.Value `json:"estimatedLiquidationPrice"` - Future string `json:"future"` + Future string `json:"future"` InitialMarginRequirement fixedpoint.Value `json:"initialMarginRequirement"` LongOrderSize fixedpoint.Value `json:"longOrderSize"` MaintenanceMarginRequirement fixedpoint.Value `json:"maintenanceMarginRequirement"` @@ -129,7 +129,7 @@ type position struct { OpenSize fixedpoint.Value `json:"openSize"` RealizedPnl fixedpoint.Value `json:"realizedPnl"` ShortOrderSize fixedpoint.Value `json:"shortOrderSize"` - Side string `json:"Side"` + Side string `json:"Side"` Size fixedpoint.Value `json:"size"` UnrealizedPnl fixedpoint.Value `json:"unrealizedPnl"` CollateralUsed fixedpoint.Value `json:"collateralUsed"` @@ -139,7 +139,7 @@ type balances struct { Success bool `json:"success"` Result []struct { - Coin string `json:"coin"` + Coin string `json:"coin"` Free fixedpoint.Value `json:"free"` Total fixedpoint.Value `json:"total"` } `json:"result"` @@ -178,9 +178,9 @@ type marketsResponse struct { } type market struct { - Name string `json:"name"` - Enabled bool `json:"enabled"` - PostOnly bool `json:"postOnly"` + Name string `json:"name"` + Enabled bool `json:"enabled"` + PostOnly bool `json:"postOnly"` PriceIncrement fixedpoint.Value `json:"priceIncrement"` SizeIncrement fixedpoint.Value `json:"sizeIncrement"` MinProvideSize fixedpoint.Value `json:"minProvideSize"` @@ -188,12 +188,12 @@ type market struct { Bid fixedpoint.Value `json:"bid"` Ask fixedpoint.Value `json:"ask"` Price fixedpoint.Value `json:"price"` - Type string `json:"type"` - BaseCurrency string `json:"baseCurrency"` - QuoteCurrency string `json:"quoteCurrency"` - Underlying string `json:"underlying"` - Restricted bool `json:"restricted"` - HighLeverageFeeExempt bool `json:"highLeverageFeeExempt"` + Type string `json:"type"` + BaseCurrency string `json:"baseCurrency"` + QuoteCurrency string `json:"quoteCurrency"` + Underlying string `json:"underlying"` + Restricted bool `json:"restricted"` + HighLeverageFeeExempt bool `json:"highLeverageFeeExempt"` Change1h fixedpoint.Value `json:"change1h"` Change24h fixedpoint.Value `json:"change24h"` ChangeBod fixedpoint.Value `json:"changeBod"` @@ -222,12 +222,12 @@ type HistoricalPricesResponse struct { } type Candle struct { - Close fixedpoint.Value `json:"close"` - High fixedpoint.Value `json:"high"` - Low fixedpoint.Value `json:"low"` - Open fixedpoint.Value `json:"open"` - StartTime datetime `json:"startTime"` - Volume fixedpoint.Value `json:"volume"` + Close fixedpoint.Value `json:"close"` + High fixedpoint.Value `json:"high"` + Low fixedpoint.Value `json:"low"` + Open fixedpoint.Value `json:"open"` + StartTime datetime `json:"startTime"` + Volume fixedpoint.Value `json:"volume"` } type ordersHistoryResponse struct { @@ -248,24 +248,24 @@ type cancelOrderResponse struct { } type order struct { - CreatedAt datetime `json:"createdAt"` - FilledSize fixedpoint.Value `json:"filledSize"` + CreatedAt datetime `json:"createdAt"` + FilledSize fixedpoint.Value `json:"filledSize"` // Future field is not defined in the response format table but in the response example. - Future string `json:"future"` - ID int64 `json:"id"` - Market string `json:"market"` + Future string `json:"future"` + ID int64 `json:"id"` + Market string `json:"market"` Price fixedpoint.Value `json:"price"` AvgFillPrice fixedpoint.Value `json:"avgFillPrice"` RemainingSize fixedpoint.Value `json:"remainingSize"` - Side string `json:"side"` + Side string `json:"side"` Size fixedpoint.Value `json:"size"` - Status string `json:"status"` - Type string `json:"type"` - ReduceOnly bool `json:"reduceOnly"` - Ioc bool `json:"ioc"` - PostOnly bool `json:"postOnly"` - ClientId string `json:"clientId"` - Liquidation bool `json:"liquidation"` + Status string `json:"status"` + Type string `json:"type"` + ReduceOnly bool `json:"reduceOnly"` + Ioc bool `json:"ioc"` + PostOnly bool `json:"postOnly"` + ClientId string `json:"clientId"` + Liquidation bool `json:"liquidation"` } type orderResponse struct { @@ -299,18 +299,18 @@ type depositHistoryResponse struct { } type depositHistory struct { - ID int64 `json:"id"` - Coin string `json:"coin"` - TxID string `json:"txid"` - Address address `json:"address"` - Confirmations int64 `json:"confirmations"` - ConfirmedTime datetime `json:"confirmedTime"` - Fee fixedpoint.Value `json:"fee"` - SentTime datetime `json:"sentTime"` - Size fixedpoint.Value `json:"size"` - Status string `json:"status"` - Time datetime `json:"time"` - Notes string `json:"notes"` + ID int64 `json:"id"` + Coin string `json:"coin"` + TxID string `json:"txid"` + Address address `json:"address"` + Confirmations int64 `json:"confirmations"` + ConfirmedTime datetime `json:"confirmedTime"` + Fee fixedpoint.Value `json:"fee"` + SentTime datetime `json:"sentTime"` + Size fixedpoint.Value `json:"size"` + Status string `json:"status"` + Time datetime `json:"time"` + Notes string `json:"notes"` } /** @@ -354,22 +354,22 @@ type fillsResponse struct { } */ type fill struct { - ID int64 `json:"id"` - Market string `json:"market"` - Future string `json:"future"` - BaseCurrency string `json:"baseCurrency"` - QuoteCurrency string `json:"quoteCurrency"` - Type string `json:"type"` - Side types.SideType `json:"side"` - Price fixedpoint.Value `json:"price"` - Size fixedpoint.Value `json:"size"` - OrderId uint64 `json:"orderId"` - Time datetime `json:"time"` - TradeId uint64 `json:"tradeId"` - FeeRate fixedpoint.Value `json:"feeRate"` - Fee fixedpoint.Value `json:"fee"` - FeeCurrency string `json:"feeCurrency"` - Liquidity string `json:"liquidity"` + ID int64 `json:"id"` + Market string `json:"market"` + Future string `json:"future"` + BaseCurrency string `json:"baseCurrency"` + QuoteCurrency string `json:"quoteCurrency"` + Type string `json:"type"` + Side types.SideType `json:"side"` + Price fixedpoint.Value `json:"price"` + Size fixedpoint.Value `json:"size"` + OrderId uint64 `json:"orderId"` + Time datetime `json:"time"` + TradeId uint64 `json:"tradeId"` + FeeRate fixedpoint.Value `json:"feeRate"` + Fee fixedpoint.Value `json:"fee"` + FeeCurrency string `json:"feeCurrency"` + Liquidity string `json:"liquidity"` } type transferResponse struct { @@ -378,12 +378,12 @@ type transferResponse struct { } type transfer struct { - Id uint `json:"id"` - Coin string `json:"coin"` + Id uint `json:"id"` + Coin string `json:"coin"` Size fixedpoint.Value `json:"size"` - Time string `json:"time"` - Notes string `json:"notes"` - Status string `json:"status"` + Time string `json:"time"` + Notes string `json:"notes"` + Status string `json:"status"` } func (t *transfer) String() string { diff --git a/pkg/exchange/ftx/rest_wallet_request.go b/pkg/exchange/ftx/rest_wallet_request.go index addbab521..039a32553 100644 --- a/pkg/exchange/ftx/rest_wallet_request.go +++ b/pkg/exchange/ftx/rest_wallet_request.go @@ -42,4 +42,3 @@ func (r *walletRequest) DepositHistory(ctx context.Context, since time.Time, unt return d, nil } - diff --git a/pkg/exchange/ftx/symbols.go b/pkg/exchange/ftx/symbols.go index 77907297c..33cb02296 100644 --- a/pkg/exchange/ftx/symbols.go +++ b/pkg/exchange/ftx/symbols.go @@ -1,818 +1,819 @@ // Code generated by go generate; DO NOT EDIT. package ftx + var symbolMap = map[string]string{ - "1INCH-0325": "1INCH-0325", - "1INCH-PERP": "1INCH-PERP", - "1INCHUSD": "1INCH/USD", - "AAPL-0325": "AAPL-0325", - "AAPLUSD": "AAPL/USD", - "AAVE-0325": "AAVE-0325", - "AAVE-PERP": "AAVE-PERP", - "AAVEUSD": "AAVE/USD", - "AAVEUSDT": "AAVE/USDT", - "ABNB-0325": "ABNB-0325", - "ABNBUSD": "ABNB/USD", - "ACB-0325": "ACB-0325", - "ACBUSD": "ACB/USD", - "ADA-0325": "ADA-0325", - "ADA-PERP": "ADA-PERP", - "ADABEARUSD": "ADABEAR/USD", - "ADABULLUSD": "ADABULL/USD", - "ADAHALFUSD": "ADAHALF/USD", - "ADAHEDGEUSD": "ADAHEDGE/USD", - "AGLD-PERP": "AGLD-PERP", - "AGLDUSD": "AGLD/USD", - "AKROUSD": "AKRO/USD", - "AKROUSDT": "AKRO/USDT", - "ALCX-PERP": "ALCX-PERP", - "ALCXUSD": "ALCX/USD", - "ALEPHUSD": "ALEPH/USD", - "ALGO-0325": "ALGO-0325", - "ALGO-PERP": "ALGO-PERP", - "ALGOBEARUSD": "ALGOBEAR/USD", - "ALGOBULLUSD": "ALGOBULL/USD", - "ALGOHALFUSD": "ALGOHALF/USD", - "ALGOHEDGEUSD": "ALGOHEDGE/USD", - "ALICE-PERP": "ALICE-PERP", - "ALICEUSD": "ALICE/USD", - "ALPHA-PERP": "ALPHA-PERP", - "ALPHAUSD": "ALPHA/USD", - "ALT-0325": "ALT-0325", - "ALT-PERP": "ALT-PERP", - "ALTBEARUSD": "ALTBEAR/USD", - "ALTBULLUSD": "ALTBULL/USD", - "ALTHALFUSD": "ALTHALF/USD", - "ALTHEDGEUSD": "ALTHEDGE/USD", - "AMC-0325": "AMC-0325", - "AMCUSD": "AMC/USD", - "AMD-0325": "AMD-0325", - "AMDUSD": "AMD/USD", - "AMPL-PERP": "AMPL-PERP", - "AMPLUSD": "AMPL/USD", - "AMPLUSDT": "AMPL/USDT", - "AMZN-0325": "AMZN-0325", - "AMZNUSD": "AMZN/USD", - "APHAUSD": "APHA/USD", - "AR-PERP": "AR-PERP", - "ARKK-0325": "ARKK-0325", - "ARKKUSD": "ARKK/USD", - "ASD-PERP": "ASD-PERP", - "ASDBEARUSD": "ASDBEAR/USD", - "ASDBEARUSDT": "ASDBEAR/USDT", - "ASDBULLUSD": "ASDBULL/USD", - "ASDBULLUSDT": "ASDBULL/USDT", - "ASDHALFUSD": "ASDHALF/USD", - "ASDHEDGEUSD": "ASDHEDGE/USD", - "ASDUSD": "ASD/USD", - "ATLAS-PERP": "ATLAS-PERP", - "ATLASUSD": "ATLAS/USD", - "ATOM-0325": "ATOM-0325", - "ATOM-PERP": "ATOM-PERP", - "ATOMBEARUSD": "ATOMBEAR/USD", - "ATOMBULLUSD": "ATOMBULL/USD", - "ATOMHALFUSD": "ATOMHALF/USD", - "ATOMHEDGEUSD": "ATOMHEDGE/USD", - "ATOMUSD": "ATOM/USD", - "ATOMUSDT": "ATOM/USDT", - "AUDIO-PERP": "AUDIO-PERP", - "AUDIOUSD": "AUDIO/USD", - "AUDIOUSDT": "AUDIO/USDT", - "AURYUSD": "AURY/USD", - "AVAX-0325": "AVAX-0325", - "AVAX-PERP": "AVAX-PERP", - "AVAXBTC": "AVAX/BTC", - "AVAXUSD": "AVAX/USD", - "AVAXUSDT": "AVAX/USDT", - "AXS-PERP": "AXS-PERP", - "AXSUSD": "AXS/USD", - "BABA-0325": "BABA-0325", - "BABAUSD": "BABA/USD", - "BADGER-PERP": "BADGER-PERP", - "BADGERUSD": "BADGER/USD", - "BAL-0325": "BAL-0325", - "BAL-PERP": "BAL-PERP", - "BALBEARUSD": "BALBEAR/USD", - "BALBEARUSDT": "BALBEAR/USDT", - "BALBULLUSD": "BALBULL/USD", - "BALBULLUSDT": "BALBULL/USDT", - "BALHALFUSD": "BALHALF/USD", - "BALHEDGEUSD": "BALHEDGE/USD", - "BALUSD": "BAL/USD", - "BALUSDT": "BAL/USDT", - "BAND-PERP": "BAND-PERP", - "BANDUSD": "BAND/USD", - "BAO-PERP": "BAO-PERP", - "BAOUSD": "BAO/USD", - "BARUSD": "BAR/USD", - "BAT-PERP": "BAT-PERP", - "BATUSD": "BAT/USD", - "BB-0325": "BB-0325", - "BBUSD": "BB/USD", - "BCH-0325": "BCH-0325", - "BCH-PERP": "BCH-PERP", - "BCHBEARUSD": "BCHBEAR/USD", - "BCHBEARUSDT": "BCHBEAR/USDT", - "BCHBTC": "BCH/BTC", - "BCHBULLUSD": "BCHBULL/USD", - "BCHBULLUSDT": "BCHBULL/USDT", - "BCHHALFUSD": "BCHHALF/USD", - "BCHHEDGEUSD": "BCHHEDGE/USD", - "BCHUSD": "BCH/USD", - "BCHUSDT": "BCH/USDT", - "BEARSHITUSD": "BEARSHIT/USD", - "BEARUSD": "BEAR/USD", - "BEARUSDT": "BEAR/USDT", - "BICOUSD": "BICO/USD", - "BILI-0325": "BILI-0325", - "BILIUSD": "BILI/USD", - "BIT-PERP": "BIT-PERP", - "BITO-0325": "BITO-0325", - "BITOUSD": "BITO/USD", - "BITUSD": "BIT/USD", - "BITW-0325": "BITW-0325", - "BITWUSD": "BITW/USD", - "BLTUSD": "BLT/USD", - "BNB-0325": "BNB-0325", - "BNB-PERP": "BNB-PERP", - "BNBBEARUSD": "BNBBEAR/USD", - "BNBBEARUSDT": "BNBBEAR/USDT", - "BNBBTC": "BNB/BTC", - "BNBBULLUSD": "BNBBULL/USD", - "BNBBULLUSDT": "BNBBULL/USDT", - "BNBHALFUSD": "BNBHALF/USD", - "BNBHEDGEUSD": "BNBHEDGE/USD", - "BNBUSD": "BNB/USD", - "BNBUSDT": "BNB/USDT", - "BNT-PERP": "BNT-PERP", - "BNTUSD": "BNT/USD", - "BNTX-0325": "BNTX-0325", - "BNTXUSD": "BNTX/USD", - "BOBA-PERP": "BOBA-PERP", - "BOBAUSD": "BOBA/USD", - "BOLSONARO2022": "BOLSONARO2022", - "BRZ-PERP": "BRZ-PERP", - "BRZUSD": "BRZ/USD", - "BRZUSDT": "BRZ/USDT", - "BSV-0325": "BSV-0325", - "BSV-PERP": "BSV-PERP", - "BSVBEARUSD": "BSVBEAR/USD", - "BSVBEARUSDT": "BSVBEAR/USDT", - "BSVBULLUSD": "BSVBULL/USD", - "BSVBULLUSDT": "BSVBULL/USDT", - "BSVHALFUSD": "BSVHALF/USD", - "BSVHEDGEUSD": "BSVHEDGE/USD", - "BTC-0325": "BTC-0325", - "BTC-0624": "BTC-0624", - "BTC-MOVE-0303": "BTC-MOVE-0303", - "BTC-MOVE-0304": "BTC-MOVE-0304", - "BTC-MOVE-2022Q1": "BTC-MOVE-2022Q1", - "BTC-MOVE-2022Q2": "BTC-MOVE-2022Q2", - "BTC-MOVE-2022Q3": "BTC-MOVE-2022Q3", + "1INCH-0325": "1INCH-0325", + "1INCH-PERP": "1INCH-PERP", + "1INCHUSD": "1INCH/USD", + "AAPL-0325": "AAPL-0325", + "AAPLUSD": "AAPL/USD", + "AAVE-0325": "AAVE-0325", + "AAVE-PERP": "AAVE-PERP", + "AAVEUSD": "AAVE/USD", + "AAVEUSDT": "AAVE/USDT", + "ABNB-0325": "ABNB-0325", + "ABNBUSD": "ABNB/USD", + "ACB-0325": "ACB-0325", + "ACBUSD": "ACB/USD", + "ADA-0325": "ADA-0325", + "ADA-PERP": "ADA-PERP", + "ADABEARUSD": "ADABEAR/USD", + "ADABULLUSD": "ADABULL/USD", + "ADAHALFUSD": "ADAHALF/USD", + "ADAHEDGEUSD": "ADAHEDGE/USD", + "AGLD-PERP": "AGLD-PERP", + "AGLDUSD": "AGLD/USD", + "AKROUSD": "AKRO/USD", + "AKROUSDT": "AKRO/USDT", + "ALCX-PERP": "ALCX-PERP", + "ALCXUSD": "ALCX/USD", + "ALEPHUSD": "ALEPH/USD", + "ALGO-0325": "ALGO-0325", + "ALGO-PERP": "ALGO-PERP", + "ALGOBEARUSD": "ALGOBEAR/USD", + "ALGOBULLUSD": "ALGOBULL/USD", + "ALGOHALFUSD": "ALGOHALF/USD", + "ALGOHEDGEUSD": "ALGOHEDGE/USD", + "ALICE-PERP": "ALICE-PERP", + "ALICEUSD": "ALICE/USD", + "ALPHA-PERP": "ALPHA-PERP", + "ALPHAUSD": "ALPHA/USD", + "ALT-0325": "ALT-0325", + "ALT-PERP": "ALT-PERP", + "ALTBEARUSD": "ALTBEAR/USD", + "ALTBULLUSD": "ALTBULL/USD", + "ALTHALFUSD": "ALTHALF/USD", + "ALTHEDGEUSD": "ALTHEDGE/USD", + "AMC-0325": "AMC-0325", + "AMCUSD": "AMC/USD", + "AMD-0325": "AMD-0325", + "AMDUSD": "AMD/USD", + "AMPL-PERP": "AMPL-PERP", + "AMPLUSD": "AMPL/USD", + "AMPLUSDT": "AMPL/USDT", + "AMZN-0325": "AMZN-0325", + "AMZNUSD": "AMZN/USD", + "APHAUSD": "APHA/USD", + "AR-PERP": "AR-PERP", + "ARKK-0325": "ARKK-0325", + "ARKKUSD": "ARKK/USD", + "ASD-PERP": "ASD-PERP", + "ASDBEARUSD": "ASDBEAR/USD", + "ASDBEARUSDT": "ASDBEAR/USDT", + "ASDBULLUSD": "ASDBULL/USD", + "ASDBULLUSDT": "ASDBULL/USDT", + "ASDHALFUSD": "ASDHALF/USD", + "ASDHEDGEUSD": "ASDHEDGE/USD", + "ASDUSD": "ASD/USD", + "ATLAS-PERP": "ATLAS-PERP", + "ATLASUSD": "ATLAS/USD", + "ATOM-0325": "ATOM-0325", + "ATOM-PERP": "ATOM-PERP", + "ATOMBEARUSD": "ATOMBEAR/USD", + "ATOMBULLUSD": "ATOMBULL/USD", + "ATOMHALFUSD": "ATOMHALF/USD", + "ATOMHEDGEUSD": "ATOMHEDGE/USD", + "ATOMUSD": "ATOM/USD", + "ATOMUSDT": "ATOM/USDT", + "AUDIO-PERP": "AUDIO-PERP", + "AUDIOUSD": "AUDIO/USD", + "AUDIOUSDT": "AUDIO/USDT", + "AURYUSD": "AURY/USD", + "AVAX-0325": "AVAX-0325", + "AVAX-PERP": "AVAX-PERP", + "AVAXBTC": "AVAX/BTC", + "AVAXUSD": "AVAX/USD", + "AVAXUSDT": "AVAX/USDT", + "AXS-PERP": "AXS-PERP", + "AXSUSD": "AXS/USD", + "BABA-0325": "BABA-0325", + "BABAUSD": "BABA/USD", + "BADGER-PERP": "BADGER-PERP", + "BADGERUSD": "BADGER/USD", + "BAL-0325": "BAL-0325", + "BAL-PERP": "BAL-PERP", + "BALBEARUSD": "BALBEAR/USD", + "BALBEARUSDT": "BALBEAR/USDT", + "BALBULLUSD": "BALBULL/USD", + "BALBULLUSDT": "BALBULL/USDT", + "BALHALFUSD": "BALHALF/USD", + "BALHEDGEUSD": "BALHEDGE/USD", + "BALUSD": "BAL/USD", + "BALUSDT": "BAL/USDT", + "BAND-PERP": "BAND-PERP", + "BANDUSD": "BAND/USD", + "BAO-PERP": "BAO-PERP", + "BAOUSD": "BAO/USD", + "BARUSD": "BAR/USD", + "BAT-PERP": "BAT-PERP", + "BATUSD": "BAT/USD", + "BB-0325": "BB-0325", + "BBUSD": "BB/USD", + "BCH-0325": "BCH-0325", + "BCH-PERP": "BCH-PERP", + "BCHBEARUSD": "BCHBEAR/USD", + "BCHBEARUSDT": "BCHBEAR/USDT", + "BCHBTC": "BCH/BTC", + "BCHBULLUSD": "BCHBULL/USD", + "BCHBULLUSDT": "BCHBULL/USDT", + "BCHHALFUSD": "BCHHALF/USD", + "BCHHEDGEUSD": "BCHHEDGE/USD", + "BCHUSD": "BCH/USD", + "BCHUSDT": "BCH/USDT", + "BEARSHITUSD": "BEARSHIT/USD", + "BEARUSD": "BEAR/USD", + "BEARUSDT": "BEAR/USDT", + "BICOUSD": "BICO/USD", + "BILI-0325": "BILI-0325", + "BILIUSD": "BILI/USD", + "BIT-PERP": "BIT-PERP", + "BITO-0325": "BITO-0325", + "BITOUSD": "BITO/USD", + "BITUSD": "BIT/USD", + "BITW-0325": "BITW-0325", + "BITWUSD": "BITW/USD", + "BLTUSD": "BLT/USD", + "BNB-0325": "BNB-0325", + "BNB-PERP": "BNB-PERP", + "BNBBEARUSD": "BNBBEAR/USD", + "BNBBEARUSDT": "BNBBEAR/USDT", + "BNBBTC": "BNB/BTC", + "BNBBULLUSD": "BNBBULL/USD", + "BNBBULLUSDT": "BNBBULL/USDT", + "BNBHALFUSD": "BNBHALF/USD", + "BNBHEDGEUSD": "BNBHEDGE/USD", + "BNBUSD": "BNB/USD", + "BNBUSDT": "BNB/USDT", + "BNT-PERP": "BNT-PERP", + "BNTUSD": "BNT/USD", + "BNTX-0325": "BNTX-0325", + "BNTXUSD": "BNTX/USD", + "BOBA-PERP": "BOBA-PERP", + "BOBAUSD": "BOBA/USD", + "BOLSONARO2022": "BOLSONARO2022", + "BRZ-PERP": "BRZ-PERP", + "BRZUSD": "BRZ/USD", + "BRZUSDT": "BRZ/USDT", + "BSV-0325": "BSV-0325", + "BSV-PERP": "BSV-PERP", + "BSVBEARUSD": "BSVBEAR/USD", + "BSVBEARUSDT": "BSVBEAR/USDT", + "BSVBULLUSD": "BSVBULL/USD", + "BSVBULLUSDT": "BSVBULL/USDT", + "BSVHALFUSD": "BSVHALF/USD", + "BSVHEDGEUSD": "BSVHEDGE/USD", + "BTC-0325": "BTC-0325", + "BTC-0624": "BTC-0624", + "BTC-MOVE-0303": "BTC-MOVE-0303", + "BTC-MOVE-0304": "BTC-MOVE-0304", + "BTC-MOVE-2022Q1": "BTC-MOVE-2022Q1", + "BTC-MOVE-2022Q2": "BTC-MOVE-2022Q2", + "BTC-MOVE-2022Q3": "BTC-MOVE-2022Q3", "BTC-MOVE-WK-0304": "BTC-MOVE-WK-0304", "BTC-MOVE-WK-0311": "BTC-MOVE-WK-0311", "BTC-MOVE-WK-0318": "BTC-MOVE-WK-0318", "BTC-MOVE-WK-0325": "BTC-MOVE-WK-0325", - "BTC-PERP": "BTC-PERP", - "BTCBRZ": "BTC/BRZ", - "BTCEUR": "BTC/EUR", - "BTCTRYB": "BTC/TRYB", - "BTCUSD": "BTC/USD", - "BTCUSDT": "BTC/USDT", - "BTT-PERP": "BTT-PERP", - "BTTUSD": "BTT/USD", - "BULLSHITUSD": "BULLSHIT/USD", - "BULLUSD": "BULL/USD", - "BULLUSDT": "BULL/USDT", - "BVOLBTC": "BVOL/BTC", - "BVOLUSD": "BVOL/USD", - "BVOLUSDT": "BVOL/USDT", - "BYND-0325": "BYND-0325", - "BYNDUSD": "BYND/USD", - "C98-PERP": "C98-PERP", - "C98USD": "C98/USD", - "CADUSD": "CAD/USD", - "CAKE-PERP": "CAKE-PERP", - "CEL-0325": "CEL-0325", - "CEL-PERP": "CEL-PERP", - "CELBTC": "CEL/BTC", - "CELO-PERP": "CELO-PERP", - "CELUSD": "CEL/USD", - "CGC-0325": "CGC-0325", - "CGCUSD": "CGC/USD", - "CHR-PERP": "CHR-PERP", - "CHRUSD": "CHR/USD", - "CHZ-0325": "CHZ-0325", - "CHZ-PERP": "CHZ-PERP", - "CHZUSD": "CHZ/USD", - "CHZUSDT": "CHZ/USDT", - "CITYUSD": "CITY/USD", - "CLV-PERP": "CLV-PERP", - "CLVUSD": "CLV/USD", - "COINUSD": "COIN/USD", - "COMP-0325": "COMP-0325", - "COMP-PERP": "COMP-PERP", - "COMPBEARUSD": "COMPBEAR/USD", - "COMPBEARUSDT": "COMPBEAR/USDT", - "COMPBULLUSD": "COMPBULL/USD", - "COMPBULLUSDT": "COMPBULL/USDT", - "COMPHALFUSD": "COMPHALF/USD", - "COMPHEDGEUSD": "COMPHEDGE/USD", - "COMPUSD": "COMP/USD", - "COMPUSDT": "COMP/USDT", - "CONV-PERP": "CONV-PERP", - "CONVUSD": "CONV/USD", - "COPEUSD": "COPE/USD", - "CQTUSD": "CQT/USD", - "CREAM-PERP": "CREAM-PERP", - "CREAMUSD": "CREAM/USD", - "CREAMUSDT": "CREAM/USDT", - "CRO-PERP": "CRO-PERP", - "CRON-0325": "CRON-0325", - "CRONUSD": "CRON/USD", - "CROUSD": "CRO/USD", - "CRV-PERP": "CRV-PERP", - "CRVUSD": "CRV/USD", - "CUSDT-PERP": "CUSDT-PERP", - "CUSDTBEARUSD": "CUSDTBEAR/USD", - "CUSDTBEARUSDT": "CUSDTBEAR/USDT", - "CUSDTBULLUSD": "CUSDTBULL/USD", - "CUSDTBULLUSDT": "CUSDTBULL/USDT", - "CUSDTHALFUSD": "CUSDTHALF/USD", - "CUSDTHEDGEUSD": "CUSDTHEDGE/USD", - "CUSDTUSD": "CUSDT/USD", - "CUSDTUSDT": "CUSDT/USDT", - "CVC-PERP": "CVC-PERP", - "CVCUSD": "CVC/USD", - "DAIUSD": "DAI/USD", - "DAIUSDT": "DAI/USDT", - "DASH-PERP": "DASH-PERP", - "DAWN-PERP": "DAWN-PERP", - "DAWNUSD": "DAWN/USD", - "DEFI-0325": "DEFI-0325", - "DEFI-PERP": "DEFI-PERP", - "DEFIBEARUSD": "DEFIBEAR/USD", - "DEFIBEARUSDT": "DEFIBEAR/USDT", - "DEFIBULLUSD": "DEFIBULL/USD", - "DEFIBULLUSDT": "DEFIBULL/USDT", - "DEFIHALFUSD": "DEFIHALF/USD", - "DEFIHEDGEUSD": "DEFIHEDGE/USD", - "DENT-PERP": "DENT-PERP", - "DENTUSD": "DENT/USD", - "DFLUSD": "DFL/USD", - "DKNG-0325": "DKNG-0325", - "DKNGUSD": "DKNG/USD", - "DMGUSD": "DMG/USD", - "DMGUSDT": "DMG/USDT", - "DODO-PERP": "DODO-PERP", - "DODOUSD": "DODO/USD", - "DOGE-0325": "DOGE-0325", - "DOGE-PERP": "DOGE-PERP", - "DOGEBEAR2021USD": "DOGEBEAR2021/USD", - "DOGEBTC": "DOGE/BTC", - "DOGEBULLUSD": "DOGEBULL/USD", - "DOGEHALFUSD": "DOGEHALF/USD", - "DOGEHEDGEUSD": "DOGEHEDGE/USD", - "DOGEUSD": "DOGE/USD", - "DOGEUSDT": "DOGE/USDT", - "DOT-0325": "DOT-0325", - "DOT-PERP": "DOT-PERP", - "DOTBTC": "DOT/BTC", - "DOTUSD": "DOT/USD", - "DOTUSDT": "DOT/USDT", - "DRGN-0325": "DRGN-0325", - "DRGN-PERP": "DRGN-PERP", - "DRGNBEARUSD": "DRGNBEAR/USD", - "DRGNBULLUSD": "DRGNBULL/USD", - "DRGNHALFUSD": "DRGNHALF/USD", - "DRGNHEDGEUSD": "DRGNHEDGE/USD", - "DYDX-PERP": "DYDX-PERP", - "DYDXUSD": "DYDX/USD", - "EDEN-0325": "EDEN-0325", - "EDEN-PERP": "EDEN-PERP", - "EDENUSD": "EDEN/USD", - "EGLD-PERP": "EGLD-PERP", - "EMBUSD": "EMB/USD", - "ENJ-PERP": "ENJ-PERP", - "ENJUSD": "ENJ/USD", - "ENS-PERP": "ENS-PERP", - "ENSUSD": "ENS/USD", - "EOS-0325": "EOS-0325", - "EOS-PERP": "EOS-PERP", - "EOSBEARUSD": "EOSBEAR/USD", - "EOSBEARUSDT": "EOSBEAR/USDT", - "EOSBULLUSD": "EOSBULL/USD", - "EOSBULLUSDT": "EOSBULL/USDT", - "EOSHALFUSD": "EOSHALF/USD", - "EOSHEDGEUSD": "EOSHEDGE/USD", - "ETC-PERP": "ETC-PERP", - "ETCBEARUSD": "ETCBEAR/USD", - "ETCBULLUSD": "ETCBULL/USD", - "ETCHALFUSD": "ETCHALF/USD", - "ETCHEDGEUSD": "ETCHEDGE/USD", - "ETH-0325": "ETH-0325", - "ETH-0624": "ETH-0624", - "ETH-PERP": "ETH-PERP", - "ETHBEARUSD": "ETHBEAR/USD", - "ETHBEARUSDT": "ETHBEAR/USDT", - "ETHBRZ": "ETH/BRZ", - "ETHBTC": "ETH/BTC", - "ETHBULLUSD": "ETHBULL/USD", - "ETHBULLUSDT": "ETHBULL/USDT", - "ETHE-0325": "ETHE-0325", - "ETHEUR": "ETH/EUR", - "ETHEUSD": "ETHE/USD", - "ETHHALFUSD": "ETHHALF/USD", - "ETHHEDGEUSD": "ETHHEDGE/USD", - "ETHUSD": "ETH/USD", - "ETHUSDT": "ETH/USDT", - "EURTEUR": "EURT/EUR", - "EURTUSD": "EURT/USD", - "EURTUSDT": "EURT/USDT", - "EURUSD": "EUR/USD", - "EXCH-0325": "EXCH-0325", - "EXCH-PERP": "EXCH-PERP", - "EXCHBEARUSD": "EXCHBEAR/USD", - "EXCHBULLUSD": "EXCHBULL/USD", - "EXCHHALFUSD": "EXCHHALF/USD", - "EXCHHEDGEUSD": "EXCHHEDGE/USD", - "FB-0325": "FB-0325", - "FBUSD": "FB/USD", - "FIDA-PERP": "FIDA-PERP", - "FIDAUSD": "FIDA/USD", - "FIDAUSDT": "FIDA/USDT", - "FIL-0325": "FIL-0325", - "FIL-PERP": "FIL-PERP", - "FLM-PERP": "FLM-PERP", - "FLOW-PERP": "FLOW-PERP", - "FRONTUSD": "FRONT/USD", - "FRONTUSDT": "FRONT/USDT", - "FTM-PERP": "FTM-PERP", - "FTMUSD": "FTM/USD", - "FTT-PERP": "FTT-PERP", - "FTTBTC": "FTT/BTC", - "FTTUSD": "FTT/USD", - "FTTUSDT": "FTT/USDT", - "GALA-PERP": "GALA-PERP", - "GALAUSD": "GALA/USD", - "GALUSD": "GAL/USD", - "GARIUSD": "GARI/USD", - "GBPUSD": "GBP/USD", - "GBTC-0325": "GBTC-0325", - "GBTCUSD": "GBTC/USD", - "GDX-0325": "GDX-0325", - "GDXJ-0325": "GDXJ-0325", - "GDXJUSD": "GDXJ/USD", - "GDXUSD": "GDX/USD", - "GENEUSD": "GENE/USD", - "GLD-0325": "GLD-0325", - "GLDUSD": "GLD/USD", - "GLXYUSD": "GLXY/USD", - "GME-0325": "GME-0325", - "GMEUSD": "GME/USD", - "GODSUSD": "GODS/USD", - "GOGUSD": "GOG/USD", - "GOOGL-0325": "GOOGL-0325", - "GOOGLUSD": "GOOGL/USD", - "GRT-0325": "GRT-0325", - "GRT-PERP": "GRT-PERP", - "GRTBEARUSD": "GRTBEAR/USD", - "GRTBULLUSD": "GRTBULL/USD", - "GRTUSD": "GRT/USD", - "GTUSD": "GT/USD", - "HALFSHITUSD": "HALFSHIT/USD", - "HALFUSD": "HALF/USD", - "HBAR-PERP": "HBAR-PERP", - "HEDGESHITUSD": "HEDGESHIT/USD", - "HEDGEUSD": "HEDGE/USD", - "HGETUSD": "HGET/USD", - "HGETUSDT": "HGET/USDT", - "HMTUSD": "HMT/USD", - "HNT-PERP": "HNT-PERP", - "HNTUSD": "HNT/USD", - "HNTUSDT": "HNT/USDT", - "HOLY-PERP": "HOLY-PERP", - "HOLYUSD": "HOLY/USD", - "HOODUSD": "HOOD/USD", - "HOT-PERP": "HOT-PERP", - "HT-PERP": "HT-PERP", - "HTBEARUSD": "HTBEAR/USD", - "HTBULLUSD": "HTBULL/USD", - "HTHALFUSD": "HTHALF/USD", - "HTHEDGEUSD": "HTHEDGE/USD", - "HTUSD": "HT/USD", - "HUM-PERP": "HUM-PERP", - "HUMUSD": "HUM/USD", - "HXROUSD": "HXRO/USD", - "HXROUSDT": "HXRO/USDT", - "IBVOLBTC": "IBVOL/BTC", - "IBVOLUSD": "IBVOL/USD", - "IBVOLUSDT": "IBVOL/USDT", - "ICP-PERP": "ICP-PERP", - "ICX-PERP": "ICX-PERP", - "IMX-PERP": "IMX-PERP", - "IMXUSD": "IMX/USD", - "INTERUSD": "INTER/USD", - "IOTA-PERP": "IOTA-PERP", - "JETUSD": "JET/USD", - "JOEUSD": "JOE/USD", - "JSTUSD": "JST/USD", - "KAVA-PERP": "KAVA-PERP", - "KBTT-PERP": "KBTT-PERP", - "KBTTUSD": "KBTT/USD", - "KIN-PERP": "KIN-PERP", - "KINUSD": "KIN/USD", - "KNC-PERP": "KNC-PERP", - "KNCBEARUSD": "KNCBEAR/USD", - "KNCBEARUSDT": "KNCBEAR/USDT", - "KNCBULLUSD": "KNCBULL/USD", - "KNCBULLUSDT": "KNCBULL/USDT", - "KNCHALFUSD": "KNCHALF/USD", - "KNCHEDGEUSD": "KNCHEDGE/USD", - "KNCUSD": "KNC/USD", - "KNCUSDT": "KNC/USDT", - "KSHIB-PERP": "KSHIB-PERP", - "KSHIBUSD": "KSHIB/USD", - "KSM-PERP": "KSM-PERP", - "KSOS-PERP": "KSOS-PERP", - "KSOSUSD": "KSOS/USD", - "LEO-PERP": "LEO-PERP", - "LEOBEARUSD": "LEOBEAR/USD", - "LEOBULLUSD": "LEOBULL/USD", - "LEOHALFUSD": "LEOHALF/USD", - "LEOHEDGEUSD": "LEOHEDGE/USD", - "LEOUSD": "LEO/USD", - "LINA-PERP": "LINA-PERP", - "LINAUSD": "LINA/USD", - "LINK-0325": "LINK-0325", - "LINK-PERP": "LINK-PERP", - "LINKBEARUSD": "LINKBEAR/USD", - "LINKBEARUSDT": "LINKBEAR/USDT", - "LINKBTC": "LINK/BTC", - "LINKBULLUSD": "LINKBULL/USD", - "LINKBULLUSDT": "LINKBULL/USDT", - "LINKHALFUSD": "LINKHALF/USD", - "LINKHEDGEUSD": "LINKHEDGE/USD", - "LINKUSD": "LINK/USD", - "LINKUSDT": "LINK/USDT", - "LOOKS-PERP": "LOOKS-PERP", - "LOOKSUSD": "LOOKS/USD", - "LRC-PERP": "LRC-PERP", - "LRCUSD": "LRC/USD", - "LTC-0325": "LTC-0325", - "LTC-PERP": "LTC-PERP", - "LTCBEARUSD": "LTCBEAR/USD", - "LTCBEARUSDT": "LTCBEAR/USDT", - "LTCBTC": "LTC/BTC", - "LTCBULLUSD": "LTCBULL/USD", - "LTCBULLUSDT": "LTCBULL/USDT", - "LTCHALFUSD": "LTCHALF/USD", - "LTCHEDGEUSD": "LTCHEDGE/USD", - "LTCUSD": "LTC/USD", - "LTCUSDT": "LTC/USDT", - "LUAUSD": "LUA/USD", - "LUAUSDT": "LUA/USDT", - "LUNA-PERP": "LUNA-PERP", - "LUNAUSD": "LUNA/USD", - "LUNAUSDT": "LUNA/USDT", - "MANA-PERP": "MANA-PERP", - "MANAUSD": "MANA/USD", - "MAPS-PERP": "MAPS-PERP", - "MAPSUSD": "MAPS/USD", - "MAPSUSDT": "MAPS/USDT", - "MATHUSD": "MATH/USD", - "MATHUSDT": "MATH/USDT", - "MATIC-PERP": "MATIC-PERP", + "BTC-PERP": "BTC-PERP", + "BTCBRZ": "BTC/BRZ", + "BTCEUR": "BTC/EUR", + "BTCTRYB": "BTC/TRYB", + "BTCUSD": "BTC/USD", + "BTCUSDT": "BTC/USDT", + "BTT-PERP": "BTT-PERP", + "BTTUSD": "BTT/USD", + "BULLSHITUSD": "BULLSHIT/USD", + "BULLUSD": "BULL/USD", + "BULLUSDT": "BULL/USDT", + "BVOLBTC": "BVOL/BTC", + "BVOLUSD": "BVOL/USD", + "BVOLUSDT": "BVOL/USDT", + "BYND-0325": "BYND-0325", + "BYNDUSD": "BYND/USD", + "C98-PERP": "C98-PERP", + "C98USD": "C98/USD", + "CADUSD": "CAD/USD", + "CAKE-PERP": "CAKE-PERP", + "CEL-0325": "CEL-0325", + "CEL-PERP": "CEL-PERP", + "CELBTC": "CEL/BTC", + "CELO-PERP": "CELO-PERP", + "CELUSD": "CEL/USD", + "CGC-0325": "CGC-0325", + "CGCUSD": "CGC/USD", + "CHR-PERP": "CHR-PERP", + "CHRUSD": "CHR/USD", + "CHZ-0325": "CHZ-0325", + "CHZ-PERP": "CHZ-PERP", + "CHZUSD": "CHZ/USD", + "CHZUSDT": "CHZ/USDT", + "CITYUSD": "CITY/USD", + "CLV-PERP": "CLV-PERP", + "CLVUSD": "CLV/USD", + "COINUSD": "COIN/USD", + "COMP-0325": "COMP-0325", + "COMP-PERP": "COMP-PERP", + "COMPBEARUSD": "COMPBEAR/USD", + "COMPBEARUSDT": "COMPBEAR/USDT", + "COMPBULLUSD": "COMPBULL/USD", + "COMPBULLUSDT": "COMPBULL/USDT", + "COMPHALFUSD": "COMPHALF/USD", + "COMPHEDGEUSD": "COMPHEDGE/USD", + "COMPUSD": "COMP/USD", + "COMPUSDT": "COMP/USDT", + "CONV-PERP": "CONV-PERP", + "CONVUSD": "CONV/USD", + "COPEUSD": "COPE/USD", + "CQTUSD": "CQT/USD", + "CREAM-PERP": "CREAM-PERP", + "CREAMUSD": "CREAM/USD", + "CREAMUSDT": "CREAM/USDT", + "CRO-PERP": "CRO-PERP", + "CRON-0325": "CRON-0325", + "CRONUSD": "CRON/USD", + "CROUSD": "CRO/USD", + "CRV-PERP": "CRV-PERP", + "CRVUSD": "CRV/USD", + "CUSDT-PERP": "CUSDT-PERP", + "CUSDTBEARUSD": "CUSDTBEAR/USD", + "CUSDTBEARUSDT": "CUSDTBEAR/USDT", + "CUSDTBULLUSD": "CUSDTBULL/USD", + "CUSDTBULLUSDT": "CUSDTBULL/USDT", + "CUSDTHALFUSD": "CUSDTHALF/USD", + "CUSDTHEDGEUSD": "CUSDTHEDGE/USD", + "CUSDTUSD": "CUSDT/USD", + "CUSDTUSDT": "CUSDT/USDT", + "CVC-PERP": "CVC-PERP", + "CVCUSD": "CVC/USD", + "DAIUSD": "DAI/USD", + "DAIUSDT": "DAI/USDT", + "DASH-PERP": "DASH-PERP", + "DAWN-PERP": "DAWN-PERP", + "DAWNUSD": "DAWN/USD", + "DEFI-0325": "DEFI-0325", + "DEFI-PERP": "DEFI-PERP", + "DEFIBEARUSD": "DEFIBEAR/USD", + "DEFIBEARUSDT": "DEFIBEAR/USDT", + "DEFIBULLUSD": "DEFIBULL/USD", + "DEFIBULLUSDT": "DEFIBULL/USDT", + "DEFIHALFUSD": "DEFIHALF/USD", + "DEFIHEDGEUSD": "DEFIHEDGE/USD", + "DENT-PERP": "DENT-PERP", + "DENTUSD": "DENT/USD", + "DFLUSD": "DFL/USD", + "DKNG-0325": "DKNG-0325", + "DKNGUSD": "DKNG/USD", + "DMGUSD": "DMG/USD", + "DMGUSDT": "DMG/USDT", + "DODO-PERP": "DODO-PERP", + "DODOUSD": "DODO/USD", + "DOGE-0325": "DOGE-0325", + "DOGE-PERP": "DOGE-PERP", + "DOGEBEAR2021USD": "DOGEBEAR2021/USD", + "DOGEBTC": "DOGE/BTC", + "DOGEBULLUSD": "DOGEBULL/USD", + "DOGEHALFUSD": "DOGEHALF/USD", + "DOGEHEDGEUSD": "DOGEHEDGE/USD", + "DOGEUSD": "DOGE/USD", + "DOGEUSDT": "DOGE/USDT", + "DOT-0325": "DOT-0325", + "DOT-PERP": "DOT-PERP", + "DOTBTC": "DOT/BTC", + "DOTUSD": "DOT/USD", + "DOTUSDT": "DOT/USDT", + "DRGN-0325": "DRGN-0325", + "DRGN-PERP": "DRGN-PERP", + "DRGNBEARUSD": "DRGNBEAR/USD", + "DRGNBULLUSD": "DRGNBULL/USD", + "DRGNHALFUSD": "DRGNHALF/USD", + "DRGNHEDGEUSD": "DRGNHEDGE/USD", + "DYDX-PERP": "DYDX-PERP", + "DYDXUSD": "DYDX/USD", + "EDEN-0325": "EDEN-0325", + "EDEN-PERP": "EDEN-PERP", + "EDENUSD": "EDEN/USD", + "EGLD-PERP": "EGLD-PERP", + "EMBUSD": "EMB/USD", + "ENJ-PERP": "ENJ-PERP", + "ENJUSD": "ENJ/USD", + "ENS-PERP": "ENS-PERP", + "ENSUSD": "ENS/USD", + "EOS-0325": "EOS-0325", + "EOS-PERP": "EOS-PERP", + "EOSBEARUSD": "EOSBEAR/USD", + "EOSBEARUSDT": "EOSBEAR/USDT", + "EOSBULLUSD": "EOSBULL/USD", + "EOSBULLUSDT": "EOSBULL/USDT", + "EOSHALFUSD": "EOSHALF/USD", + "EOSHEDGEUSD": "EOSHEDGE/USD", + "ETC-PERP": "ETC-PERP", + "ETCBEARUSD": "ETCBEAR/USD", + "ETCBULLUSD": "ETCBULL/USD", + "ETCHALFUSD": "ETCHALF/USD", + "ETCHEDGEUSD": "ETCHEDGE/USD", + "ETH-0325": "ETH-0325", + "ETH-0624": "ETH-0624", + "ETH-PERP": "ETH-PERP", + "ETHBEARUSD": "ETHBEAR/USD", + "ETHBEARUSDT": "ETHBEAR/USDT", + "ETHBRZ": "ETH/BRZ", + "ETHBTC": "ETH/BTC", + "ETHBULLUSD": "ETHBULL/USD", + "ETHBULLUSDT": "ETHBULL/USDT", + "ETHE-0325": "ETHE-0325", + "ETHEUR": "ETH/EUR", + "ETHEUSD": "ETHE/USD", + "ETHHALFUSD": "ETHHALF/USD", + "ETHHEDGEUSD": "ETHHEDGE/USD", + "ETHUSD": "ETH/USD", + "ETHUSDT": "ETH/USDT", + "EURTEUR": "EURT/EUR", + "EURTUSD": "EURT/USD", + "EURTUSDT": "EURT/USDT", + "EURUSD": "EUR/USD", + "EXCH-0325": "EXCH-0325", + "EXCH-PERP": "EXCH-PERP", + "EXCHBEARUSD": "EXCHBEAR/USD", + "EXCHBULLUSD": "EXCHBULL/USD", + "EXCHHALFUSD": "EXCHHALF/USD", + "EXCHHEDGEUSD": "EXCHHEDGE/USD", + "FB-0325": "FB-0325", + "FBUSD": "FB/USD", + "FIDA-PERP": "FIDA-PERP", + "FIDAUSD": "FIDA/USD", + "FIDAUSDT": "FIDA/USDT", + "FIL-0325": "FIL-0325", + "FIL-PERP": "FIL-PERP", + "FLM-PERP": "FLM-PERP", + "FLOW-PERP": "FLOW-PERP", + "FRONTUSD": "FRONT/USD", + "FRONTUSDT": "FRONT/USDT", + "FTM-PERP": "FTM-PERP", + "FTMUSD": "FTM/USD", + "FTT-PERP": "FTT-PERP", + "FTTBTC": "FTT/BTC", + "FTTUSD": "FTT/USD", + "FTTUSDT": "FTT/USDT", + "GALA-PERP": "GALA-PERP", + "GALAUSD": "GALA/USD", + "GALUSD": "GAL/USD", + "GARIUSD": "GARI/USD", + "GBPUSD": "GBP/USD", + "GBTC-0325": "GBTC-0325", + "GBTCUSD": "GBTC/USD", + "GDX-0325": "GDX-0325", + "GDXJ-0325": "GDXJ-0325", + "GDXJUSD": "GDXJ/USD", + "GDXUSD": "GDX/USD", + "GENEUSD": "GENE/USD", + "GLD-0325": "GLD-0325", + "GLDUSD": "GLD/USD", + "GLXYUSD": "GLXY/USD", + "GME-0325": "GME-0325", + "GMEUSD": "GME/USD", + "GODSUSD": "GODS/USD", + "GOGUSD": "GOG/USD", + "GOOGL-0325": "GOOGL-0325", + "GOOGLUSD": "GOOGL/USD", + "GRT-0325": "GRT-0325", + "GRT-PERP": "GRT-PERP", + "GRTBEARUSD": "GRTBEAR/USD", + "GRTBULLUSD": "GRTBULL/USD", + "GRTUSD": "GRT/USD", + "GTUSD": "GT/USD", + "HALFSHITUSD": "HALFSHIT/USD", + "HALFUSD": "HALF/USD", + "HBAR-PERP": "HBAR-PERP", + "HEDGESHITUSD": "HEDGESHIT/USD", + "HEDGEUSD": "HEDGE/USD", + "HGETUSD": "HGET/USD", + "HGETUSDT": "HGET/USDT", + "HMTUSD": "HMT/USD", + "HNT-PERP": "HNT-PERP", + "HNTUSD": "HNT/USD", + "HNTUSDT": "HNT/USDT", + "HOLY-PERP": "HOLY-PERP", + "HOLYUSD": "HOLY/USD", + "HOODUSD": "HOOD/USD", + "HOT-PERP": "HOT-PERP", + "HT-PERP": "HT-PERP", + "HTBEARUSD": "HTBEAR/USD", + "HTBULLUSD": "HTBULL/USD", + "HTHALFUSD": "HTHALF/USD", + "HTHEDGEUSD": "HTHEDGE/USD", + "HTUSD": "HT/USD", + "HUM-PERP": "HUM-PERP", + "HUMUSD": "HUM/USD", + "HXROUSD": "HXRO/USD", + "HXROUSDT": "HXRO/USDT", + "IBVOLBTC": "IBVOL/BTC", + "IBVOLUSD": "IBVOL/USD", + "IBVOLUSDT": "IBVOL/USDT", + "ICP-PERP": "ICP-PERP", + "ICX-PERP": "ICX-PERP", + "IMX-PERP": "IMX-PERP", + "IMXUSD": "IMX/USD", + "INTERUSD": "INTER/USD", + "IOTA-PERP": "IOTA-PERP", + "JETUSD": "JET/USD", + "JOEUSD": "JOE/USD", + "JSTUSD": "JST/USD", + "KAVA-PERP": "KAVA-PERP", + "KBTT-PERP": "KBTT-PERP", + "KBTTUSD": "KBTT/USD", + "KIN-PERP": "KIN-PERP", + "KINUSD": "KIN/USD", + "KNC-PERP": "KNC-PERP", + "KNCBEARUSD": "KNCBEAR/USD", + "KNCBEARUSDT": "KNCBEAR/USDT", + "KNCBULLUSD": "KNCBULL/USD", + "KNCBULLUSDT": "KNCBULL/USDT", + "KNCHALFUSD": "KNCHALF/USD", + "KNCHEDGEUSD": "KNCHEDGE/USD", + "KNCUSD": "KNC/USD", + "KNCUSDT": "KNC/USDT", + "KSHIB-PERP": "KSHIB-PERP", + "KSHIBUSD": "KSHIB/USD", + "KSM-PERP": "KSM-PERP", + "KSOS-PERP": "KSOS-PERP", + "KSOSUSD": "KSOS/USD", + "LEO-PERP": "LEO-PERP", + "LEOBEARUSD": "LEOBEAR/USD", + "LEOBULLUSD": "LEOBULL/USD", + "LEOHALFUSD": "LEOHALF/USD", + "LEOHEDGEUSD": "LEOHEDGE/USD", + "LEOUSD": "LEO/USD", + "LINA-PERP": "LINA-PERP", + "LINAUSD": "LINA/USD", + "LINK-0325": "LINK-0325", + "LINK-PERP": "LINK-PERP", + "LINKBEARUSD": "LINKBEAR/USD", + "LINKBEARUSDT": "LINKBEAR/USDT", + "LINKBTC": "LINK/BTC", + "LINKBULLUSD": "LINKBULL/USD", + "LINKBULLUSDT": "LINKBULL/USDT", + "LINKHALFUSD": "LINKHALF/USD", + "LINKHEDGEUSD": "LINKHEDGE/USD", + "LINKUSD": "LINK/USD", + "LINKUSDT": "LINK/USDT", + "LOOKS-PERP": "LOOKS-PERP", + "LOOKSUSD": "LOOKS/USD", + "LRC-PERP": "LRC-PERP", + "LRCUSD": "LRC/USD", + "LTC-0325": "LTC-0325", + "LTC-PERP": "LTC-PERP", + "LTCBEARUSD": "LTCBEAR/USD", + "LTCBEARUSDT": "LTCBEAR/USDT", + "LTCBTC": "LTC/BTC", + "LTCBULLUSD": "LTCBULL/USD", + "LTCBULLUSDT": "LTCBULL/USDT", + "LTCHALFUSD": "LTCHALF/USD", + "LTCHEDGEUSD": "LTCHEDGE/USD", + "LTCUSD": "LTC/USD", + "LTCUSDT": "LTC/USDT", + "LUAUSD": "LUA/USD", + "LUAUSDT": "LUA/USDT", + "LUNA-PERP": "LUNA-PERP", + "LUNAUSD": "LUNA/USD", + "LUNAUSDT": "LUNA/USDT", + "MANA-PERP": "MANA-PERP", + "MANAUSD": "MANA/USD", + "MAPS-PERP": "MAPS-PERP", + "MAPSUSD": "MAPS/USD", + "MAPSUSDT": "MAPS/USDT", + "MATHUSD": "MATH/USD", + "MATHUSDT": "MATH/USDT", + "MATIC-PERP": "MATIC-PERP", "MATICBEAR2021USD": "MATICBEAR2021/USD", - "MATICBTC": "MATIC/BTC", - "MATICBULLUSD": "MATICBULL/USD", - "MATICHALFUSD": "MATICHALF/USD", - "MATICHEDGEUSD": "MATICHEDGE/USD", - "MATICUSD": "MATIC/USD", - "MBSUSD": "MBS/USD", - "MCB-PERP": "MCB-PERP", - "MCBUSD": "MCB/USD", - "MEDIA-PERP": "MEDIA-PERP", - "MEDIAUSD": "MEDIA/USD", - "MER-PERP": "MER-PERP", - "MERUSD": "MER/USD", - "MID-0325": "MID-0325", - "MID-PERP": "MID-PERP", - "MIDBEARUSD": "MIDBEAR/USD", - "MIDBULLUSD": "MIDBULL/USD", - "MIDHALFUSD": "MIDHALF/USD", - "MIDHEDGEUSD": "MIDHEDGE/USD", - "MINA-PERP": "MINA-PERP", - "MKR-PERP": "MKR-PERP", - "MKRBEARUSD": "MKRBEAR/USD", - "MKRBULLUSD": "MKRBULL/USD", - "MKRUSD": "MKR/USD", - "MKRUSDT": "MKR/USDT", - "MNGO-PERP": "MNGO-PERP", - "MNGOUSD": "MNGO/USD", - "MOBUSD": "MOB/USD", - "MOBUSDT": "MOB/USDT", - "MRNA-0325": "MRNA-0325", - "MRNAUSD": "MRNA/USD", - "MSOLUSD": "MSOL/USD", - "MSTR-0325": "MSTR-0325", - "MSTRUSD": "MSTR/USD", - "MTA-PERP": "MTA-PERP", - "MTAUSD": "MTA/USD", - "MTAUSDT": "MTA/USDT", - "MTL-PERP": "MTL-PERP", - "MTLUSD": "MTL/USD", - "MVDA10-PERP": "MVDA10-PERP", - "MVDA25-PERP": "MVDA25-PERP", - "NEAR-PERP": "NEAR-PERP", - "NEO-PERP": "NEO-PERP", - "NEXOUSD": "NEXO/USD", - "NFLX-0325": "NFLX-0325", - "NFLXUSD": "NFLX/USD", - "NIO-0325": "NIO-0325", - "NIOUSD": "NIO/USD", - "NOK-0325": "NOK-0325", - "NOKUSD": "NOK/USD", - "NVDA-0325": "NVDA-0325", - "NVDAUSD": "NVDA/USD", - "OKB-0325": "OKB-0325", - "OKB-PERP": "OKB-PERP", - "OKBBEARUSD": "OKBBEAR/USD", - "OKBBULLUSD": "OKBBULL/USD", - "OKBHALFUSD": "OKBHALF/USD", - "OKBHEDGEUSD": "OKBHEDGE/USD", - "OKBUSD": "OKB/USD", - "OMG-0325": "OMG-0325", - "OMG-PERP": "OMG-PERP", - "OMGUSD": "OMG/USD", - "ONE-PERP": "ONE-PERP", - "ONT-PERP": "ONT-PERP", - "ORBS-PERP": "ORBS-PERP", - "ORBSUSD": "ORBS/USD", - "OXY-PERP": "OXY-PERP", - "OXYUSD": "OXY/USD", - "OXYUSDT": "OXY/USDT", - "PAXG-PERP": "PAXG-PERP", - "PAXGBEARUSD": "PAXGBEAR/USD", - "PAXGBULLUSD": "PAXGBULL/USD", - "PAXGHALFUSD": "PAXGHALF/USD", - "PAXGHEDGEUSD": "PAXGHEDGE/USD", - "PAXGUSD": "PAXG/USD", - "PAXGUSDT": "PAXG/USDT", - "PENN-0325": "PENN-0325", - "PENNUSD": "PENN/USD", - "PEOPLE-PERP": "PEOPLE-PERP", - "PEOPLEUSD": "PEOPLE/USD", - "PERP-PERP": "PERP-PERP", - "PERPUSD": "PERP/USD", - "PFE-0325": "PFE-0325", - "PFEUSD": "PFE/USD", - "POLIS-PERP": "POLIS-PERP", - "POLISUSD": "POLIS/USD", - "PORTUSD": "PORT/USD", - "PRISMUSD": "PRISM/USD", - "PRIV-0325": "PRIV-0325", - "PRIV-PERP": "PRIV-PERP", - "PRIVBEARUSD": "PRIVBEAR/USD", - "PRIVBULLUSD": "PRIVBULL/USD", - "PRIVHALFUSD": "PRIVHALF/USD", - "PRIVHEDGEUSD": "PRIVHEDGE/USD", - "PROM-PERP": "PROM-PERP", - "PROMUSD": "PROM/USD", - "PSGUSD": "PSG/USD", - "PSYUSD": "PSY/USD", - "PTUUSD": "PTU/USD", - "PUNDIX-PERP": "PUNDIX-PERP", - "PUNDIXUSD": "PUNDIX/USD", - "PYPL-0325": "PYPL-0325", - "PYPLUSD": "PYPL/USD", - "QIUSD": "QI/USD", - "QTUM-PERP": "QTUM-PERP", - "RAMP-PERP": "RAMP-PERP", - "RAMPUSD": "RAMP/USD", - "RAY-PERP": "RAY-PERP", - "RAYUSD": "RAY/USD", - "REALUSD": "REAL/USD", - "REEF-0325": "REEF-0325", - "REEF-PERP": "REEF-PERP", - "REEFUSD": "REEF/USD", - "REN-PERP": "REN-PERP", - "RENUSD": "REN/USD", - "RNDR-PERP": "RNDR-PERP", - "RNDRUSD": "RNDR/USD", - "RON-PERP": "RON-PERP", - "ROOK-PERP": "ROOK-PERP", - "ROOKUSD": "ROOK/USD", - "ROOKUSDT": "ROOK/USDT", - "ROSE-PERP": "ROSE-PERP", - "RSR-PERP": "RSR-PERP", - "RSRUSD": "RSR/USD", - "RUNE-PERP": "RUNE-PERP", - "RUNEUSD": "RUNE/USD", - "RUNEUSDT": "RUNE/USDT", - "SAND-PERP": "SAND-PERP", - "SANDUSD": "SAND/USD", - "SC-PERP": "SC-PERP", - "SCRT-PERP": "SCRT-PERP", - "SECO-PERP": "SECO-PERP", - "SECOUSD": "SECO/USD", - "SHIB-PERP": "SHIB-PERP", - "SHIBUSD": "SHIB/USD", - "SHIT-0325": "SHIT-0325", - "SHIT-PERP": "SHIT-PERP", - "SKL-PERP": "SKL-PERP", - "SKLUSD": "SKL/USD", - "SLNDUSD": "SLND/USD", - "SLP-PERP": "SLP-PERP", - "SLPUSD": "SLP/USD", - "SLRSUSD": "SLRS/USD", - "SLV-0325": "SLV-0325", - "SLVUSD": "SLV/USD", - "SNX-PERP": "SNX-PERP", - "SNXUSD": "SNX/USD", - "SNYUSD": "SNY/USD", - "SOL-0325": "SOL-0325", - "SOL-PERP": "SOL-PERP", - "SOLBTC": "SOL/BTC", - "SOLUSD": "SOL/USD", - "SOLUSDT": "SOL/USDT", - "SOS-PERP": "SOS-PERP", - "SOSUSD": "SOS/USD", - "SPELL-PERP": "SPELL-PERP", - "SPELLUSD": "SPELL/USD", - "SPY-0325": "SPY-0325", - "SPYUSD": "SPY/USD", - "SQ-0325": "SQ-0325", - "SQUSD": "SQ/USD", - "SRM-PERP": "SRM-PERP", - "SRMUSD": "SRM/USD", - "SRMUSDT": "SRM/USDT", - "SRN-PERP": "SRN-PERP", - "STARSUSD": "STARS/USD", - "STEP-PERP": "STEP-PERP", - "STEPUSD": "STEP/USD", - "STETHUSD": "STETH/USD", - "STMX-PERP": "STMX-PERP", - "STMXUSD": "STMX/USD", - "STORJ-PERP": "STORJ-PERP", - "STORJUSD": "STORJ/USD", - "STSOLUSD": "STSOL/USD", - "STX-PERP": "STX-PERP", - "SUNUSD": "SUN/USD", - "SUSHI-0325": "SUSHI-0325", - "SUSHI-PERP": "SUSHI-PERP", - "SUSHIBEARUSD": "SUSHIBEAR/USD", - "SUSHIBTC": "SUSHI/BTC", - "SUSHIBULLUSD": "SUSHIBULL/USD", - "SUSHIUSD": "SUSHI/USD", - "SUSHIUSDT": "SUSHI/USDT", - "SXP-0325": "SXP-0325", - "SXP-PERP": "SXP-PERP", - "SXPBEARUSD": "SXPBEAR/USD", - "SXPBTC": "SXP/BTC", - "SXPBULLUSD": "SXPBULL/USD", - "SXPHALFUSD": "SXPHALF/USD", - "SXPHALFUSDT": "SXPHALF/USDT", - "SXPHEDGEUSD": "SXPHEDGE/USD", - "SXPUSD": "SXP/USD", - "SXPUSDT": "SXP/USDT", - "THETA-0325": "THETA-0325", - "THETA-PERP": "THETA-PERP", - "THETABEARUSD": "THETABEAR/USD", - "THETABULLUSD": "THETABULL/USD", - "THETAHALFUSD": "THETAHALF/USD", - "THETAHEDGEUSD": "THETAHEDGE/USD", - "TLM-PERP": "TLM-PERP", - "TLMUSD": "TLM/USD", - "TLRY-0325": "TLRY-0325", - "TLRYUSD": "TLRY/USD", - "TOMO-PERP": "TOMO-PERP", - "TOMOBEAR2021USD": "TOMOBEAR2021/USD", - "TOMOBULLUSD": "TOMOBULL/USD", - "TOMOHALFUSD": "TOMOHALF/USD", - "TOMOHEDGEUSD": "TOMOHEDGE/USD", - "TOMOUSD": "TOMO/USD", - "TOMOUSDT": "TOMO/USDT", - "TONCOIN-PERP": "TONCOIN-PERP", - "TONCOINUSD": "TONCOIN/USD", - "TRU-PERP": "TRU-PERP", - "TRUMP2024": "TRUMP2024", - "TRUUSD": "TRU/USD", - "TRUUSDT": "TRU/USDT", - "TRX-0325": "TRX-0325", - "TRX-PERP": "TRX-PERP", - "TRXBEARUSD": "TRXBEAR/USD", - "TRXBTC": "TRX/BTC", - "TRXBULLUSD": "TRXBULL/USD", - "TRXHALFUSD": "TRXHALF/USD", - "TRXHEDGEUSD": "TRXHEDGE/USD", - "TRXUSD": "TRX/USD", - "TRXUSDT": "TRX/USDT", - "TRYB-PERP": "TRYB-PERP", - "TRYBBEARUSD": "TRYBBEAR/USD", - "TRYBBULLUSD": "TRYBBULL/USD", - "TRYBHALFUSD": "TRYBHALF/USD", - "TRYBHEDGEUSD": "TRYBHEDGE/USD", - "TRYBUSD": "TRYB/USD", - "TSLA-0325": "TSLA-0325", - "TSLABTC": "TSLA/BTC", - "TSLADOGE": "TSLA/DOGE", - "TSLAUSD": "TSLA/USD", - "TSM-0325": "TSM-0325", - "TSMUSD": "TSM/USD", - "TULIP-PERP": "TULIP-PERP", - "TULIPUSD": "TULIP/USD", - "TWTR-0325": "TWTR-0325", - "TWTRUSD": "TWTR/USD", - "UBER-0325": "UBER-0325", - "UBERUSD": "UBER/USD", - "UBXTUSD": "UBXT/USD", - "UBXTUSDT": "UBXT/USDT", - "UMEEUSD": "UMEE/USD", - "UNI-0325": "UNI-0325", - "UNI-PERP": "UNI-PERP", - "UNIBTC": "UNI/BTC", - "UNISWAP-0325": "UNISWAP-0325", - "UNISWAP-PERP": "UNISWAP-PERP", - "UNISWAPBEARUSD": "UNISWAPBEAR/USD", - "UNISWAPBULLUSD": "UNISWAPBULL/USD", - "UNIUSD": "UNI/USD", - "UNIUSDT": "UNI/USDT", - "USDT-0325": "USDT-0325", - "USDT-PERP": "USDT-PERP", - "USDTBEARUSD": "USDTBEAR/USD", - "USDTBULLUSD": "USDTBULL/USD", - "USDTHALFUSD": "USDTHALF/USD", - "USDTHEDGEUSD": "USDTHEDGE/USD", - "USDTUSD": "USDT/USD", - "USO-0325": "USO-0325", - "USOUSD": "USO/USD", - "UST-PERP": "UST-PERP", - "USTUSD": "UST/USD", - "USTUSDT": "UST/USDT", - "VET-PERP": "VET-PERP", - "VETBEARUSD": "VETBEAR/USD", - "VETBEARUSDT": "VETBEAR/USDT", - "VETBULLUSD": "VETBULL/USD", - "VETBULLUSDT": "VETBULL/USDT", - "VETHEDGEUSD": "VETHEDGE/USD", - "VGXUSD": "VGX/USD", - "WAVES-0325": "WAVES-0325", - "WAVES-PERP": "WAVES-PERP", - "WAVESUSD": "WAVES/USD", - "WBTCBTC": "WBTC/BTC", - "WBTCUSD": "WBTC/USD", - "WNDRUSD": "WNDR/USD", - "WRXUSD": "WRX/USD", - "WRXUSDT": "WRX/USDT", - "WSB-0325": "WSB-0325", - "XAUT-0325": "XAUT-0325", - "XAUT-PERP": "XAUT-PERP", - "XAUTBEARUSD": "XAUTBEAR/USD", - "XAUTBULLUSD": "XAUTBULL/USD", - "XAUTHALFUSD": "XAUTHALF/USD", - "XAUTHEDGEUSD": "XAUTHEDGE/USD", - "XAUTUSD": "XAUT/USD", - "XAUTUSDT": "XAUT/USDT", - "XEM-PERP": "XEM-PERP", - "XLM-PERP": "XLM-PERP", - "XLMBEARUSD": "XLMBEAR/USD", - "XLMBULLUSD": "XLMBULL/USD", - "XMR-PERP": "XMR-PERP", - "XRP-0325": "XRP-0325", - "XRP-PERP": "XRP-PERP", - "XRPBEARUSD": "XRPBEAR/USD", - "XRPBEARUSDT": "XRPBEAR/USDT", - "XRPBTC": "XRP/BTC", - "XRPBULLUSD": "XRPBULL/USD", - "XRPBULLUSDT": "XRPBULL/USDT", - "XRPHALFUSD": "XRPHALF/USD", - "XRPHEDGEUSD": "XRPHEDGE/USD", - "XRPUSD": "XRP/USD", - "XRPUSDT": "XRP/USDT", - "XTZ-0325": "XTZ-0325", - "XTZ-PERP": "XTZ-PERP", - "XTZBEARUSD": "XTZBEAR/USD", - "XTZBEARUSDT": "XTZBEAR/USDT", - "XTZBULLUSD": "XTZBULL/USD", - "XTZBULLUSDT": "XTZBULL/USDT", - "XTZHALFUSD": "XTZHALF/USD", - "XTZHEDGEUSD": "XTZHEDGE/USD", - "YFI-0325": "YFI-0325", - "YFI-PERP": "YFI-PERP", - "YFIBTC": "YFI/BTC", - "YFII-PERP": "YFII-PERP", - "YFIIUSD": "YFII/USD", - "YFIUSD": "YFI/USD", - "YFIUSDT": "YFI/USDT", - "YGGUSD": "YGG/USD", - "ZEC-PERP": "ZEC-PERP", - "ZECBEARUSD": "ZECBEAR/USD", - "ZECBULLUSD": "ZECBULL/USD", - "ZIL-PERP": "ZIL-PERP", - "ZM-0325": "ZM-0325", - "ZMUSD": "ZM/USD", - "ZRX-PERP": "ZRX-PERP", - "ZRXUSD": "ZRX/USD", - "GMTUSD": "GMT/USD", - "GMT-PERP": "GMT-PERP", + "MATICBTC": "MATIC/BTC", + "MATICBULLUSD": "MATICBULL/USD", + "MATICHALFUSD": "MATICHALF/USD", + "MATICHEDGEUSD": "MATICHEDGE/USD", + "MATICUSD": "MATIC/USD", + "MBSUSD": "MBS/USD", + "MCB-PERP": "MCB-PERP", + "MCBUSD": "MCB/USD", + "MEDIA-PERP": "MEDIA-PERP", + "MEDIAUSD": "MEDIA/USD", + "MER-PERP": "MER-PERP", + "MERUSD": "MER/USD", + "MID-0325": "MID-0325", + "MID-PERP": "MID-PERP", + "MIDBEARUSD": "MIDBEAR/USD", + "MIDBULLUSD": "MIDBULL/USD", + "MIDHALFUSD": "MIDHALF/USD", + "MIDHEDGEUSD": "MIDHEDGE/USD", + "MINA-PERP": "MINA-PERP", + "MKR-PERP": "MKR-PERP", + "MKRBEARUSD": "MKRBEAR/USD", + "MKRBULLUSD": "MKRBULL/USD", + "MKRUSD": "MKR/USD", + "MKRUSDT": "MKR/USDT", + "MNGO-PERP": "MNGO-PERP", + "MNGOUSD": "MNGO/USD", + "MOBUSD": "MOB/USD", + "MOBUSDT": "MOB/USDT", + "MRNA-0325": "MRNA-0325", + "MRNAUSD": "MRNA/USD", + "MSOLUSD": "MSOL/USD", + "MSTR-0325": "MSTR-0325", + "MSTRUSD": "MSTR/USD", + "MTA-PERP": "MTA-PERP", + "MTAUSD": "MTA/USD", + "MTAUSDT": "MTA/USDT", + "MTL-PERP": "MTL-PERP", + "MTLUSD": "MTL/USD", + "MVDA10-PERP": "MVDA10-PERP", + "MVDA25-PERP": "MVDA25-PERP", + "NEAR-PERP": "NEAR-PERP", + "NEO-PERP": "NEO-PERP", + "NEXOUSD": "NEXO/USD", + "NFLX-0325": "NFLX-0325", + "NFLXUSD": "NFLX/USD", + "NIO-0325": "NIO-0325", + "NIOUSD": "NIO/USD", + "NOK-0325": "NOK-0325", + "NOKUSD": "NOK/USD", + "NVDA-0325": "NVDA-0325", + "NVDAUSD": "NVDA/USD", + "OKB-0325": "OKB-0325", + "OKB-PERP": "OKB-PERP", + "OKBBEARUSD": "OKBBEAR/USD", + "OKBBULLUSD": "OKBBULL/USD", + "OKBHALFUSD": "OKBHALF/USD", + "OKBHEDGEUSD": "OKBHEDGE/USD", + "OKBUSD": "OKB/USD", + "OMG-0325": "OMG-0325", + "OMG-PERP": "OMG-PERP", + "OMGUSD": "OMG/USD", + "ONE-PERP": "ONE-PERP", + "ONT-PERP": "ONT-PERP", + "ORBS-PERP": "ORBS-PERP", + "ORBSUSD": "ORBS/USD", + "OXY-PERP": "OXY-PERP", + "OXYUSD": "OXY/USD", + "OXYUSDT": "OXY/USDT", + "PAXG-PERP": "PAXG-PERP", + "PAXGBEARUSD": "PAXGBEAR/USD", + "PAXGBULLUSD": "PAXGBULL/USD", + "PAXGHALFUSD": "PAXGHALF/USD", + "PAXGHEDGEUSD": "PAXGHEDGE/USD", + "PAXGUSD": "PAXG/USD", + "PAXGUSDT": "PAXG/USDT", + "PENN-0325": "PENN-0325", + "PENNUSD": "PENN/USD", + "PEOPLE-PERP": "PEOPLE-PERP", + "PEOPLEUSD": "PEOPLE/USD", + "PERP-PERP": "PERP-PERP", + "PERPUSD": "PERP/USD", + "PFE-0325": "PFE-0325", + "PFEUSD": "PFE/USD", + "POLIS-PERP": "POLIS-PERP", + "POLISUSD": "POLIS/USD", + "PORTUSD": "PORT/USD", + "PRISMUSD": "PRISM/USD", + "PRIV-0325": "PRIV-0325", + "PRIV-PERP": "PRIV-PERP", + "PRIVBEARUSD": "PRIVBEAR/USD", + "PRIVBULLUSD": "PRIVBULL/USD", + "PRIVHALFUSD": "PRIVHALF/USD", + "PRIVHEDGEUSD": "PRIVHEDGE/USD", + "PROM-PERP": "PROM-PERP", + "PROMUSD": "PROM/USD", + "PSGUSD": "PSG/USD", + "PSYUSD": "PSY/USD", + "PTUUSD": "PTU/USD", + "PUNDIX-PERP": "PUNDIX-PERP", + "PUNDIXUSD": "PUNDIX/USD", + "PYPL-0325": "PYPL-0325", + "PYPLUSD": "PYPL/USD", + "QIUSD": "QI/USD", + "QTUM-PERP": "QTUM-PERP", + "RAMP-PERP": "RAMP-PERP", + "RAMPUSD": "RAMP/USD", + "RAY-PERP": "RAY-PERP", + "RAYUSD": "RAY/USD", + "REALUSD": "REAL/USD", + "REEF-0325": "REEF-0325", + "REEF-PERP": "REEF-PERP", + "REEFUSD": "REEF/USD", + "REN-PERP": "REN-PERP", + "RENUSD": "REN/USD", + "RNDR-PERP": "RNDR-PERP", + "RNDRUSD": "RNDR/USD", + "RON-PERP": "RON-PERP", + "ROOK-PERP": "ROOK-PERP", + "ROOKUSD": "ROOK/USD", + "ROOKUSDT": "ROOK/USDT", + "ROSE-PERP": "ROSE-PERP", + "RSR-PERP": "RSR-PERP", + "RSRUSD": "RSR/USD", + "RUNE-PERP": "RUNE-PERP", + "RUNEUSD": "RUNE/USD", + "RUNEUSDT": "RUNE/USDT", + "SAND-PERP": "SAND-PERP", + "SANDUSD": "SAND/USD", + "SC-PERP": "SC-PERP", + "SCRT-PERP": "SCRT-PERP", + "SECO-PERP": "SECO-PERP", + "SECOUSD": "SECO/USD", + "SHIB-PERP": "SHIB-PERP", + "SHIBUSD": "SHIB/USD", + "SHIT-0325": "SHIT-0325", + "SHIT-PERP": "SHIT-PERP", + "SKL-PERP": "SKL-PERP", + "SKLUSD": "SKL/USD", + "SLNDUSD": "SLND/USD", + "SLP-PERP": "SLP-PERP", + "SLPUSD": "SLP/USD", + "SLRSUSD": "SLRS/USD", + "SLV-0325": "SLV-0325", + "SLVUSD": "SLV/USD", + "SNX-PERP": "SNX-PERP", + "SNXUSD": "SNX/USD", + "SNYUSD": "SNY/USD", + "SOL-0325": "SOL-0325", + "SOL-PERP": "SOL-PERP", + "SOLBTC": "SOL/BTC", + "SOLUSD": "SOL/USD", + "SOLUSDT": "SOL/USDT", + "SOS-PERP": "SOS-PERP", + "SOSUSD": "SOS/USD", + "SPELL-PERP": "SPELL-PERP", + "SPELLUSD": "SPELL/USD", + "SPY-0325": "SPY-0325", + "SPYUSD": "SPY/USD", + "SQ-0325": "SQ-0325", + "SQUSD": "SQ/USD", + "SRM-PERP": "SRM-PERP", + "SRMUSD": "SRM/USD", + "SRMUSDT": "SRM/USDT", + "SRN-PERP": "SRN-PERP", + "STARSUSD": "STARS/USD", + "STEP-PERP": "STEP-PERP", + "STEPUSD": "STEP/USD", + "STETHUSD": "STETH/USD", + "STMX-PERP": "STMX-PERP", + "STMXUSD": "STMX/USD", + "STORJ-PERP": "STORJ-PERP", + "STORJUSD": "STORJ/USD", + "STSOLUSD": "STSOL/USD", + "STX-PERP": "STX-PERP", + "SUNUSD": "SUN/USD", + "SUSHI-0325": "SUSHI-0325", + "SUSHI-PERP": "SUSHI-PERP", + "SUSHIBEARUSD": "SUSHIBEAR/USD", + "SUSHIBTC": "SUSHI/BTC", + "SUSHIBULLUSD": "SUSHIBULL/USD", + "SUSHIUSD": "SUSHI/USD", + "SUSHIUSDT": "SUSHI/USDT", + "SXP-0325": "SXP-0325", + "SXP-PERP": "SXP-PERP", + "SXPBEARUSD": "SXPBEAR/USD", + "SXPBTC": "SXP/BTC", + "SXPBULLUSD": "SXPBULL/USD", + "SXPHALFUSD": "SXPHALF/USD", + "SXPHALFUSDT": "SXPHALF/USDT", + "SXPHEDGEUSD": "SXPHEDGE/USD", + "SXPUSD": "SXP/USD", + "SXPUSDT": "SXP/USDT", + "THETA-0325": "THETA-0325", + "THETA-PERP": "THETA-PERP", + "THETABEARUSD": "THETABEAR/USD", + "THETABULLUSD": "THETABULL/USD", + "THETAHALFUSD": "THETAHALF/USD", + "THETAHEDGEUSD": "THETAHEDGE/USD", + "TLM-PERP": "TLM-PERP", + "TLMUSD": "TLM/USD", + "TLRY-0325": "TLRY-0325", + "TLRYUSD": "TLRY/USD", + "TOMO-PERP": "TOMO-PERP", + "TOMOBEAR2021USD": "TOMOBEAR2021/USD", + "TOMOBULLUSD": "TOMOBULL/USD", + "TOMOHALFUSD": "TOMOHALF/USD", + "TOMOHEDGEUSD": "TOMOHEDGE/USD", + "TOMOUSD": "TOMO/USD", + "TOMOUSDT": "TOMO/USDT", + "TONCOIN-PERP": "TONCOIN-PERP", + "TONCOINUSD": "TONCOIN/USD", + "TRU-PERP": "TRU-PERP", + "TRUMP2024": "TRUMP2024", + "TRUUSD": "TRU/USD", + "TRUUSDT": "TRU/USDT", + "TRX-0325": "TRX-0325", + "TRX-PERP": "TRX-PERP", + "TRXBEARUSD": "TRXBEAR/USD", + "TRXBTC": "TRX/BTC", + "TRXBULLUSD": "TRXBULL/USD", + "TRXHALFUSD": "TRXHALF/USD", + "TRXHEDGEUSD": "TRXHEDGE/USD", + "TRXUSD": "TRX/USD", + "TRXUSDT": "TRX/USDT", + "TRYB-PERP": "TRYB-PERP", + "TRYBBEARUSD": "TRYBBEAR/USD", + "TRYBBULLUSD": "TRYBBULL/USD", + "TRYBHALFUSD": "TRYBHALF/USD", + "TRYBHEDGEUSD": "TRYBHEDGE/USD", + "TRYBUSD": "TRYB/USD", + "TSLA-0325": "TSLA-0325", + "TSLABTC": "TSLA/BTC", + "TSLADOGE": "TSLA/DOGE", + "TSLAUSD": "TSLA/USD", + "TSM-0325": "TSM-0325", + "TSMUSD": "TSM/USD", + "TULIP-PERP": "TULIP-PERP", + "TULIPUSD": "TULIP/USD", + "TWTR-0325": "TWTR-0325", + "TWTRUSD": "TWTR/USD", + "UBER-0325": "UBER-0325", + "UBERUSD": "UBER/USD", + "UBXTUSD": "UBXT/USD", + "UBXTUSDT": "UBXT/USDT", + "UMEEUSD": "UMEE/USD", + "UNI-0325": "UNI-0325", + "UNI-PERP": "UNI-PERP", + "UNIBTC": "UNI/BTC", + "UNISWAP-0325": "UNISWAP-0325", + "UNISWAP-PERP": "UNISWAP-PERP", + "UNISWAPBEARUSD": "UNISWAPBEAR/USD", + "UNISWAPBULLUSD": "UNISWAPBULL/USD", + "UNIUSD": "UNI/USD", + "UNIUSDT": "UNI/USDT", + "USDT-0325": "USDT-0325", + "USDT-PERP": "USDT-PERP", + "USDTBEARUSD": "USDTBEAR/USD", + "USDTBULLUSD": "USDTBULL/USD", + "USDTHALFUSD": "USDTHALF/USD", + "USDTHEDGEUSD": "USDTHEDGE/USD", + "USDTUSD": "USDT/USD", + "USO-0325": "USO-0325", + "USOUSD": "USO/USD", + "UST-PERP": "UST-PERP", + "USTUSD": "UST/USD", + "USTUSDT": "UST/USDT", + "VET-PERP": "VET-PERP", + "VETBEARUSD": "VETBEAR/USD", + "VETBEARUSDT": "VETBEAR/USDT", + "VETBULLUSD": "VETBULL/USD", + "VETBULLUSDT": "VETBULL/USDT", + "VETHEDGEUSD": "VETHEDGE/USD", + "VGXUSD": "VGX/USD", + "WAVES-0325": "WAVES-0325", + "WAVES-PERP": "WAVES-PERP", + "WAVESUSD": "WAVES/USD", + "WBTCBTC": "WBTC/BTC", + "WBTCUSD": "WBTC/USD", + "WNDRUSD": "WNDR/USD", + "WRXUSD": "WRX/USD", + "WRXUSDT": "WRX/USDT", + "WSB-0325": "WSB-0325", + "XAUT-0325": "XAUT-0325", + "XAUT-PERP": "XAUT-PERP", + "XAUTBEARUSD": "XAUTBEAR/USD", + "XAUTBULLUSD": "XAUTBULL/USD", + "XAUTHALFUSD": "XAUTHALF/USD", + "XAUTHEDGEUSD": "XAUTHEDGE/USD", + "XAUTUSD": "XAUT/USD", + "XAUTUSDT": "XAUT/USDT", + "XEM-PERP": "XEM-PERP", + "XLM-PERP": "XLM-PERP", + "XLMBEARUSD": "XLMBEAR/USD", + "XLMBULLUSD": "XLMBULL/USD", + "XMR-PERP": "XMR-PERP", + "XRP-0325": "XRP-0325", + "XRP-PERP": "XRP-PERP", + "XRPBEARUSD": "XRPBEAR/USD", + "XRPBEARUSDT": "XRPBEAR/USDT", + "XRPBTC": "XRP/BTC", + "XRPBULLUSD": "XRPBULL/USD", + "XRPBULLUSDT": "XRPBULL/USDT", + "XRPHALFUSD": "XRPHALF/USD", + "XRPHEDGEUSD": "XRPHEDGE/USD", + "XRPUSD": "XRP/USD", + "XRPUSDT": "XRP/USDT", + "XTZ-0325": "XTZ-0325", + "XTZ-PERP": "XTZ-PERP", + "XTZBEARUSD": "XTZBEAR/USD", + "XTZBEARUSDT": "XTZBEAR/USDT", + "XTZBULLUSD": "XTZBULL/USD", + "XTZBULLUSDT": "XTZBULL/USDT", + "XTZHALFUSD": "XTZHALF/USD", + "XTZHEDGEUSD": "XTZHEDGE/USD", + "YFI-0325": "YFI-0325", + "YFI-PERP": "YFI-PERP", + "YFIBTC": "YFI/BTC", + "YFII-PERP": "YFII-PERP", + "YFIIUSD": "YFII/USD", + "YFIUSD": "YFI/USD", + "YFIUSDT": "YFI/USDT", + "YGGUSD": "YGG/USD", + "ZEC-PERP": "ZEC-PERP", + "ZECBEARUSD": "ZECBEAR/USD", + "ZECBULLUSD": "ZECBULL/USD", + "ZIL-PERP": "ZIL-PERP", + "ZM-0325": "ZM-0325", + "ZMUSD": "ZM/USD", + "ZRX-PERP": "ZRX-PERP", + "ZRXUSD": "ZRX/USD", + "GMTUSD": "GMT/USD", + "GMT-PERP": "GMT-PERP", } diff --git a/pkg/exchange/kucoin/convert.go b/pkg/exchange/kucoin/convert.go index 450c5b9fd..d86f84db9 100644 --- a/pkg/exchange/kucoin/convert.go +++ b/pkg/exchange/kucoin/convert.go @@ -245,4 +245,3 @@ func toGlobalTrade(fill kucoinapi.Fill) types.Trade { } return trade } - diff --git a/pkg/exchange/kucoin/generate_symbol_map.go b/pkg/exchange/kucoin/generate_symbol_map.go index b67806641..249a5ec17 100644 --- a/pkg/exchange/kucoin/generate_symbol_map.go +++ b/pkg/exchange/kucoin/generate_symbol_map.go @@ -53,7 +53,7 @@ func main() { defer resp.Body.Close() r := &ApiResponse{} - if err := json.NewDecoder(resp.Body).Decode(r) ; err != nil { + if err := json.NewDecoder(resp.Body).Decode(r); err != nil { log.Fatal(err) } diff --git a/pkg/exchange/kucoin/kucoinapi/bullet.go b/pkg/exchange/kucoin/kucoinapi/bullet.go index 213ca8c95..0226fad9b 100644 --- a/pkg/exchange/kucoin/kucoinapi/bullet.go +++ b/pkg/exchange/kucoin/kucoinapi/bullet.go @@ -61,7 +61,6 @@ type GetPublicBulletRequest struct { client requestgen.APIClient } - //go:generate requestgen -type GetPrivateBulletRequest -method "POST" -url "/api/v1/bullet-private" -responseType .APIResponse -responseDataField Data -responseDataType .Bullet type GetPrivateBulletRequest struct { client requestgen.AuthenticatedAPIClient diff --git a/pkg/exchange/kucoin/stream.go b/pkg/exchange/kucoin/stream.go index 77e06a2d6..f6ad67f97 100644 --- a/pkg/exchange/kucoin/stream.go +++ b/pkg/exchange/kucoin/stream.go @@ -9,9 +9,9 @@ import ( "github.com/c9s/bbgo/pkg/depth" "github.com/c9s/bbgo/pkg/exchange/kucoin/kucoinapi" + "github.com/c9s/bbgo/pkg/fixedpoint" "github.com/c9s/bbgo/pkg/types" "github.com/c9s/bbgo/pkg/util" - "github.com/c9s/bbgo/pkg/fixedpoint" ) const readTimeout = 30 * time.Second @@ -20,8 +20,8 @@ const readTimeout = 30 * time.Second type Stream struct { types.StandardStream - client *kucoinapi.RestClient - exchange *Exchange + client *kucoinapi.RestClient + exchange *Exchange bullet *kucoinapi.Bullet candleEventCallbacks []func(candle *WebSocketCandleEvent, e *WebSocketEvent) @@ -125,8 +125,8 @@ func (s *Stream) handlePrivateOrderEvent(e *WebSocketPrivateOrderEvent) { IsBuyer: e.Side == "buy", IsMaker: e.Liquidity == "maker", Time: types.Time(e.Ts.Time()), - Fee: fixedpoint.Zero, // not supported - FeeCurrency: "", // not supported + Fee: fixedpoint.Zero, // not supported + FeeCurrency: "", // not supported }) } diff --git a/pkg/exchange/kucoin/symbols.go b/pkg/exchange/kucoin/symbols.go index dccc5ebe7..ddd85b7fb 100644 --- a/pkg/exchange/kucoin/symbols.go +++ b/pkg/exchange/kucoin/symbols.go @@ -2,1109 +2,1109 @@ package kucoin var symbolMap = map[string]string{ - "1EARTHUSDT": "1EARTH-USDT", - "1INCHUSDT": "1INCH-USDT", - "2CRZBTC": "2CRZ-BTC", - "2CRZUSDT": "2CRZ-USDT", - "AAVE3LUSDT": "AAVE3L-USDT", - "AAVE3SUSDT": "AAVE3S-USDT", - "AAVEBTC": "AAVE-BTC", - "AAVEKCS": "AAVE-KCS", - "AAVEUSDT": "AAVE-USDT", - "AAVEUST": "AAVE-UST", - "ABBCBTC": "ABBC-BTC", - "ABBCUSDT": "ABBC-USDT", - "ACEUSDT": "ACE-USDT", - "ACOINUSDT": "ACOIN-USDT", - "ACTBTC": "ACT-BTC", - "ACTETH": "ACT-ETH", - "ADA3LUSDT": "ADA3L-USDT", - "ADA3SUSDT": "ADA3S-USDT", - "ADABTC": "ADA-BTC", - "ADAKCS": "ADA-KCS", - "ADAUSDC": "ADA-USDC", - "ADAUSDT": "ADA-USDT", - "ADBBTC": "ADB-BTC", - "ADBETH": "ADB-ETH", - "ADXUSDT": "ADX-USDT", - "AERGOBTC": "AERGO-BTC", - "AERGOUSDT": "AERGO-USDT", - "AGIXBTC": "AGIX-BTC", - "AGIXETH": "AGIX-ETH", - "AGIXUSDT": "AGIX-USDT", - "AGLDUSDT": "AGLD-USDT", - "AIONBTC": "AION-BTC", - "AIONETH": "AION-ETH", - "AIOZUSDT": "AIOZ-USDT", - "AIUSDT": "AI-USDT", - "AKROBTC": "AKRO-BTC", - "AKROUSDT": "AKRO-USDT", - "ALBTETH": "ALBT-ETH", - "ALBTUSDT": "ALBT-USDT", - "ALEPHUSDT": "ALEPH-USDT", - "ALGOBTC": "ALGO-BTC", - "ALGOETH": "ALGO-ETH", - "ALGOKCS": "ALGO-KCS", - "ALGOUSDT": "ALGO-USDT", - "ALICEBTC": "ALICE-BTC", - "ALICEETH": "ALICE-ETH", - "ALICEUSDT": "ALICE-USDT", - "ALPACAUSDT": "ALPACA-USDT", - "ALPHABTC": "ALPHA-BTC", - "ALPHAUSDT": "ALPHA-USDT", - "AMBBTC": "AMB-BTC", - "AMBETH": "AMB-ETH", - "AMPLBTC": "AMPL-BTC", - "AMPLETH": "AMPL-ETH", - "AMPLUSDT": "AMPL-USDT", - "ANCUSDT": "ANC-USDT", - "ANCUST": "ANC-UST", - "ANKRBTC": "ANKR-BTC", - "ANKRUSDT": "ANKR-USDT", - "ANTBTC": "ANT-BTC", - "ANTUSDT": "ANT-USDT", - "AOABTC": "AOA-BTC", - "AOAUSDT": "AOA-USDT", - "API3USDT": "API3-USDT", - "APLBTC": "APL-BTC", - "APLUSDT": "APL-USDT", - "ARBTC": "AR-BTC", - "ARKERUSDT": "ARKER-USDT", - "ARPAUSDT": "ARPA-USDT", - "ARRRBTC": "ARRR-BTC", - "ARRRUSDT": "ARRR-USDT", - "ARUSDT": "AR-USDT", - "ARXUSDT": "ARX-USDT", - "ASDUSDT": "ASD-USDT", - "ATABTC": "ATA-BTC", - "ATAUSDT": "ATA-USDT", - "ATOM3LUSDT": "ATOM3L-USDT", - "ATOM3SUSDT": "ATOM3S-USDT", - "ATOMBTC": "ATOM-BTC", - "ATOMETH": "ATOM-ETH", - "ATOMKCS": "ATOM-KCS", - "ATOMUSDT": "ATOM-USDT", - "ATOMUST": "ATOM-UST", - "AUDIOBTC": "AUDIO-BTC", - "AUDIOUSDT": "AUDIO-USDT", - "AURYUSDT": "AURY-USDT", - "AVABTC": "AVA-BTC", - "AVAETH": "AVA-ETH", - "AVAUSDT": "AVA-USDT", - "AVAX3LUSDT": "AVAX3L-USDT", - "AVAX3SUSDT": "AVAX3S-USDT", - "AVAXBTC": "AVAX-BTC", - "AVAXUSDT": "AVAX-USDT", - "AXCUSDT": "AXC-USDT", - "AXPRBTC": "AXPR-BTC", - "AXPRETH": "AXPR-ETH", - "AXS3LUSDT": "AXS3L-USDT", - "AXS3SUSDT": "AXS3S-USDT", - "AXSUSDT": "AXS-USDT", - "BADGERBTC": "BADGER-BTC", - "BADGERUSDT": "BADGER-USDT", - "BAKEBTC": "BAKE-BTC", - "BAKEETH": "BAKE-ETH", - "BAKEUSDT": "BAKE-USDT", - "BALBTC": "BAL-BTC", - "BALETH": "BAL-ETH", - "BALUSDT": "BAL-USDT", - "BANDBTC": "BAND-BTC", - "BANDUSDT": "BAND-USDT", - "BASICUSDT": "BASIC-USDT", - "BATUSDT": "BAT-USDT", - "BAXBTC": "BAX-BTC", - "BAXETH": "BAX-ETH", - "BAXUSDT": "BAX-USDT", - "BCDBTC": "BCD-BTC", - "BCDETH": "BCD-ETH", - "BCH3LUSDT": "BCH3L-USDT", - "BCH3SUSDT": "BCH3S-USDT", - "BCHBTC": "BCH-BTC", - "BCHKCS": "BCH-KCS", - "BCHSVBTC": "BCHSV-BTC", - "BCHSVETH": "BCHSV-ETH", - "BCHSVKCS": "BCHSV-KCS", - "BCHSVUSDC": "BCHSV-USDC", - "BCHSVUSDT": "BCHSV-USDT", - "BCHUSDC": "BCH-USDC", - "BCHUSDT": "BCH-USDT", - "BEPROBTC": "BEPRO-BTC", - "BEPROUSDT": "BEPRO-USDT", - "BLOKUSDT": "BLOK-USDT", - "BMONUSDT": "BMON-USDT", - "BNB3LUSDT": "BNB3L-USDT", - "BNB3SUSDT": "BNB3S-USDT", - "BNBBTC": "BNB-BTC", - "BNBKCS": "BNB-KCS", - "BNBUSDT": "BNB-USDT", - "BNSBTC": "BNS-BTC", - "BNSUSDT": "BNS-USDT", - "BNTBTC": "BNT-BTC", - "BNTETH": "BNT-ETH", - "BNTUSDT": "BNT-USDT", - "BOAUSDT": "BOA-USDT", - "BOLTBTC": "BOLT-BTC", - "BOLTUSDT": "BOLT-USDT", - "BONDLYETH": "BONDLY-ETH", - "BONDLYUSDT": "BONDLY-USDT", - "BONDUSDT": "BOND-USDT", - "BOSONETH": "BOSON-ETH", - "BOSONUSDT": "BOSON-USDT", - "BTC3LUSDT": "BTC3L-USDT", - "BTC3SUSDT": "BTC3S-USDT", - "BTCDAI": "BTC-DAI", - "BTCPAX": "BTC-PAX", - "BTCTUSD": "BTC-TUSD", - "BTCUSDC": "BTC-USDC", - "BTCUSDT": "BTC-USDT", - "BTCUST": "BTC-UST", - "BTTBTC": "BTT-BTC", - "BTTETH": "BTT-ETH", - "BTTTRX": "BTT-TRX", - "BTTUSDT": "BTT-USDT", - "BURGERBTC": "BURGER-BTC", - "BURGERUSDT": "BURGER-USDT", - "BURPUSDT": "BURP-USDT", - "BUXBTC": "BUX-BTC", - "BUXUSDT": "BUX-USDT", - "BUYBTC": "BUY-BTC", - "BUYUSDT": "BUY-USDT", - "C98USDT": "C98-USDT", - "CAKEUSDT": "CAKE-USDT", - "CAPPBTC": "CAPP-BTC", - "CAPPETH": "CAPP-ETH", - "CARDUSDT": "CARD-USDT", - "CARRBTC": "CARR-BTC", - "CARRUSDT": "CARR-USDT", - "CASBTC": "CAS-BTC", - "CASUSDT": "CAS-USDT", - "CBCBTC": "CBC-BTC", - "CBCUSDT": "CBC-USDT", - "CELOBTC": "CELO-BTC", - "CELOUSDT": "CELO-USDT", - "CEREUSDT": "CERE-USDT", - "CEURBTC": "CEUR-BTC", - "CEURUSDT": "CEUR-USDT", - "CFGBTC": "CFG-BTC", - "CFGUSDT": "CFG-USDT", - "CGGUSDT": "CGG-USDT", - "CHMBUSDT": "CHMB-USDT", - "CHRBTC": "CHR-BTC", - "CHRUSDT": "CHR-USDT", - "CHSBBTC": "CHSB-BTC", - "CHSBETH": "CHSB-ETH", - "CHZBTC": "CHZ-BTC", - "CHZUSDT": "CHZ-USDT", - "CIRUSETH": "CIRUS-ETH", - "CIRUSUSDT": "CIRUS-USDT", - "CIX100USDT": "CIX100-USDT", - "CKBBTC": "CKB-BTC", - "CKBUSDT": "CKB-USDT", - "CLVUSDT": "CLV-USDT", - "COMBUSDT": "COMB-USDT", - "COMPUSDT": "COMP-USDT", - "COTIBTC": "COTI-BTC", - "COTIUSDT": "COTI-USDT", - "COVBTC": "COV-BTC", - "COVETH": "COV-ETH", - "COVUSDT": "COV-USDT", - "CPCBTC": "CPC-BTC", - "CPCETH": "CPC-ETH", - "CPOOLUSDT": "CPOOL-USDT", - "CQTUSDT": "CQT-USDT", - "CREAMBTC": "CREAM-BTC", - "CREAMUSDT": "CREAM-USDT", - "CREDIUSDT": "CREDI-USDT", - "CROBTC": "CRO-BTC", - "CROUSDT": "CRO-USDT", - "CRPTBTC": "CRPT-BTC", - "CRPTETH": "CRPT-ETH", - "CRPTUSDT": "CRPT-USDT", - "CRVUSDT": "CRV-USDT", - "CSBTC": "CS-BTC", - "CSETH": "CS-ETH", - "CSPBTC": "CSP-BTC", - "CSPETH": "CSP-ETH", - "CTIETH": "CTI-ETH", - "CTIUSDT": "CTI-USDT", - "CTSIBTC": "CTSI-BTC", - "CTSIUSDT": "CTSI-USDT", - "CUDOSBTC": "CUDOS-BTC", - "CUDOSUSDT": "CUDOS-USDT", - "CUSDBTC": "CUSD-BTC", - "CUSDUSDT": "CUSD-USDT", - "CVBTC": "CV-BTC", - "CVCBTC": "CVC-BTC", - "CVETH": "CV-ETH", - "CWARBTC": "CWAR-BTC", - "CWARUSDT": "CWAR-USDT", - "CWSUSDT": "CWS-USDT", - "CXOBTC": "CXO-BTC", - "CXOETH": "CXO-ETH", - "DACCBTC": "DACC-BTC", - "DACCETH": "DACC-ETH", - "DAGBTC": "DAG-BTC", - "DAGETH": "DAG-ETH", - "DAGUSDT": "DAG-USDT", - "DAOUSDT": "DAO-USDT", - "DAPPTBTC": "DAPPT-BTC", - "DAPPTUSDT": "DAPPT-USDT", - "DAPPXUSDT": "DAPPX-USDT", - "DASHBTC": "DASH-BTC", - "DASHETH": "DASH-ETH", - "DASHKCS": "DASH-KCS", - "DASHUSDT": "DASH-USDT", - "DATABTC": "DATA-BTC", - "DATAUSDT": "DATA-USDT", - "DATXBTC": "DATX-BTC", - "DATXETH": "DATX-ETH", - "DCRBTC": "DCR-BTC", - "DCRETH": "DCR-ETH", - "DEGOETH": "DEGO-ETH", - "DEGOUSDT": "DEGO-USDT", - "DENTBTC": "DENT-BTC", - "DENTETH": "DENT-ETH", - "DEROBTC": "DERO-BTC", - "DEROUSDT": "DERO-USDT", - "DEXEBTC": "DEXE-BTC", - "DEXEETH": "DEXE-ETH", - "DEXEUSDT": "DEXE-USDT", - "DFIBTC": "DFI-BTC", - "DFIUSDT": "DFI-USDT", - "DFYNUSDT": "DFYN-USDT", - "DGBBTC": "DGB-BTC", - "DGBETH": "DGB-ETH", - "DGBUSDT": "DGB-USDT", - "DGTXBTC": "DGTX-BTC", - "DGTXETH": "DGTX-ETH", - "DIABTC": "DIA-BTC", - "DIAUSDT": "DIA-USDT", - "DINOUSDT": "DINO-USDT", - "DIVIUSDT": "DIVI-USDT", - "DMGUSDT": "DMG-USDT", - "DMTRUSDT": "DMTR-USDT", - "DOCKBTC": "DOCK-BTC", - "DOCKETH": "DOCK-ETH", - "DODOUSDT": "DODO-USDT", - "DOGE3LUSDT": "DOGE3L-USDT", - "DOGE3SUSDT": "DOGE3S-USDT", - "DOGEBTC": "DOGE-BTC", - "DOGEKCS": "DOGE-KCS", - "DOGEUSDC": "DOGE-USDC", - "DOGEUSDT": "DOGE-USDT", - "DORABTC": "DORA-BTC", - "DORAUSDT": "DORA-USDT", - "DOT3LUSDT": "DOT3L-USDT", - "DOT3SUSDT": "DOT3S-USDT", - "DOTBTC": "DOT-BTC", - "DOTKCS": "DOT-KCS", - "DOTUSDT": "DOT-USDT", - "DOTUST": "DOT-UST", - "DPETUSDT": "DPET-USDT", - "DPIUSDT": "DPI-USDT", - "DPRUSDT": "DPR-USDT", - "DREAMSUSDT": "DREAMS-USDT", - "DRGNBTC": "DRGN-BTC", - "DRGNETH": "DRGN-ETH", - "DSLABTC": "DSLA-BTC", - "DSLAUSDT": "DSLA-USDT", - "DVPNUSDT": "DVPN-USDT", - "DYDXUSDT": "DYDX-USDT", - "DYPETH": "DYP-ETH", - "DYPUSDT": "DYP-USDT", - "EDGBTC": "EDG-BTC", - "EDGUSDT": "EDG-USDT", - "EFXBTC": "EFX-BTC", - "EFXUSDT": "EFX-USDT", - "EGLDBTC": "EGLD-BTC", - "EGLDUSDT": "EGLD-USDT", - "ELABTC": "ELA-BTC", - "ELAETH": "ELA-ETH", - "ELAUSDT": "ELA-USDT", - "ELFBTC": "ELF-BTC", - "ELFETH": "ELF-ETH", - "ELONUSDT": "ELON-USDT", - "ENJBTC": "ENJ-BTC", - "ENJETH": "ENJ-ETH", - "ENJUSDT": "ENJ-USDT", - "ENQBTC": "ENQ-BTC", - "ENQUSDT": "ENQ-USDT", - "ENSUSDT": "ENS-USDT", - "EOS3LUSDT": "EOS3L-USDT", - "EOS3SUSDT": "EOS3S-USDT", - "EOSBTC": "EOS-BTC", - "EOSCUSDT": "EOSC-USDT", - "EOSETH": "EOS-ETH", - "EOSKCS": "EOS-KCS", - "EOSUSDC": "EOS-USDC", - "EOSUSDT": "EOS-USDT", - "EPIKUSDT": "EPIK-USDT", - "EPSBTC": "EPS-BTC", - "EPSUSDT": "EPS-USDT", - "EQXBTC": "EQX-BTC", - "EQXUSDT": "EQX-USDT", - "EQZBTC": "EQZ-BTC", - "EQZUSDT": "EQZ-USDT", - "ERGBTC": "ERG-BTC", - "ERGUSDT": "ERG-USDT", - "ERNBTC": "ERN-BTC", - "ERNUSDT": "ERN-USDT", - "ERSDLUSDT": "ERSDL-USDT", - "ETCBTC": "ETC-BTC", - "ETCETH": "ETC-ETH", - "ETCUSDT": "ETC-USDT", - "ETH2ETH": "ETH2-ETH", - "ETH3LUSDT": "ETH3L-USDT", - "ETH3SUSDT": "ETH3S-USDT", - "ETHBTC": "ETH-BTC", - "ETHDAI": "ETH-DAI", - "ETHOBTC": "ETHO-BTC", - "ETHOUSDT": "ETHO-USDT", - "ETHPAX": "ETH-PAX", - "ETHTUSD": "ETH-TUSD", - "ETHUSDC": "ETH-USDC", - "ETHUSDT": "ETH-USDT", - "ETHUST": "ETH-UST", - "ETNBTC": "ETN-BTC", - "ETNETH": "ETN-ETH", - "ETNUSDT": "ETN-USDT", - "EWTBTC": "EWT-BTC", - "EWTKCS": "EWT-KCS", - "EWTUSDT": "EWT-USDT", - "EXRDUSDT": "EXRD-USDT", - "FALCONSUSDT": "FALCONS-USDT", - "FCLETH": "FCL-ETH", - "FCLUSDT": "FCL-USDT", - "FEARUSDT": "FEAR-USDT", - "FETBTC": "FET-BTC", - "FETETH": "FET-ETH", - "FILUSDT": "FIL-USDT", - "FKXBTC": "FKX-BTC", - "FKXETH": "FKX-ETH", - "FKXUSDT": "FKX-USDT", - "FLAMEUSDT": "FLAME-USDT", - "FLOWBTC": "FLOW-BTC", - "FLOWUSDT": "FLOW-USDT", - "FLUXBTC": "FLUX-BTC", - "FLUXUSDT": "FLUX-USDT", - "FLYUSDT": "FLY-USDT", - "FORESTPLUSBTC": "FORESTPLUS-BTC", + "1EARTHUSDT": "1EARTH-USDT", + "1INCHUSDT": "1INCH-USDT", + "2CRZBTC": "2CRZ-BTC", + "2CRZUSDT": "2CRZ-USDT", + "AAVE3LUSDT": "AAVE3L-USDT", + "AAVE3SUSDT": "AAVE3S-USDT", + "AAVEBTC": "AAVE-BTC", + "AAVEKCS": "AAVE-KCS", + "AAVEUSDT": "AAVE-USDT", + "AAVEUST": "AAVE-UST", + "ABBCBTC": "ABBC-BTC", + "ABBCUSDT": "ABBC-USDT", + "ACEUSDT": "ACE-USDT", + "ACOINUSDT": "ACOIN-USDT", + "ACTBTC": "ACT-BTC", + "ACTETH": "ACT-ETH", + "ADA3LUSDT": "ADA3L-USDT", + "ADA3SUSDT": "ADA3S-USDT", + "ADABTC": "ADA-BTC", + "ADAKCS": "ADA-KCS", + "ADAUSDC": "ADA-USDC", + "ADAUSDT": "ADA-USDT", + "ADBBTC": "ADB-BTC", + "ADBETH": "ADB-ETH", + "ADXUSDT": "ADX-USDT", + "AERGOBTC": "AERGO-BTC", + "AERGOUSDT": "AERGO-USDT", + "AGIXBTC": "AGIX-BTC", + "AGIXETH": "AGIX-ETH", + "AGIXUSDT": "AGIX-USDT", + "AGLDUSDT": "AGLD-USDT", + "AIONBTC": "AION-BTC", + "AIONETH": "AION-ETH", + "AIOZUSDT": "AIOZ-USDT", + "AIUSDT": "AI-USDT", + "AKROBTC": "AKRO-BTC", + "AKROUSDT": "AKRO-USDT", + "ALBTETH": "ALBT-ETH", + "ALBTUSDT": "ALBT-USDT", + "ALEPHUSDT": "ALEPH-USDT", + "ALGOBTC": "ALGO-BTC", + "ALGOETH": "ALGO-ETH", + "ALGOKCS": "ALGO-KCS", + "ALGOUSDT": "ALGO-USDT", + "ALICEBTC": "ALICE-BTC", + "ALICEETH": "ALICE-ETH", + "ALICEUSDT": "ALICE-USDT", + "ALPACAUSDT": "ALPACA-USDT", + "ALPHABTC": "ALPHA-BTC", + "ALPHAUSDT": "ALPHA-USDT", + "AMBBTC": "AMB-BTC", + "AMBETH": "AMB-ETH", + "AMPLBTC": "AMPL-BTC", + "AMPLETH": "AMPL-ETH", + "AMPLUSDT": "AMPL-USDT", + "ANCUSDT": "ANC-USDT", + "ANCUST": "ANC-UST", + "ANKRBTC": "ANKR-BTC", + "ANKRUSDT": "ANKR-USDT", + "ANTBTC": "ANT-BTC", + "ANTUSDT": "ANT-USDT", + "AOABTC": "AOA-BTC", + "AOAUSDT": "AOA-USDT", + "API3USDT": "API3-USDT", + "APLBTC": "APL-BTC", + "APLUSDT": "APL-USDT", + "ARBTC": "AR-BTC", + "ARKERUSDT": "ARKER-USDT", + "ARPAUSDT": "ARPA-USDT", + "ARRRBTC": "ARRR-BTC", + "ARRRUSDT": "ARRR-USDT", + "ARUSDT": "AR-USDT", + "ARXUSDT": "ARX-USDT", + "ASDUSDT": "ASD-USDT", + "ATABTC": "ATA-BTC", + "ATAUSDT": "ATA-USDT", + "ATOM3LUSDT": "ATOM3L-USDT", + "ATOM3SUSDT": "ATOM3S-USDT", + "ATOMBTC": "ATOM-BTC", + "ATOMETH": "ATOM-ETH", + "ATOMKCS": "ATOM-KCS", + "ATOMUSDT": "ATOM-USDT", + "ATOMUST": "ATOM-UST", + "AUDIOBTC": "AUDIO-BTC", + "AUDIOUSDT": "AUDIO-USDT", + "AURYUSDT": "AURY-USDT", + "AVABTC": "AVA-BTC", + "AVAETH": "AVA-ETH", + "AVAUSDT": "AVA-USDT", + "AVAX3LUSDT": "AVAX3L-USDT", + "AVAX3SUSDT": "AVAX3S-USDT", + "AVAXBTC": "AVAX-BTC", + "AVAXUSDT": "AVAX-USDT", + "AXCUSDT": "AXC-USDT", + "AXPRBTC": "AXPR-BTC", + "AXPRETH": "AXPR-ETH", + "AXS3LUSDT": "AXS3L-USDT", + "AXS3SUSDT": "AXS3S-USDT", + "AXSUSDT": "AXS-USDT", + "BADGERBTC": "BADGER-BTC", + "BADGERUSDT": "BADGER-USDT", + "BAKEBTC": "BAKE-BTC", + "BAKEETH": "BAKE-ETH", + "BAKEUSDT": "BAKE-USDT", + "BALBTC": "BAL-BTC", + "BALETH": "BAL-ETH", + "BALUSDT": "BAL-USDT", + "BANDBTC": "BAND-BTC", + "BANDUSDT": "BAND-USDT", + "BASICUSDT": "BASIC-USDT", + "BATUSDT": "BAT-USDT", + "BAXBTC": "BAX-BTC", + "BAXETH": "BAX-ETH", + "BAXUSDT": "BAX-USDT", + "BCDBTC": "BCD-BTC", + "BCDETH": "BCD-ETH", + "BCH3LUSDT": "BCH3L-USDT", + "BCH3SUSDT": "BCH3S-USDT", + "BCHBTC": "BCH-BTC", + "BCHKCS": "BCH-KCS", + "BCHSVBTC": "BCHSV-BTC", + "BCHSVETH": "BCHSV-ETH", + "BCHSVKCS": "BCHSV-KCS", + "BCHSVUSDC": "BCHSV-USDC", + "BCHSVUSDT": "BCHSV-USDT", + "BCHUSDC": "BCH-USDC", + "BCHUSDT": "BCH-USDT", + "BEPROBTC": "BEPRO-BTC", + "BEPROUSDT": "BEPRO-USDT", + "BLOKUSDT": "BLOK-USDT", + "BMONUSDT": "BMON-USDT", + "BNB3LUSDT": "BNB3L-USDT", + "BNB3SUSDT": "BNB3S-USDT", + "BNBBTC": "BNB-BTC", + "BNBKCS": "BNB-KCS", + "BNBUSDT": "BNB-USDT", + "BNSBTC": "BNS-BTC", + "BNSUSDT": "BNS-USDT", + "BNTBTC": "BNT-BTC", + "BNTETH": "BNT-ETH", + "BNTUSDT": "BNT-USDT", + "BOAUSDT": "BOA-USDT", + "BOLTBTC": "BOLT-BTC", + "BOLTUSDT": "BOLT-USDT", + "BONDLYETH": "BONDLY-ETH", + "BONDLYUSDT": "BONDLY-USDT", + "BONDUSDT": "BOND-USDT", + "BOSONETH": "BOSON-ETH", + "BOSONUSDT": "BOSON-USDT", + "BTC3LUSDT": "BTC3L-USDT", + "BTC3SUSDT": "BTC3S-USDT", + "BTCDAI": "BTC-DAI", + "BTCPAX": "BTC-PAX", + "BTCTUSD": "BTC-TUSD", + "BTCUSDC": "BTC-USDC", + "BTCUSDT": "BTC-USDT", + "BTCUST": "BTC-UST", + "BTTBTC": "BTT-BTC", + "BTTETH": "BTT-ETH", + "BTTTRX": "BTT-TRX", + "BTTUSDT": "BTT-USDT", + "BURGERBTC": "BURGER-BTC", + "BURGERUSDT": "BURGER-USDT", + "BURPUSDT": "BURP-USDT", + "BUXBTC": "BUX-BTC", + "BUXUSDT": "BUX-USDT", + "BUYBTC": "BUY-BTC", + "BUYUSDT": "BUY-USDT", + "C98USDT": "C98-USDT", + "CAKEUSDT": "CAKE-USDT", + "CAPPBTC": "CAPP-BTC", + "CAPPETH": "CAPP-ETH", + "CARDUSDT": "CARD-USDT", + "CARRBTC": "CARR-BTC", + "CARRUSDT": "CARR-USDT", + "CASBTC": "CAS-BTC", + "CASUSDT": "CAS-USDT", + "CBCBTC": "CBC-BTC", + "CBCUSDT": "CBC-USDT", + "CELOBTC": "CELO-BTC", + "CELOUSDT": "CELO-USDT", + "CEREUSDT": "CERE-USDT", + "CEURBTC": "CEUR-BTC", + "CEURUSDT": "CEUR-USDT", + "CFGBTC": "CFG-BTC", + "CFGUSDT": "CFG-USDT", + "CGGUSDT": "CGG-USDT", + "CHMBUSDT": "CHMB-USDT", + "CHRBTC": "CHR-BTC", + "CHRUSDT": "CHR-USDT", + "CHSBBTC": "CHSB-BTC", + "CHSBETH": "CHSB-ETH", + "CHZBTC": "CHZ-BTC", + "CHZUSDT": "CHZ-USDT", + "CIRUSETH": "CIRUS-ETH", + "CIRUSUSDT": "CIRUS-USDT", + "CIX100USDT": "CIX100-USDT", + "CKBBTC": "CKB-BTC", + "CKBUSDT": "CKB-USDT", + "CLVUSDT": "CLV-USDT", + "COMBUSDT": "COMB-USDT", + "COMPUSDT": "COMP-USDT", + "COTIBTC": "COTI-BTC", + "COTIUSDT": "COTI-USDT", + "COVBTC": "COV-BTC", + "COVETH": "COV-ETH", + "COVUSDT": "COV-USDT", + "CPCBTC": "CPC-BTC", + "CPCETH": "CPC-ETH", + "CPOOLUSDT": "CPOOL-USDT", + "CQTUSDT": "CQT-USDT", + "CREAMBTC": "CREAM-BTC", + "CREAMUSDT": "CREAM-USDT", + "CREDIUSDT": "CREDI-USDT", + "CROBTC": "CRO-BTC", + "CROUSDT": "CRO-USDT", + "CRPTBTC": "CRPT-BTC", + "CRPTETH": "CRPT-ETH", + "CRPTUSDT": "CRPT-USDT", + "CRVUSDT": "CRV-USDT", + "CSBTC": "CS-BTC", + "CSETH": "CS-ETH", + "CSPBTC": "CSP-BTC", + "CSPETH": "CSP-ETH", + "CTIETH": "CTI-ETH", + "CTIUSDT": "CTI-USDT", + "CTSIBTC": "CTSI-BTC", + "CTSIUSDT": "CTSI-USDT", + "CUDOSBTC": "CUDOS-BTC", + "CUDOSUSDT": "CUDOS-USDT", + "CUSDBTC": "CUSD-BTC", + "CUSDUSDT": "CUSD-USDT", + "CVBTC": "CV-BTC", + "CVCBTC": "CVC-BTC", + "CVETH": "CV-ETH", + "CWARBTC": "CWAR-BTC", + "CWARUSDT": "CWAR-USDT", + "CWSUSDT": "CWS-USDT", + "CXOBTC": "CXO-BTC", + "CXOETH": "CXO-ETH", + "DACCBTC": "DACC-BTC", + "DACCETH": "DACC-ETH", + "DAGBTC": "DAG-BTC", + "DAGETH": "DAG-ETH", + "DAGUSDT": "DAG-USDT", + "DAOUSDT": "DAO-USDT", + "DAPPTBTC": "DAPPT-BTC", + "DAPPTUSDT": "DAPPT-USDT", + "DAPPXUSDT": "DAPPX-USDT", + "DASHBTC": "DASH-BTC", + "DASHETH": "DASH-ETH", + "DASHKCS": "DASH-KCS", + "DASHUSDT": "DASH-USDT", + "DATABTC": "DATA-BTC", + "DATAUSDT": "DATA-USDT", + "DATXBTC": "DATX-BTC", + "DATXETH": "DATX-ETH", + "DCRBTC": "DCR-BTC", + "DCRETH": "DCR-ETH", + "DEGOETH": "DEGO-ETH", + "DEGOUSDT": "DEGO-USDT", + "DENTBTC": "DENT-BTC", + "DENTETH": "DENT-ETH", + "DEROBTC": "DERO-BTC", + "DEROUSDT": "DERO-USDT", + "DEXEBTC": "DEXE-BTC", + "DEXEETH": "DEXE-ETH", + "DEXEUSDT": "DEXE-USDT", + "DFIBTC": "DFI-BTC", + "DFIUSDT": "DFI-USDT", + "DFYNUSDT": "DFYN-USDT", + "DGBBTC": "DGB-BTC", + "DGBETH": "DGB-ETH", + "DGBUSDT": "DGB-USDT", + "DGTXBTC": "DGTX-BTC", + "DGTXETH": "DGTX-ETH", + "DIABTC": "DIA-BTC", + "DIAUSDT": "DIA-USDT", + "DINOUSDT": "DINO-USDT", + "DIVIUSDT": "DIVI-USDT", + "DMGUSDT": "DMG-USDT", + "DMTRUSDT": "DMTR-USDT", + "DOCKBTC": "DOCK-BTC", + "DOCKETH": "DOCK-ETH", + "DODOUSDT": "DODO-USDT", + "DOGE3LUSDT": "DOGE3L-USDT", + "DOGE3SUSDT": "DOGE3S-USDT", + "DOGEBTC": "DOGE-BTC", + "DOGEKCS": "DOGE-KCS", + "DOGEUSDC": "DOGE-USDC", + "DOGEUSDT": "DOGE-USDT", + "DORABTC": "DORA-BTC", + "DORAUSDT": "DORA-USDT", + "DOT3LUSDT": "DOT3L-USDT", + "DOT3SUSDT": "DOT3S-USDT", + "DOTBTC": "DOT-BTC", + "DOTKCS": "DOT-KCS", + "DOTUSDT": "DOT-USDT", + "DOTUST": "DOT-UST", + "DPETUSDT": "DPET-USDT", + "DPIUSDT": "DPI-USDT", + "DPRUSDT": "DPR-USDT", + "DREAMSUSDT": "DREAMS-USDT", + "DRGNBTC": "DRGN-BTC", + "DRGNETH": "DRGN-ETH", + "DSLABTC": "DSLA-BTC", + "DSLAUSDT": "DSLA-USDT", + "DVPNUSDT": "DVPN-USDT", + "DYDXUSDT": "DYDX-USDT", + "DYPETH": "DYP-ETH", + "DYPUSDT": "DYP-USDT", + "EDGBTC": "EDG-BTC", + "EDGUSDT": "EDG-USDT", + "EFXBTC": "EFX-BTC", + "EFXUSDT": "EFX-USDT", + "EGLDBTC": "EGLD-BTC", + "EGLDUSDT": "EGLD-USDT", + "ELABTC": "ELA-BTC", + "ELAETH": "ELA-ETH", + "ELAUSDT": "ELA-USDT", + "ELFBTC": "ELF-BTC", + "ELFETH": "ELF-ETH", + "ELONUSDT": "ELON-USDT", + "ENJBTC": "ENJ-BTC", + "ENJETH": "ENJ-ETH", + "ENJUSDT": "ENJ-USDT", + "ENQBTC": "ENQ-BTC", + "ENQUSDT": "ENQ-USDT", + "ENSUSDT": "ENS-USDT", + "EOS3LUSDT": "EOS3L-USDT", + "EOS3SUSDT": "EOS3S-USDT", + "EOSBTC": "EOS-BTC", + "EOSCUSDT": "EOSC-USDT", + "EOSETH": "EOS-ETH", + "EOSKCS": "EOS-KCS", + "EOSUSDC": "EOS-USDC", + "EOSUSDT": "EOS-USDT", + "EPIKUSDT": "EPIK-USDT", + "EPSBTC": "EPS-BTC", + "EPSUSDT": "EPS-USDT", + "EQXBTC": "EQX-BTC", + "EQXUSDT": "EQX-USDT", + "EQZBTC": "EQZ-BTC", + "EQZUSDT": "EQZ-USDT", + "ERGBTC": "ERG-BTC", + "ERGUSDT": "ERG-USDT", + "ERNBTC": "ERN-BTC", + "ERNUSDT": "ERN-USDT", + "ERSDLUSDT": "ERSDL-USDT", + "ETCBTC": "ETC-BTC", + "ETCETH": "ETC-ETH", + "ETCUSDT": "ETC-USDT", + "ETH2ETH": "ETH2-ETH", + "ETH3LUSDT": "ETH3L-USDT", + "ETH3SUSDT": "ETH3S-USDT", + "ETHBTC": "ETH-BTC", + "ETHDAI": "ETH-DAI", + "ETHOBTC": "ETHO-BTC", + "ETHOUSDT": "ETHO-USDT", + "ETHPAX": "ETH-PAX", + "ETHTUSD": "ETH-TUSD", + "ETHUSDC": "ETH-USDC", + "ETHUSDT": "ETH-USDT", + "ETHUST": "ETH-UST", + "ETNBTC": "ETN-BTC", + "ETNETH": "ETN-ETH", + "ETNUSDT": "ETN-USDT", + "EWTBTC": "EWT-BTC", + "EWTKCS": "EWT-KCS", + "EWTUSDT": "EWT-USDT", + "EXRDUSDT": "EXRD-USDT", + "FALCONSUSDT": "FALCONS-USDT", + "FCLETH": "FCL-ETH", + "FCLUSDT": "FCL-USDT", + "FEARUSDT": "FEAR-USDT", + "FETBTC": "FET-BTC", + "FETETH": "FET-ETH", + "FILUSDT": "FIL-USDT", + "FKXBTC": "FKX-BTC", + "FKXETH": "FKX-ETH", + "FKXUSDT": "FKX-USDT", + "FLAMEUSDT": "FLAME-USDT", + "FLOWBTC": "FLOW-BTC", + "FLOWUSDT": "FLOW-USDT", + "FLUXBTC": "FLUX-BTC", + "FLUXUSDT": "FLUX-USDT", + "FLYUSDT": "FLY-USDT", + "FORESTPLUSBTC": "FORESTPLUS-BTC", "FORESTPLUSUSDT": "FORESTPLUS-USDT", - "FORMETH": "FORM-ETH", - "FORMUSDT": "FORM-USDT", - "FORTHUSDT": "FORTH-USDT", - "FRMUSDT": "FRM-USDT", - "FRONTBTC": "FRONT-BTC", - "FRONTUSDT": "FRONT-USDT", - "FTGUSDT": "FTG-USDT", - "FTM3LUSDT": "FTM3L-USDT", - "FTM3SUSDT": "FTM3S-USDT", - "FTMBTC": "FTM-BTC", - "FTMETH": "FTM-ETH", - "FTMUSDT": "FTM-USDT", - "FTTBTC": "FTT-BTC", - "FTTUSDT": "FTT-USDT", - "FXBTC": "FX-BTC", - "FXETH": "FX-ETH", - "FXSBTC": "FXS-BTC", - "FXSUSDT": "FXS-USDT", - "GAFIUSDT": "GAFI-USDT", - "GALAX3LUSDT": "GALAX3L-USDT", - "GALAX3SUSDT": "GALAX3S-USDT", - "GALAXUSDT": "GALAX-USDT", - "GASBTC": "GAS-BTC", - "GASUSDT": "GAS-USDT", - "GEEQUSDT": "GEEQ-USDT", - "GENSUSDT": "GENS-USDT", - "GHSTBTC": "GHST-BTC", - "GHSTUSDT": "GHST-USDT", - "GHXUSDT": "GHX-USDT", - "GLCHUSDT": "GLCH-USDT", - "GLMBTC": "GLM-BTC", - "GLMUSDT": "GLM-USDT", - "GLQBTC": "GLQ-BTC", - "GLQUSDT": "GLQ-USDT", - "GMBBTC": "GMB-BTC", - "GMBETH": "GMB-ETH", - "GMBUSDT": "GMB-USDT", - "GMEEUSDT": "GMEE-USDT", - "GOBTC": "GO-BTC", - "GODSUSDT": "GODS-USDT", - "GOETH": "GO-ETH", - "GOM2BTC": "GOM2-BTC", - "GOM2USDT": "GOM2-USDT", - "GOUSDT": "GO-USDT", - "GOVIBTC": "GOVI-BTC", - "GOVIUSDT": "GOVI-USDT", - "GRINBTC": "GRIN-BTC", - "GRINETH": "GRIN-ETH", - "GRINUSDT": "GRIN-USDT", - "GRTKCS": "GRT-KCS", - "GRTUSDT": "GRT-USDT", - "GSPIUSDT": "GSPI-USDT", - "GTCBTC": "GTC-BTC", - "GTCUSDT": "GTC-USDT", - "H3RO3SUSDT": "H3RO3S-USDT", - "HAIBTC": "HAI-BTC", - "HAIUSDT": "HAI-USDT", - "HAKAUSDT": "HAKA-USDT", - "HAPIUSDT": "HAPI-USDT", - "HARDUSDT": "HARD-USDT", - "HBARBTC": "HBAR-BTC", - "HBARUSDT": "HBAR-USDT", - "HEARTBTC": "HEART-BTC", - "HEARTUSDT": "HEART-USDT", - "HEGICBTC": "HEGIC-BTC", - "HEGICUSDT": "HEGIC-USDT", - "HEROUSDT": "HERO-USDT", - "HORDUSDT": "HORD-USDT", - "HOTCROSSUSDT": "HOTCROSS-USDT", - "HPBBTC": "HPB-BTC", - "HPBETH": "HPB-ETH", - "HTRBTC": "HTR-BTC", - "HTRUSDT": "HTR-USDT", - "HTUSDT": "HT-USDT", - "HYDRAUSDT": "HYDRA-USDT", - "HYVEBTC": "HYVE-BTC", - "HYVEUSDT": "HYVE-USDT", - "ICPBTC": "ICP-BTC", - "ICPUSDT": "ICP-USDT", - "IDEAUSDT": "IDEA-USDT", - "ILAUSDT": "ILA-USDT", - "ILVUSDT": "ILV-USDT", - "IMXUSDT": "IMX-USDT", - "INJBTC": "INJ-BTC", - "INJUSDT": "INJ-USDT", - "IOIUSDT": "IOI-USDT", - "IOSTBTC": "IOST-BTC", - "IOSTETH": "IOST-ETH", - "IOSTUSDT": "IOST-USDT", - "IOTXBTC": "IOTX-BTC", - "IOTXETH": "IOTX-ETH", - "IOTXUSDT": "IOTX-USDT", - "ISPUSDT": "ISP-USDT", - "IXSUSDT": "IXS-USDT", - "JARBTC": "JAR-BTC", - "JARUSDT": "JAR-USDT", - "JASMYUSDT": "JASMY-USDT", - "JSTUSDT": "JST-USDT", - "JUPETH": "JUP-ETH", - "JUPUSDT": "JUP-USDT", - "KAIBTC": "KAI-BTC", - "KAIETH": "KAI-ETH", - "KAIUSDT": "KAI-USDT", - "KARUSDT": "KAR-USDT", - "KATBTC": "KAT-BTC", - "KATUSDT": "KAT-USDT", - "KAVAUSDT": "KAVA-USDT", - "KCSBTC": "KCS-BTC", - "KCSETH": "KCS-ETH", - "KCSUSDT": "KCS-USDT", - "KDABTC": "KDA-BTC", - "KDAUSDT": "KDA-USDT", - "KDONUSDT": "KDON-USDT", - "KEEPBTC": "KEEP-BTC", - "KEEPUSDT": "KEEP-USDT", - "KEYBTC": "KEY-BTC", - "KEYETH": "KEY-ETH", - "KINUSDT": "KIN-USDT", - "KLAYBTC": "KLAY-BTC", - "KLAYUSDT": "KLAY-USDT", - "KLVBTC": "KLV-BTC", - "KLVTRX": "KLV-TRX", - "KLVUSDT": "KLV-USDT", - "KMAUSDT": "KMA-USDT", - "KMDBTC": "KMD-BTC", - "KMDUSDT": "KMD-USDT", - "KNCBTC": "KNC-BTC", - "KNCETH": "KNC-ETH", - "KOKUSDT": "KOK-USDT", - "KOLETH": "KOL-ETH", - "KOLUSDT": "KOL-USDT", - "KONOUSDT": "KONO-USDT", - "KRLBTC": "KRL-BTC", - "KRLUSDT": "KRL-USDT", - "KSMBTC": "KSM-BTC", - "KSMUSDT": "KSM-USDT", - "LABSETH": "LABS-ETH", - "LABSUSDT": "LABS-USDT", - "LACEETH": "LACE-ETH", - "LACEUSDT": "LACE-USDT", - "LAYERBTC": "LAYER-BTC", - "LAYERUSDT": "LAYER-USDT", - "LIKEUSDT": "LIKE-USDT", - "LINABTC": "LINA-BTC", - "LINAUSDT": "LINA-USDT", - "LINK3LUSDT": "LINK3L-USDT", - "LINK3SUSDT": "LINK3S-USDT", - "LINKBTC": "LINK-BTC", - "LINKKCS": "LINK-KCS", - "LINKUSDC": "LINK-USDC", - "LINKUSDT": "LINK-USDT", - "LITBTC": "LIT-BTC", - "LITHETH": "LITH-ETH", - "LITHUSDT": "LITH-USDT", - "LITUSDT": "LIT-USDT", - "LNCHXUSDT": "LNCHX-USDT", - "LOCGUSDT": "LOCG-USDT", - "LOCUSDT": "LOC-USDT", - "LOKIBTC": "LOKI-BTC", - "LOKIETH": "LOKI-ETH", - "LOKIUSDT": "LOKI-USDT", - "LONUSDT": "LON-USDT", - "LOOMBTC": "LOOM-BTC", - "LOOMETH": "LOOM-ETH", - "LPOOLBTC": "LPOOL-BTC", - "LPOOLUSDT": "LPOOL-USDT", - "LPTUSDT": "LPT-USDT", - "LRCBTC": "LRC-BTC", - "LRCETH": "LRC-ETH", - "LRCUSDT": "LRC-USDT", - "LSKBTC": "LSK-BTC", - "LSKETH": "LSK-ETH", - "LSSUSDT": "LSS-USDT", - "LTC3LUSDT": "LTC3L-USDT", - "LTC3SUSDT": "LTC3S-USDT", - "LTCBTC": "LTC-BTC", - "LTCETH": "LTC-ETH", - "LTCKCS": "LTC-KCS", - "LTCUSDC": "LTC-USDC", - "LTCUSDT": "LTC-USDT", - "LTOBTC": "LTO-BTC", - "LTOUSDT": "LTO-USDT", - "LTXBTC": "LTX-BTC", - "LTXUSDT": "LTX-USDT", - "LUNA3LUSDT": "LUNA3L-USDT", - "LUNA3SUSDT": "LUNA3S-USDT", - "LUNABTC": "LUNA-BTC", - "LUNAETH": "LUNA-ETH", - "LUNAKCS": "LUNA-KCS", - "LUNAUSDT": "LUNA-USDT", - "LUNAUST": "LUNA-UST", - "LYMBTC": "LYM-BTC", - "LYMETH": "LYM-ETH", - "LYMUSDT": "LYM-USDT", - "LYXEETH": "LYXE-ETH", - "LYXEUSDT": "LYXE-USDT", - "MAHABTC": "MAHA-BTC", - "MAHAUSDT": "MAHA-USDT", - "MAKIBTC": "MAKI-BTC", - "MAKIUSDT": "MAKI-USDT", - "MANA3LUSDT": "MANA3L-USDT", - "MANA3SUSDT": "MANA3S-USDT", - "MANABTC": "MANA-BTC", - "MANAETH": "MANA-ETH", - "MANAUSDT": "MANA-USDT", - "MANBTC": "MAN-BTC", - "MANUSDT": "MAN-USDT", - "MAPBTC": "MAP-BTC", - "MAPUSDT": "MAP-USDT", - "MARSHUSDT": "MARSH-USDT", - "MASKUSDT": "MASK-USDT", - "MATIC3LUSDT": "MATIC3L-USDT", - "MATIC3SUSDT": "MATIC3S-USDT", - "MATICBTC": "MATIC-BTC", - "MATICUSDT": "MATIC-USDT", - "MATICUST": "MATIC-UST", - "MATTERUSDT": "MATTER-USDT", - "MEMUSDT": "MEM-USDT", - "MFTBTC": "MFT-BTC", - "MFTUSDT": "MFT-USDT", - "MHCBTC": "MHC-BTC", - "MHCETH": "MHC-ETH", - "MHCUSDT": "MHC-USDT", - "MIRKCS": "MIR-KCS", - "MIRUSDT": "MIR-USDT", - "MIRUST": "MIR-UST", - "MITXBTC": "MITX-BTC", - "MITXUSDT": "MITX-USDT", - "MKRBTC": "MKR-BTC", - "MKRDAI": "MKR-DAI", - "MKRETH": "MKR-ETH", - "MKRUSDT": "MKR-USDT", - "MLKBTC": "MLK-BTC", - "MLKUSDT": "MLK-USDT", - "MLNBTC": "MLN-BTC", - "MLNUSDT": "MLN-USDT", - "MNETUSDT": "MNET-USDT", - "MNSTUSDT": "MNST-USDT", - "MNWUSDT": "MNW-USDT", - "MODEFIBTC": "MODEFI-BTC", - "MODEFIUSDT": "MODEFI-USDT", - "MONIUSDT": "MONI-USDT", - "MOVRETH": "MOVR-ETH", - "MOVRUSDT": "MOVR-USDT", - "MSWAPBTC": "MSWAP-BTC", - "MSWAPUSDT": "MSWAP-USDT", - "MTLBTC": "MTL-BTC", - "MTLUSDT": "MTL-USDT", - "MTRGUSDT": "MTRG-USDT", - "MTVBTC": "MTV-BTC", - "MTVETH": "MTV-ETH", - "MTVUSDT": "MTV-USDT", - "MVPBTC": "MVP-BTC", - "MVPETH": "MVP-ETH", - "MXCUSDT": "MXC-USDT", - "MXWUSDT": "MXW-USDT", - "NAKAUSDT": "NAKA-USDT", - "NANOBTC": "NANO-BTC", - "NANOETH": "NANO-ETH", - "NANOKCS": "NANO-KCS", - "NANOUSDT": "NANO-USDT", - "NDAUUSDT": "NDAU-USDT", - "NEAR3LUSDT": "NEAR3L-USDT", - "NEAR3SUSDT": "NEAR3S-USDT", - "NEARBTC": "NEAR-BTC", - "NEARUSDT": "NEAR-USDT", - "NEOBTC": "NEO-BTC", - "NEOETH": "NEO-ETH", - "NEOKCS": "NEO-KCS", - "NEOUSDT": "NEO-USDT", - "NFTBUSDT": "NFTB-USDT", - "NFTTRX": "NFT-TRX", - "NFTUSDT": "NFT-USDT", - "NGCUSDT": "NGC-USDT", - "NGLBTC": "NGL-BTC", - "NGLUSDT": "NGL-USDT", - "NGMUSDT": "NGM-USDT", - "NIFUSDT": "NIF-USDT", - "NIMBTC": "NIM-BTC", - "NIMETH": "NIM-ETH", - "NIMUSDT": "NIM-USDT", - "NKNBTC": "NKN-BTC", - "NKNUSDT": "NKN-USDT", - "NMRBTC": "NMR-BTC", - "NMRUSDT": "NMR-USDT", - "NOIABTC": "NOIA-BTC", - "NOIAUSDT": "NOIA-USDT", - "NORDBTC": "NORD-BTC", - "NORDUSDT": "NORD-USDT", - "NRGBTC": "NRG-BTC", - "NRGETH": "NRG-ETH", - "NTVRKUSDC": "NTVRK-USDC", - "NTVRKUSDT": "NTVRK-USDT", - "NUBTC": "NU-BTC", - "NULSBTC": "NULS-BTC", - "NULSETH": "NULS-ETH", - "NUMUSDT": "NUM-USDT", - "NUUSDT": "NU-USDT", - "NWCBTC": "NWC-BTC", - "NWCUSDT": "NWC-USDT", - "OCEANBTC": "OCEAN-BTC", - "OCEANETH": "OCEAN-ETH", - "ODDZUSDT": "ODDZ-USDT", - "OGNBTC": "OGN-BTC", - "OGNUSDT": "OGN-USDT", - "OLTBTC": "OLT-BTC", - "OLTETH": "OLT-ETH", - "OMBTC": "OM-BTC", - "OMGBTC": "OMG-BTC", - "OMGETH": "OMG-ETH", - "OMGUSDT": "OMG-USDT", - "OMUSDT": "OM-USDT", - "ONEBTC": "ONE-BTC", - "ONEUSDT": "ONE-USDT", - "ONTBTC": "ONT-BTC", - "ONTETH": "ONT-ETH", - "ONTUSDT": "ONT-USDT", - "OOEUSDT": "OOE-USDT", - "OPCTBTC": "OPCT-BTC", - "OPCTETH": "OPCT-ETH", - "OPCTUSDT": "OPCT-USDT", - "OPULUSDT": "OPUL-USDT", - "ORAIUSDT": "ORAI-USDT", - "ORBSBTC": "ORBS-BTC", - "ORBSUSDT": "ORBS-USDT", - "ORNUSDT": "ORN-USDT", - "OUSDBTC": "OUSD-BTC", - "OUSDUSDT": "OUSD-USDT", - "OXTBTC": "OXT-BTC", - "OXTETH": "OXT-ETH", - "OXTUSDT": "OXT-USDT", - "PAXGBTC": "PAXG-BTC", - "PAXGUSDT": "PAXG-USDT", - "PBRUSDT": "PBR-USDT", - "PBXUSDT": "PBX-USDT", - "PCXBTC": "PCX-BTC", - "PCXUSDT": "PCX-USDT", - "PDEXBTC": "PDEX-BTC", - "PDEXUSDT": "PDEX-USDT", - "PELUSDT": "PEL-USDT", - "PERPBTC": "PERP-BTC", - "PERPUSDT": "PERP-USDT", - "PHAETH": "PHA-ETH", - "PHAUSDT": "PHA-USDT", - "PHNXBTC": "PHNX-BTC", - "PHNXUSDT": "PHNX-USDT", - "PIVXBTC": "PIVX-BTC", - "PIVXETH": "PIVX-ETH", - "PIVXUSDT": "PIVX-USDT", - "PLAYBTC": "PLAY-BTC", - "PLAYETH": "PLAY-ETH", - "PLUUSDT": "PLU-USDT", - "PMONUSDT": "PMON-USDT", - "PNTBTC": "PNT-BTC", - "PNTUSDT": "PNT-USDT", - "POLCUSDT": "POLC-USDT", - "POLKBTC": "POLK-BTC", - "POLKUSDT": "POLK-USDT", - "POLSBTC": "POLS-BTC", - "POLSUSDT": "POLS-USDT", - "POLUSDT": "POL-USDT", - "POLXUSDT": "POLX-USDT", - "PONDBTC": "POND-BTC", - "PONDUSDT": "POND-USDT", - "POWRBTC": "POWR-BTC", - "POWRETH": "POWR-ETH", - "PPTBTC": "PPT-BTC", - "PPTETH": "PPT-ETH", - "PREBTC": "PRE-BTC", - "PREUSDT": "PRE-USDT", - "PROMBTC": "PROM-BTC", - "PROMUSDT": "PROM-USDT", - "PRQUSDT": "PRQ-USDT", - "PUNDIXBTC": "PUNDIX-BTC", - "PUNDIXUSDT": "PUNDIX-USDT", - "PUSHBTC": "PUSH-BTC", - "PUSHUSDT": "PUSH-USDT", - "PYRBTC": "PYR-BTC", - "PYRUSDT": "PYR-USDT", - "QIBTC": "QI-BTC", - "QIUSDT": "QI-USDT", - "QKCBTC": "QKC-BTC", - "QKCETH": "QKC-ETH", - "QNTUSDT": "QNT-USDT", - "QRDOETH": "QRDO-ETH", - "QRDOUSDT": "QRDO-USDT", - "QTUMBTC": "QTUM-BTC", - "QUICKBTC": "QUICK-BTC", - "QUICKUSDT": "QUICK-USDT", - "RBTCBTC": "RBTC-BTC", - "REAPUSDT": "REAP-USDT", - "REEFBTC": "REEF-BTC", - "REEFUSDT": "REEF-USDT", - "RENUSDT": "REN-USDT", - "REPBTC": "REP-BTC", - "REPETH": "REP-ETH", - "REPUSDT": "REP-USDT", - "REQBTC": "REQ-BTC", - "REQETH": "REQ-ETH", - "REQUSDT": "REQ-USDT", - "REVVBTC": "REVV-BTC", - "REVVUSDT": "REVV-USDT", - "RFOXUSDT": "RFOX-USDT", - "RFUELUSDT": "RFUEL-USDT", - "RIFBTC": "RIF-BTC", - "RLCBTC": "RLC-BTC", - "RLCUSDT": "RLC-USDT", - "RLYUSDT": "RLY-USDT", - "RMRKUSDT": "RMRK-USDT", - "RNDRBTC": "RNDR-BTC", - "RNDRUSDT": "RNDR-USDT", - "ROOBEEBTC": "ROOBEE-BTC", - "ROSEUSDT": "ROSE-USDT", - "ROSNUSDT": "ROSN-USDT", - "ROUTEUSDT": "ROUTE-USDT", - "RSRBTC": "RSR-BTC", - "RSRUSDT": "RSR-USDT", - "RUNEBTC": "RUNE-BTC", - "RUNEUSDT": "RUNE-USDT", - "RUSDT": "R-USDT", - "SAND3LUSDT": "SAND3L-USDT", - "SAND3SUSDT": "SAND3S-USDT", - "SANDUSDT": "SAND-USDT", - "SCLPBTC": "SCLP-BTC", - "SCLPUSDT": "SCLP-USDT", - "SDAOETH": "SDAO-ETH", - "SDAOUSDT": "SDAO-USDT", - "SDNETH": "SDN-ETH", - "SDNUSDT": "SDN-USDT", - "SENSOBTC": "SENSO-BTC", - "SENSOUSDT": "SENSO-USDT", - "SFPBTC": "SFP-BTC", - "SFPUSDT": "SFP-USDT", - "SFUNDUSDT": "SFUND-USDT", - "SHABTC": "SHA-BTC", - "SHAUSDT": "SHA-USDT", - "SHFTBTC": "SHFT-BTC", - "SHFTUSDT": "SHFT-USDT", - "SHIBDOGE": "SHIB-DOGE", - "SHIBUSDT": "SHIB-USDT", - "SHILLUSDT": "SHILL-USDT", - "SHRBTC": "SHR-BTC", - "SHRUSDT": "SHR-USDT", - "SKEYUSDT": "SKEY-USDT", - "SKLBTC": "SKL-BTC", - "SKLUSDT": "SKL-USDT", - "SKUBTC": "SKU-BTC", - "SKUUSDT": "SKU-USDT", - "SLIMUSDT": "SLIM-USDT", - "SLPUSDT": "SLP-USDT", - "SNTBTC": "SNT-BTC", - "SNTETH": "SNT-ETH", - "SNTVTBTC": "SNTVT-BTC", - "SNTVTETH": "SNTVT-ETH", - "SNXBTC": "SNX-BTC", - "SNXETH": "SNX-ETH", - "SNXUSDT": "SNX-USDT", - "SNXUST": "SNX-UST", - "SOL3LUSDT": "SOL3L-USDT", - "SOL3SUSDT": "SOL3S-USDT", - "SOLRUSDT": "SOLR-USDT", - "SOLUSDT": "SOL-USDT", - "SOLUST": "SOL-UST", - "SOLVEBTC": "SOLVE-BTC", - "SOLVEUSDT": "SOLVE-USDT", - "SOULBTC": "SOUL-BTC", - "SOULETH": "SOUL-ETH", - "SOULUSDT": "SOUL-USDT", - "SOVUSDT": "SOV-USDT", - "SPIUSDT": "SPI-USDT", - "SRKBTC": "SRK-BTC", - "SRKUSDT": "SRK-USDT", - "SRMBTC": "SRM-BTC", - "SRMUSDT": "SRM-USDT", - "STCBTC": "STC-BTC", - "STCUSDT": "STC-USDT", - "STMXUSDT": "STMX-USDT", - "STNDETH": "STND-ETH", - "STNDUSDT": "STND-USDT", - "STORJBTC": "STORJ-BTC", - "STORJETH": "STORJ-ETH", - "STORJUSDT": "STORJ-USDT", - "STRKBTC": "STRK-BTC", - "STRKETH": "STRK-ETH", - "STRONGUSDT": "STRONG-USDT", - "STXBTC": "STX-BTC", - "STXUSDT": "STX-USDT", - "SUKUBTC": "SUKU-BTC", - "SUKUUSDT": "SUKU-USDT", - "SUNUSDT": "SUN-USDT", - "SUPERBTC": "SUPER-BTC", - "SUPERUSDT": "SUPER-USDT", - "SUSDBTC": "SUSD-BTC", - "SUSDETH": "SUSD-ETH", - "SUSDUSDT": "SUSD-USDT", - "SUSHI3LUSDT": "SUSHI3L-USDT", - "SUSHI3SUSDT": "SUSHI3S-USDT", - "SUSHIUSDT": "SUSHI-USDT", - "SUTERBTC": "SUTER-BTC", - "SUTERUSDT": "SUTER-USDT", - "SWASHUSDT": "SWASH-USDT", - "SWINGBYBTC": "SWINGBY-BTC", - "SWINGBYUSDT": "SWINGBY-USDT", - "SWPUSDT": "SWP-USDT", - "SXPBTC": "SXP-BTC", - "SXPUSDT": "SXP-USDT", - "SYLOUSDT": "SYLO-USDT", - "TARAETH": "TARA-ETH", - "TARAUSDT": "TARA-USDT", - "TCPUSDT": "TCP-USDT", - "TELBTC": "TEL-BTC", - "TELETH": "TEL-ETH", - "TELUSDT": "TEL-USDT", - "THETAUSDT": "THETA-USDT", - "TIDALUSDT": "TIDAL-USDT", - "TIMEBTC": "TIME-BTC", - "TIMEETH": "TIME-ETH", - "TKOBTC": "TKO-BTC", - "TKOUSDT": "TKO-USDT", - "TKYBTC": "TKY-BTC", - "TKYETH": "TKY-ETH", - "TKYUSDT": "TKY-USDT", - "TLMBTC": "TLM-BTC", - "TLMETH": "TLM-ETH", - "TLMUSDT": "TLM-USDT", - "TLOSBTC": "TLOS-BTC", - "TLOSUSDT": "TLOS-USDT", - "TOKOBTC": "TOKO-BTC", - "TOKOKCS": "TOKO-KCS", - "TOKOUSDT": "TOKO-USDT", - "TOMOBTC": "TOMO-BTC", - "TOMOETH": "TOMO-ETH", - "TOMOUSDT": "TOMO-USDT", - "TONEBTC": "TONE-BTC", - "TONEETH": "TONE-ETH", - "TONEUSDT": "TONE-USDT", - "TOWERBTC": "TOWER-BTC", - "TOWERUSDT": "TOWER-USDT", - "TRACBTC": "TRAC-BTC", - "TRACETH": "TRAC-ETH", - "TRADEBTC": "TRADE-BTC", - "TRADEUSDT": "TRADE-USDT", - "TRBBTC": "TRB-BTC", - "TRBUSDT": "TRB-USDT", - "TRIASBTC": "TRIAS-BTC", - "TRIASUSDT": "TRIAS-USDT", - "TRIBEUSDT": "TRIBE-USDT", - "TRUBTC": "TRU-BTC", - "TRUUSDT": "TRU-USDT", - "TRVLUSDT": "TRVL-USDT", - "TRXBTC": "TRX-BTC", - "TRXETH": "TRX-ETH", - "TRXKCS": "TRX-KCS", - "TRXUSDT": "TRX-USDT", - "TVKBTC": "TVK-BTC", - "TVKUSDT": "TVK-USDT", - "TWTBTC": "TWT-BTC", - "TWTUSDT": "TWT-USDT", - "TXAUSDC": "TXA-USDC", - "TXAUSDT": "TXA-USDT", - "UBXETH": "UBX-ETH", - "UBXTUSDT": "UBXT-USDT", - "UBXUSDT": "UBX-USDT", - "UDOOETH": "UDOO-ETH", - "UFOUSDT": "UFO-USDT", - "UMAUSDT": "UMA-USDT", - "UMBUSDT": "UMB-USDT", - "UNBUSDT": "UNB-USDT", - "UNFIUSDT": "UNFI-USDT", - "UNI3LUSDT": "UNI3L-USDT", - "UNI3SUSDT": "UNI3S-USDT", - "UNICUSDT": "UNIC-USDT", - "UNIKCS": "UNI-KCS", - "UNIUSDT": "UNI-USDT", - "UNOBTC": "UNO-BTC", - "UNOUSDT": "UNO-USDT", - "UOSBTC": "UOS-BTC", - "UOSUSDT": "UOS-USDT", - "UQCBTC": "UQC-BTC", - "UQCETH": "UQC-ETH", - "USDCUSDT": "USDC-USDT", - "USDCUST": "USDC-UST", - "USDJUSDT": "USDJ-USDT", - "USDNUSDT": "USDN-USDT", - "USDTDAI": "USDT-DAI", - "USDTPAX": "USDT-PAX", - "USDTTUSD": "USDT-TUSD", - "USDTUSDC": "USDT-USDC", - "USDTUST": "USDT-UST", - "UTKBTC": "UTK-BTC", - "UTKETH": "UTK-ETH", - "VAIUSDT": "VAI-USDT", - "VEEDBTC": "VEED-BTC", - "VEEDUSDT": "VEED-USDT", - "VEGAETH": "VEGA-ETH", - "VEGAUSDT": "VEGA-USDT", - "VELOUSDT": "VELO-USDT", - "VET3LUSDT": "VET3L-USDT", - "VET3SUSDT": "VET3S-USDT", - "VETBTC": "VET-BTC", - "VETETH": "VET-ETH", - "VETKCS": "VET-KCS", - "VETUSDT": "VET-USDT", - "VIDBTC": "VID-BTC", - "VIDTBTC": "VIDT-BTC", - "VIDTUSDT": "VIDT-USDT", - "VIDUSDT": "VID-USDT", - "VLXBTC": "VLX-BTC", - "VLXUSDT": "VLX-USDT", - "VRABTC": "VRA-BTC", - "VRAUSDT": "VRA-USDT", - "VRUSDT": "VR-USDT", - "VSYSBTC": "VSYS-BTC", - "VSYSUSDT": "VSYS-USDT", - "VXVUSDT": "VXV-USDT", - "WANBTC": "WAN-BTC", - "WANETH": "WAN-ETH", - "WAVESBTC": "WAVES-BTC", - "WAVESUSDT": "WAVES-USDT", - "WAXBTC": "WAX-BTC", - "WAXETH": "WAX-ETH", - "WAXUSDT": "WAX-USDT", - "WBTCBTC": "WBTC-BTC", - "WBTCETH": "WBTC-ETH", - "WESTBTC": "WEST-BTC", - "WESTUSDT": "WEST-USDT", - "WILDUSDT": "WILD-USDT", - "WINBTC": "WIN-BTC", - "WINTRX": "WIN-TRX", - "WINUSDT": "WIN-USDT", - "WNCGBTC": "WNCG-BTC", - "WNCGUSDT": "WNCG-USDT", - "WNXMBTC": "WNXM-BTC", - "WNXMUSDT": "WNXM-USDT", - "WOMUSDT": "WOM-USDT", - "WOOUSDT": "WOO-USDT", - "WRXBTC": "WRX-BTC", - "WRXUSDT": "WRX-USDT", - "WSIENNAUSDT": "WSIENNA-USDT", - "WTCBTC": "WTC-BTC", - "WXTBTC": "WXT-BTC", - "WXTUSDT": "WXT-USDT", - "XAVAUSDT": "XAVA-USDT", - "XCADUSDT": "XCAD-USDT", - "XCHUSDT": "XCH-USDT", - "XCURBTC": "XCUR-BTC", - "XCURUSDT": "XCUR-USDT", - "XDBBTC": "XDB-BTC", - "XDBUSDT": "XDB-USDT", - "XDCBTC": "XDC-BTC", - "XDCETH": "XDC-ETH", - "XDCUSDT": "XDC-USDT", - "XECUSDT": "XEC-USDT", - "XEDBTC": "XED-BTC", - "XEDUSDT": "XED-USDT", - "XEMBTC": "XEM-BTC", - "XEMUSDT": "XEM-USDT", - "XHVBTC": "XHV-BTC", - "XHVUSDT": "XHV-USDT", - "XLMBTC": "XLM-BTC", - "XLMETH": "XLM-ETH", - "XLMKCS": "XLM-KCS", - "XLMUSDT": "XLM-USDT", - "XMRBTC": "XMR-BTC", - "XMRETH": "XMR-ETH", - "XMRUSDT": "XMR-USDT", - "XNLUSDT": "XNL-USDT", - "XPRBTC": "XPR-BTC", - "XPRTUSDT": "XPRT-USDT", - "XPRUSDT": "XPR-USDT", - "XRP3LUSDT": "XRP3L-USDT", - "XRP3SUSDT": "XRP3S-USDT", - "XRPBTC": "XRP-BTC", - "XRPETH": "XRP-ETH", - "XRPKCS": "XRP-KCS", - "XRPPAX": "XRP-PAX", - "XRPTUSD": "XRP-TUSD", - "XRPUSDC": "XRP-USDC", - "XRPUSDT": "XRP-USDT", - "XSRUSDT": "XSR-USDT", - "XTAGUSDT": "XTAG-USDT", - "XTMUSDT": "XTM-USDT", - "XTZBTC": "XTZ-BTC", - "XTZKCS": "XTZ-KCS", - "XTZUSDT": "XTZ-USDT", - "XVSBTC": "XVS-BTC", - "XVSUSDT": "XVS-USDT", - "XYMBTC": "XYM-BTC", - "XYMUSDT": "XYM-USDT", - "XYOBTC": "XYO-BTC", - "XYOETH": "XYO-ETH", - "XYOUSDT": "XYO-USDT", - "YFDAIBTC": "YFDAI-BTC", - "YFDAIUSDT": "YFDAI-USDT", - "YFIUSDT": "YFI-USDT", - "YFIUST": "YFI-UST", - "YGGUSDT": "YGG-USDT", - "YLDUSDT": "YLD-USDT", - "YOPETH": "YOP-ETH", - "YOPUSDT": "YOP-USDT", - "ZCXBTC": "ZCX-BTC", - "ZCXUSDT": "ZCX-USDT", - "ZECBTC": "ZEC-BTC", - "ZECKCS": "ZEC-KCS", - "ZECUSDT": "ZEC-USDT", - "ZEEUSDT": "ZEE-USDT", - "ZENUSDT": "ZEN-USDT", - "ZILBTC": "ZIL-BTC", - "ZILETH": "ZIL-ETH", - "ZILUSDT": "ZIL-USDT", - "ZKTUSDT": "ZKT-USDT", - "ZORTUSDT": "ZORT-USDT", - "ZRXBTC": "ZRX-BTC", - "ZRXETH": "ZRX-ETH", + "FORMETH": "FORM-ETH", + "FORMUSDT": "FORM-USDT", + "FORTHUSDT": "FORTH-USDT", + "FRMUSDT": "FRM-USDT", + "FRONTBTC": "FRONT-BTC", + "FRONTUSDT": "FRONT-USDT", + "FTGUSDT": "FTG-USDT", + "FTM3LUSDT": "FTM3L-USDT", + "FTM3SUSDT": "FTM3S-USDT", + "FTMBTC": "FTM-BTC", + "FTMETH": "FTM-ETH", + "FTMUSDT": "FTM-USDT", + "FTTBTC": "FTT-BTC", + "FTTUSDT": "FTT-USDT", + "FXBTC": "FX-BTC", + "FXETH": "FX-ETH", + "FXSBTC": "FXS-BTC", + "FXSUSDT": "FXS-USDT", + "GAFIUSDT": "GAFI-USDT", + "GALAX3LUSDT": "GALAX3L-USDT", + "GALAX3SUSDT": "GALAX3S-USDT", + "GALAXUSDT": "GALAX-USDT", + "GASBTC": "GAS-BTC", + "GASUSDT": "GAS-USDT", + "GEEQUSDT": "GEEQ-USDT", + "GENSUSDT": "GENS-USDT", + "GHSTBTC": "GHST-BTC", + "GHSTUSDT": "GHST-USDT", + "GHXUSDT": "GHX-USDT", + "GLCHUSDT": "GLCH-USDT", + "GLMBTC": "GLM-BTC", + "GLMUSDT": "GLM-USDT", + "GLQBTC": "GLQ-BTC", + "GLQUSDT": "GLQ-USDT", + "GMBBTC": "GMB-BTC", + "GMBETH": "GMB-ETH", + "GMBUSDT": "GMB-USDT", + "GMEEUSDT": "GMEE-USDT", + "GOBTC": "GO-BTC", + "GODSUSDT": "GODS-USDT", + "GOETH": "GO-ETH", + "GOM2BTC": "GOM2-BTC", + "GOM2USDT": "GOM2-USDT", + "GOUSDT": "GO-USDT", + "GOVIBTC": "GOVI-BTC", + "GOVIUSDT": "GOVI-USDT", + "GRINBTC": "GRIN-BTC", + "GRINETH": "GRIN-ETH", + "GRINUSDT": "GRIN-USDT", + "GRTKCS": "GRT-KCS", + "GRTUSDT": "GRT-USDT", + "GSPIUSDT": "GSPI-USDT", + "GTCBTC": "GTC-BTC", + "GTCUSDT": "GTC-USDT", + "H3RO3SUSDT": "H3RO3S-USDT", + "HAIBTC": "HAI-BTC", + "HAIUSDT": "HAI-USDT", + "HAKAUSDT": "HAKA-USDT", + "HAPIUSDT": "HAPI-USDT", + "HARDUSDT": "HARD-USDT", + "HBARBTC": "HBAR-BTC", + "HBARUSDT": "HBAR-USDT", + "HEARTBTC": "HEART-BTC", + "HEARTUSDT": "HEART-USDT", + "HEGICBTC": "HEGIC-BTC", + "HEGICUSDT": "HEGIC-USDT", + "HEROUSDT": "HERO-USDT", + "HORDUSDT": "HORD-USDT", + "HOTCROSSUSDT": "HOTCROSS-USDT", + "HPBBTC": "HPB-BTC", + "HPBETH": "HPB-ETH", + "HTRBTC": "HTR-BTC", + "HTRUSDT": "HTR-USDT", + "HTUSDT": "HT-USDT", + "HYDRAUSDT": "HYDRA-USDT", + "HYVEBTC": "HYVE-BTC", + "HYVEUSDT": "HYVE-USDT", + "ICPBTC": "ICP-BTC", + "ICPUSDT": "ICP-USDT", + "IDEAUSDT": "IDEA-USDT", + "ILAUSDT": "ILA-USDT", + "ILVUSDT": "ILV-USDT", + "IMXUSDT": "IMX-USDT", + "INJBTC": "INJ-BTC", + "INJUSDT": "INJ-USDT", + "IOIUSDT": "IOI-USDT", + "IOSTBTC": "IOST-BTC", + "IOSTETH": "IOST-ETH", + "IOSTUSDT": "IOST-USDT", + "IOTXBTC": "IOTX-BTC", + "IOTXETH": "IOTX-ETH", + "IOTXUSDT": "IOTX-USDT", + "ISPUSDT": "ISP-USDT", + "IXSUSDT": "IXS-USDT", + "JARBTC": "JAR-BTC", + "JARUSDT": "JAR-USDT", + "JASMYUSDT": "JASMY-USDT", + "JSTUSDT": "JST-USDT", + "JUPETH": "JUP-ETH", + "JUPUSDT": "JUP-USDT", + "KAIBTC": "KAI-BTC", + "KAIETH": "KAI-ETH", + "KAIUSDT": "KAI-USDT", + "KARUSDT": "KAR-USDT", + "KATBTC": "KAT-BTC", + "KATUSDT": "KAT-USDT", + "KAVAUSDT": "KAVA-USDT", + "KCSBTC": "KCS-BTC", + "KCSETH": "KCS-ETH", + "KCSUSDT": "KCS-USDT", + "KDABTC": "KDA-BTC", + "KDAUSDT": "KDA-USDT", + "KDONUSDT": "KDON-USDT", + "KEEPBTC": "KEEP-BTC", + "KEEPUSDT": "KEEP-USDT", + "KEYBTC": "KEY-BTC", + "KEYETH": "KEY-ETH", + "KINUSDT": "KIN-USDT", + "KLAYBTC": "KLAY-BTC", + "KLAYUSDT": "KLAY-USDT", + "KLVBTC": "KLV-BTC", + "KLVTRX": "KLV-TRX", + "KLVUSDT": "KLV-USDT", + "KMAUSDT": "KMA-USDT", + "KMDBTC": "KMD-BTC", + "KMDUSDT": "KMD-USDT", + "KNCBTC": "KNC-BTC", + "KNCETH": "KNC-ETH", + "KOKUSDT": "KOK-USDT", + "KOLETH": "KOL-ETH", + "KOLUSDT": "KOL-USDT", + "KONOUSDT": "KONO-USDT", + "KRLBTC": "KRL-BTC", + "KRLUSDT": "KRL-USDT", + "KSMBTC": "KSM-BTC", + "KSMUSDT": "KSM-USDT", + "LABSETH": "LABS-ETH", + "LABSUSDT": "LABS-USDT", + "LACEETH": "LACE-ETH", + "LACEUSDT": "LACE-USDT", + "LAYERBTC": "LAYER-BTC", + "LAYERUSDT": "LAYER-USDT", + "LIKEUSDT": "LIKE-USDT", + "LINABTC": "LINA-BTC", + "LINAUSDT": "LINA-USDT", + "LINK3LUSDT": "LINK3L-USDT", + "LINK3SUSDT": "LINK3S-USDT", + "LINKBTC": "LINK-BTC", + "LINKKCS": "LINK-KCS", + "LINKUSDC": "LINK-USDC", + "LINKUSDT": "LINK-USDT", + "LITBTC": "LIT-BTC", + "LITHETH": "LITH-ETH", + "LITHUSDT": "LITH-USDT", + "LITUSDT": "LIT-USDT", + "LNCHXUSDT": "LNCHX-USDT", + "LOCGUSDT": "LOCG-USDT", + "LOCUSDT": "LOC-USDT", + "LOKIBTC": "LOKI-BTC", + "LOKIETH": "LOKI-ETH", + "LOKIUSDT": "LOKI-USDT", + "LONUSDT": "LON-USDT", + "LOOMBTC": "LOOM-BTC", + "LOOMETH": "LOOM-ETH", + "LPOOLBTC": "LPOOL-BTC", + "LPOOLUSDT": "LPOOL-USDT", + "LPTUSDT": "LPT-USDT", + "LRCBTC": "LRC-BTC", + "LRCETH": "LRC-ETH", + "LRCUSDT": "LRC-USDT", + "LSKBTC": "LSK-BTC", + "LSKETH": "LSK-ETH", + "LSSUSDT": "LSS-USDT", + "LTC3LUSDT": "LTC3L-USDT", + "LTC3SUSDT": "LTC3S-USDT", + "LTCBTC": "LTC-BTC", + "LTCETH": "LTC-ETH", + "LTCKCS": "LTC-KCS", + "LTCUSDC": "LTC-USDC", + "LTCUSDT": "LTC-USDT", + "LTOBTC": "LTO-BTC", + "LTOUSDT": "LTO-USDT", + "LTXBTC": "LTX-BTC", + "LTXUSDT": "LTX-USDT", + "LUNA3LUSDT": "LUNA3L-USDT", + "LUNA3SUSDT": "LUNA3S-USDT", + "LUNABTC": "LUNA-BTC", + "LUNAETH": "LUNA-ETH", + "LUNAKCS": "LUNA-KCS", + "LUNAUSDT": "LUNA-USDT", + "LUNAUST": "LUNA-UST", + "LYMBTC": "LYM-BTC", + "LYMETH": "LYM-ETH", + "LYMUSDT": "LYM-USDT", + "LYXEETH": "LYXE-ETH", + "LYXEUSDT": "LYXE-USDT", + "MAHABTC": "MAHA-BTC", + "MAHAUSDT": "MAHA-USDT", + "MAKIBTC": "MAKI-BTC", + "MAKIUSDT": "MAKI-USDT", + "MANA3LUSDT": "MANA3L-USDT", + "MANA3SUSDT": "MANA3S-USDT", + "MANABTC": "MANA-BTC", + "MANAETH": "MANA-ETH", + "MANAUSDT": "MANA-USDT", + "MANBTC": "MAN-BTC", + "MANUSDT": "MAN-USDT", + "MAPBTC": "MAP-BTC", + "MAPUSDT": "MAP-USDT", + "MARSHUSDT": "MARSH-USDT", + "MASKUSDT": "MASK-USDT", + "MATIC3LUSDT": "MATIC3L-USDT", + "MATIC3SUSDT": "MATIC3S-USDT", + "MATICBTC": "MATIC-BTC", + "MATICUSDT": "MATIC-USDT", + "MATICUST": "MATIC-UST", + "MATTERUSDT": "MATTER-USDT", + "MEMUSDT": "MEM-USDT", + "MFTBTC": "MFT-BTC", + "MFTUSDT": "MFT-USDT", + "MHCBTC": "MHC-BTC", + "MHCETH": "MHC-ETH", + "MHCUSDT": "MHC-USDT", + "MIRKCS": "MIR-KCS", + "MIRUSDT": "MIR-USDT", + "MIRUST": "MIR-UST", + "MITXBTC": "MITX-BTC", + "MITXUSDT": "MITX-USDT", + "MKRBTC": "MKR-BTC", + "MKRDAI": "MKR-DAI", + "MKRETH": "MKR-ETH", + "MKRUSDT": "MKR-USDT", + "MLKBTC": "MLK-BTC", + "MLKUSDT": "MLK-USDT", + "MLNBTC": "MLN-BTC", + "MLNUSDT": "MLN-USDT", + "MNETUSDT": "MNET-USDT", + "MNSTUSDT": "MNST-USDT", + "MNWUSDT": "MNW-USDT", + "MODEFIBTC": "MODEFI-BTC", + "MODEFIUSDT": "MODEFI-USDT", + "MONIUSDT": "MONI-USDT", + "MOVRETH": "MOVR-ETH", + "MOVRUSDT": "MOVR-USDT", + "MSWAPBTC": "MSWAP-BTC", + "MSWAPUSDT": "MSWAP-USDT", + "MTLBTC": "MTL-BTC", + "MTLUSDT": "MTL-USDT", + "MTRGUSDT": "MTRG-USDT", + "MTVBTC": "MTV-BTC", + "MTVETH": "MTV-ETH", + "MTVUSDT": "MTV-USDT", + "MVPBTC": "MVP-BTC", + "MVPETH": "MVP-ETH", + "MXCUSDT": "MXC-USDT", + "MXWUSDT": "MXW-USDT", + "NAKAUSDT": "NAKA-USDT", + "NANOBTC": "NANO-BTC", + "NANOETH": "NANO-ETH", + "NANOKCS": "NANO-KCS", + "NANOUSDT": "NANO-USDT", + "NDAUUSDT": "NDAU-USDT", + "NEAR3LUSDT": "NEAR3L-USDT", + "NEAR3SUSDT": "NEAR3S-USDT", + "NEARBTC": "NEAR-BTC", + "NEARUSDT": "NEAR-USDT", + "NEOBTC": "NEO-BTC", + "NEOETH": "NEO-ETH", + "NEOKCS": "NEO-KCS", + "NEOUSDT": "NEO-USDT", + "NFTBUSDT": "NFTB-USDT", + "NFTTRX": "NFT-TRX", + "NFTUSDT": "NFT-USDT", + "NGCUSDT": "NGC-USDT", + "NGLBTC": "NGL-BTC", + "NGLUSDT": "NGL-USDT", + "NGMUSDT": "NGM-USDT", + "NIFUSDT": "NIF-USDT", + "NIMBTC": "NIM-BTC", + "NIMETH": "NIM-ETH", + "NIMUSDT": "NIM-USDT", + "NKNBTC": "NKN-BTC", + "NKNUSDT": "NKN-USDT", + "NMRBTC": "NMR-BTC", + "NMRUSDT": "NMR-USDT", + "NOIABTC": "NOIA-BTC", + "NOIAUSDT": "NOIA-USDT", + "NORDBTC": "NORD-BTC", + "NORDUSDT": "NORD-USDT", + "NRGBTC": "NRG-BTC", + "NRGETH": "NRG-ETH", + "NTVRKUSDC": "NTVRK-USDC", + "NTVRKUSDT": "NTVRK-USDT", + "NUBTC": "NU-BTC", + "NULSBTC": "NULS-BTC", + "NULSETH": "NULS-ETH", + "NUMUSDT": "NUM-USDT", + "NUUSDT": "NU-USDT", + "NWCBTC": "NWC-BTC", + "NWCUSDT": "NWC-USDT", + "OCEANBTC": "OCEAN-BTC", + "OCEANETH": "OCEAN-ETH", + "ODDZUSDT": "ODDZ-USDT", + "OGNBTC": "OGN-BTC", + "OGNUSDT": "OGN-USDT", + "OLTBTC": "OLT-BTC", + "OLTETH": "OLT-ETH", + "OMBTC": "OM-BTC", + "OMGBTC": "OMG-BTC", + "OMGETH": "OMG-ETH", + "OMGUSDT": "OMG-USDT", + "OMUSDT": "OM-USDT", + "ONEBTC": "ONE-BTC", + "ONEUSDT": "ONE-USDT", + "ONTBTC": "ONT-BTC", + "ONTETH": "ONT-ETH", + "ONTUSDT": "ONT-USDT", + "OOEUSDT": "OOE-USDT", + "OPCTBTC": "OPCT-BTC", + "OPCTETH": "OPCT-ETH", + "OPCTUSDT": "OPCT-USDT", + "OPULUSDT": "OPUL-USDT", + "ORAIUSDT": "ORAI-USDT", + "ORBSBTC": "ORBS-BTC", + "ORBSUSDT": "ORBS-USDT", + "ORNUSDT": "ORN-USDT", + "OUSDBTC": "OUSD-BTC", + "OUSDUSDT": "OUSD-USDT", + "OXTBTC": "OXT-BTC", + "OXTETH": "OXT-ETH", + "OXTUSDT": "OXT-USDT", + "PAXGBTC": "PAXG-BTC", + "PAXGUSDT": "PAXG-USDT", + "PBRUSDT": "PBR-USDT", + "PBXUSDT": "PBX-USDT", + "PCXBTC": "PCX-BTC", + "PCXUSDT": "PCX-USDT", + "PDEXBTC": "PDEX-BTC", + "PDEXUSDT": "PDEX-USDT", + "PELUSDT": "PEL-USDT", + "PERPBTC": "PERP-BTC", + "PERPUSDT": "PERP-USDT", + "PHAETH": "PHA-ETH", + "PHAUSDT": "PHA-USDT", + "PHNXBTC": "PHNX-BTC", + "PHNXUSDT": "PHNX-USDT", + "PIVXBTC": "PIVX-BTC", + "PIVXETH": "PIVX-ETH", + "PIVXUSDT": "PIVX-USDT", + "PLAYBTC": "PLAY-BTC", + "PLAYETH": "PLAY-ETH", + "PLUUSDT": "PLU-USDT", + "PMONUSDT": "PMON-USDT", + "PNTBTC": "PNT-BTC", + "PNTUSDT": "PNT-USDT", + "POLCUSDT": "POLC-USDT", + "POLKBTC": "POLK-BTC", + "POLKUSDT": "POLK-USDT", + "POLSBTC": "POLS-BTC", + "POLSUSDT": "POLS-USDT", + "POLUSDT": "POL-USDT", + "POLXUSDT": "POLX-USDT", + "PONDBTC": "POND-BTC", + "PONDUSDT": "POND-USDT", + "POWRBTC": "POWR-BTC", + "POWRETH": "POWR-ETH", + "PPTBTC": "PPT-BTC", + "PPTETH": "PPT-ETH", + "PREBTC": "PRE-BTC", + "PREUSDT": "PRE-USDT", + "PROMBTC": "PROM-BTC", + "PROMUSDT": "PROM-USDT", + "PRQUSDT": "PRQ-USDT", + "PUNDIXBTC": "PUNDIX-BTC", + "PUNDIXUSDT": "PUNDIX-USDT", + "PUSHBTC": "PUSH-BTC", + "PUSHUSDT": "PUSH-USDT", + "PYRBTC": "PYR-BTC", + "PYRUSDT": "PYR-USDT", + "QIBTC": "QI-BTC", + "QIUSDT": "QI-USDT", + "QKCBTC": "QKC-BTC", + "QKCETH": "QKC-ETH", + "QNTUSDT": "QNT-USDT", + "QRDOETH": "QRDO-ETH", + "QRDOUSDT": "QRDO-USDT", + "QTUMBTC": "QTUM-BTC", + "QUICKBTC": "QUICK-BTC", + "QUICKUSDT": "QUICK-USDT", + "RBTCBTC": "RBTC-BTC", + "REAPUSDT": "REAP-USDT", + "REEFBTC": "REEF-BTC", + "REEFUSDT": "REEF-USDT", + "RENUSDT": "REN-USDT", + "REPBTC": "REP-BTC", + "REPETH": "REP-ETH", + "REPUSDT": "REP-USDT", + "REQBTC": "REQ-BTC", + "REQETH": "REQ-ETH", + "REQUSDT": "REQ-USDT", + "REVVBTC": "REVV-BTC", + "REVVUSDT": "REVV-USDT", + "RFOXUSDT": "RFOX-USDT", + "RFUELUSDT": "RFUEL-USDT", + "RIFBTC": "RIF-BTC", + "RLCBTC": "RLC-BTC", + "RLCUSDT": "RLC-USDT", + "RLYUSDT": "RLY-USDT", + "RMRKUSDT": "RMRK-USDT", + "RNDRBTC": "RNDR-BTC", + "RNDRUSDT": "RNDR-USDT", + "ROOBEEBTC": "ROOBEE-BTC", + "ROSEUSDT": "ROSE-USDT", + "ROSNUSDT": "ROSN-USDT", + "ROUTEUSDT": "ROUTE-USDT", + "RSRBTC": "RSR-BTC", + "RSRUSDT": "RSR-USDT", + "RUNEBTC": "RUNE-BTC", + "RUNEUSDT": "RUNE-USDT", + "RUSDT": "R-USDT", + "SAND3LUSDT": "SAND3L-USDT", + "SAND3SUSDT": "SAND3S-USDT", + "SANDUSDT": "SAND-USDT", + "SCLPBTC": "SCLP-BTC", + "SCLPUSDT": "SCLP-USDT", + "SDAOETH": "SDAO-ETH", + "SDAOUSDT": "SDAO-USDT", + "SDNETH": "SDN-ETH", + "SDNUSDT": "SDN-USDT", + "SENSOBTC": "SENSO-BTC", + "SENSOUSDT": "SENSO-USDT", + "SFPBTC": "SFP-BTC", + "SFPUSDT": "SFP-USDT", + "SFUNDUSDT": "SFUND-USDT", + "SHABTC": "SHA-BTC", + "SHAUSDT": "SHA-USDT", + "SHFTBTC": "SHFT-BTC", + "SHFTUSDT": "SHFT-USDT", + "SHIBDOGE": "SHIB-DOGE", + "SHIBUSDT": "SHIB-USDT", + "SHILLUSDT": "SHILL-USDT", + "SHRBTC": "SHR-BTC", + "SHRUSDT": "SHR-USDT", + "SKEYUSDT": "SKEY-USDT", + "SKLBTC": "SKL-BTC", + "SKLUSDT": "SKL-USDT", + "SKUBTC": "SKU-BTC", + "SKUUSDT": "SKU-USDT", + "SLIMUSDT": "SLIM-USDT", + "SLPUSDT": "SLP-USDT", + "SNTBTC": "SNT-BTC", + "SNTETH": "SNT-ETH", + "SNTVTBTC": "SNTVT-BTC", + "SNTVTETH": "SNTVT-ETH", + "SNXBTC": "SNX-BTC", + "SNXETH": "SNX-ETH", + "SNXUSDT": "SNX-USDT", + "SNXUST": "SNX-UST", + "SOL3LUSDT": "SOL3L-USDT", + "SOL3SUSDT": "SOL3S-USDT", + "SOLRUSDT": "SOLR-USDT", + "SOLUSDT": "SOL-USDT", + "SOLUST": "SOL-UST", + "SOLVEBTC": "SOLVE-BTC", + "SOLVEUSDT": "SOLVE-USDT", + "SOULBTC": "SOUL-BTC", + "SOULETH": "SOUL-ETH", + "SOULUSDT": "SOUL-USDT", + "SOVUSDT": "SOV-USDT", + "SPIUSDT": "SPI-USDT", + "SRKBTC": "SRK-BTC", + "SRKUSDT": "SRK-USDT", + "SRMBTC": "SRM-BTC", + "SRMUSDT": "SRM-USDT", + "STCBTC": "STC-BTC", + "STCUSDT": "STC-USDT", + "STMXUSDT": "STMX-USDT", + "STNDETH": "STND-ETH", + "STNDUSDT": "STND-USDT", + "STORJBTC": "STORJ-BTC", + "STORJETH": "STORJ-ETH", + "STORJUSDT": "STORJ-USDT", + "STRKBTC": "STRK-BTC", + "STRKETH": "STRK-ETH", + "STRONGUSDT": "STRONG-USDT", + "STXBTC": "STX-BTC", + "STXUSDT": "STX-USDT", + "SUKUBTC": "SUKU-BTC", + "SUKUUSDT": "SUKU-USDT", + "SUNUSDT": "SUN-USDT", + "SUPERBTC": "SUPER-BTC", + "SUPERUSDT": "SUPER-USDT", + "SUSDBTC": "SUSD-BTC", + "SUSDETH": "SUSD-ETH", + "SUSDUSDT": "SUSD-USDT", + "SUSHI3LUSDT": "SUSHI3L-USDT", + "SUSHI3SUSDT": "SUSHI3S-USDT", + "SUSHIUSDT": "SUSHI-USDT", + "SUTERBTC": "SUTER-BTC", + "SUTERUSDT": "SUTER-USDT", + "SWASHUSDT": "SWASH-USDT", + "SWINGBYBTC": "SWINGBY-BTC", + "SWINGBYUSDT": "SWINGBY-USDT", + "SWPUSDT": "SWP-USDT", + "SXPBTC": "SXP-BTC", + "SXPUSDT": "SXP-USDT", + "SYLOUSDT": "SYLO-USDT", + "TARAETH": "TARA-ETH", + "TARAUSDT": "TARA-USDT", + "TCPUSDT": "TCP-USDT", + "TELBTC": "TEL-BTC", + "TELETH": "TEL-ETH", + "TELUSDT": "TEL-USDT", + "THETAUSDT": "THETA-USDT", + "TIDALUSDT": "TIDAL-USDT", + "TIMEBTC": "TIME-BTC", + "TIMEETH": "TIME-ETH", + "TKOBTC": "TKO-BTC", + "TKOUSDT": "TKO-USDT", + "TKYBTC": "TKY-BTC", + "TKYETH": "TKY-ETH", + "TKYUSDT": "TKY-USDT", + "TLMBTC": "TLM-BTC", + "TLMETH": "TLM-ETH", + "TLMUSDT": "TLM-USDT", + "TLOSBTC": "TLOS-BTC", + "TLOSUSDT": "TLOS-USDT", + "TOKOBTC": "TOKO-BTC", + "TOKOKCS": "TOKO-KCS", + "TOKOUSDT": "TOKO-USDT", + "TOMOBTC": "TOMO-BTC", + "TOMOETH": "TOMO-ETH", + "TOMOUSDT": "TOMO-USDT", + "TONEBTC": "TONE-BTC", + "TONEETH": "TONE-ETH", + "TONEUSDT": "TONE-USDT", + "TOWERBTC": "TOWER-BTC", + "TOWERUSDT": "TOWER-USDT", + "TRACBTC": "TRAC-BTC", + "TRACETH": "TRAC-ETH", + "TRADEBTC": "TRADE-BTC", + "TRADEUSDT": "TRADE-USDT", + "TRBBTC": "TRB-BTC", + "TRBUSDT": "TRB-USDT", + "TRIASBTC": "TRIAS-BTC", + "TRIASUSDT": "TRIAS-USDT", + "TRIBEUSDT": "TRIBE-USDT", + "TRUBTC": "TRU-BTC", + "TRUUSDT": "TRU-USDT", + "TRVLUSDT": "TRVL-USDT", + "TRXBTC": "TRX-BTC", + "TRXETH": "TRX-ETH", + "TRXKCS": "TRX-KCS", + "TRXUSDT": "TRX-USDT", + "TVKBTC": "TVK-BTC", + "TVKUSDT": "TVK-USDT", + "TWTBTC": "TWT-BTC", + "TWTUSDT": "TWT-USDT", + "TXAUSDC": "TXA-USDC", + "TXAUSDT": "TXA-USDT", + "UBXETH": "UBX-ETH", + "UBXTUSDT": "UBXT-USDT", + "UBXUSDT": "UBX-USDT", + "UDOOETH": "UDOO-ETH", + "UFOUSDT": "UFO-USDT", + "UMAUSDT": "UMA-USDT", + "UMBUSDT": "UMB-USDT", + "UNBUSDT": "UNB-USDT", + "UNFIUSDT": "UNFI-USDT", + "UNI3LUSDT": "UNI3L-USDT", + "UNI3SUSDT": "UNI3S-USDT", + "UNICUSDT": "UNIC-USDT", + "UNIKCS": "UNI-KCS", + "UNIUSDT": "UNI-USDT", + "UNOBTC": "UNO-BTC", + "UNOUSDT": "UNO-USDT", + "UOSBTC": "UOS-BTC", + "UOSUSDT": "UOS-USDT", + "UQCBTC": "UQC-BTC", + "UQCETH": "UQC-ETH", + "USDCUSDT": "USDC-USDT", + "USDCUST": "USDC-UST", + "USDJUSDT": "USDJ-USDT", + "USDNUSDT": "USDN-USDT", + "USDTDAI": "USDT-DAI", + "USDTPAX": "USDT-PAX", + "USDTTUSD": "USDT-TUSD", + "USDTUSDC": "USDT-USDC", + "USDTUST": "USDT-UST", + "UTKBTC": "UTK-BTC", + "UTKETH": "UTK-ETH", + "VAIUSDT": "VAI-USDT", + "VEEDBTC": "VEED-BTC", + "VEEDUSDT": "VEED-USDT", + "VEGAETH": "VEGA-ETH", + "VEGAUSDT": "VEGA-USDT", + "VELOUSDT": "VELO-USDT", + "VET3LUSDT": "VET3L-USDT", + "VET3SUSDT": "VET3S-USDT", + "VETBTC": "VET-BTC", + "VETETH": "VET-ETH", + "VETKCS": "VET-KCS", + "VETUSDT": "VET-USDT", + "VIDBTC": "VID-BTC", + "VIDTBTC": "VIDT-BTC", + "VIDTUSDT": "VIDT-USDT", + "VIDUSDT": "VID-USDT", + "VLXBTC": "VLX-BTC", + "VLXUSDT": "VLX-USDT", + "VRABTC": "VRA-BTC", + "VRAUSDT": "VRA-USDT", + "VRUSDT": "VR-USDT", + "VSYSBTC": "VSYS-BTC", + "VSYSUSDT": "VSYS-USDT", + "VXVUSDT": "VXV-USDT", + "WANBTC": "WAN-BTC", + "WANETH": "WAN-ETH", + "WAVESBTC": "WAVES-BTC", + "WAVESUSDT": "WAVES-USDT", + "WAXBTC": "WAX-BTC", + "WAXETH": "WAX-ETH", + "WAXUSDT": "WAX-USDT", + "WBTCBTC": "WBTC-BTC", + "WBTCETH": "WBTC-ETH", + "WESTBTC": "WEST-BTC", + "WESTUSDT": "WEST-USDT", + "WILDUSDT": "WILD-USDT", + "WINBTC": "WIN-BTC", + "WINTRX": "WIN-TRX", + "WINUSDT": "WIN-USDT", + "WNCGBTC": "WNCG-BTC", + "WNCGUSDT": "WNCG-USDT", + "WNXMBTC": "WNXM-BTC", + "WNXMUSDT": "WNXM-USDT", + "WOMUSDT": "WOM-USDT", + "WOOUSDT": "WOO-USDT", + "WRXBTC": "WRX-BTC", + "WRXUSDT": "WRX-USDT", + "WSIENNAUSDT": "WSIENNA-USDT", + "WTCBTC": "WTC-BTC", + "WXTBTC": "WXT-BTC", + "WXTUSDT": "WXT-USDT", + "XAVAUSDT": "XAVA-USDT", + "XCADUSDT": "XCAD-USDT", + "XCHUSDT": "XCH-USDT", + "XCURBTC": "XCUR-BTC", + "XCURUSDT": "XCUR-USDT", + "XDBBTC": "XDB-BTC", + "XDBUSDT": "XDB-USDT", + "XDCBTC": "XDC-BTC", + "XDCETH": "XDC-ETH", + "XDCUSDT": "XDC-USDT", + "XECUSDT": "XEC-USDT", + "XEDBTC": "XED-BTC", + "XEDUSDT": "XED-USDT", + "XEMBTC": "XEM-BTC", + "XEMUSDT": "XEM-USDT", + "XHVBTC": "XHV-BTC", + "XHVUSDT": "XHV-USDT", + "XLMBTC": "XLM-BTC", + "XLMETH": "XLM-ETH", + "XLMKCS": "XLM-KCS", + "XLMUSDT": "XLM-USDT", + "XMRBTC": "XMR-BTC", + "XMRETH": "XMR-ETH", + "XMRUSDT": "XMR-USDT", + "XNLUSDT": "XNL-USDT", + "XPRBTC": "XPR-BTC", + "XPRTUSDT": "XPRT-USDT", + "XPRUSDT": "XPR-USDT", + "XRP3LUSDT": "XRP3L-USDT", + "XRP3SUSDT": "XRP3S-USDT", + "XRPBTC": "XRP-BTC", + "XRPETH": "XRP-ETH", + "XRPKCS": "XRP-KCS", + "XRPPAX": "XRP-PAX", + "XRPTUSD": "XRP-TUSD", + "XRPUSDC": "XRP-USDC", + "XRPUSDT": "XRP-USDT", + "XSRUSDT": "XSR-USDT", + "XTAGUSDT": "XTAG-USDT", + "XTMUSDT": "XTM-USDT", + "XTZBTC": "XTZ-BTC", + "XTZKCS": "XTZ-KCS", + "XTZUSDT": "XTZ-USDT", + "XVSBTC": "XVS-BTC", + "XVSUSDT": "XVS-USDT", + "XYMBTC": "XYM-BTC", + "XYMUSDT": "XYM-USDT", + "XYOBTC": "XYO-BTC", + "XYOETH": "XYO-ETH", + "XYOUSDT": "XYO-USDT", + "YFDAIBTC": "YFDAI-BTC", + "YFDAIUSDT": "YFDAI-USDT", + "YFIUSDT": "YFI-USDT", + "YFIUST": "YFI-UST", + "YGGUSDT": "YGG-USDT", + "YLDUSDT": "YLD-USDT", + "YOPETH": "YOP-ETH", + "YOPUSDT": "YOP-USDT", + "ZCXBTC": "ZCX-BTC", + "ZCXUSDT": "ZCX-USDT", + "ZECBTC": "ZEC-BTC", + "ZECKCS": "ZEC-KCS", + "ZECUSDT": "ZEC-USDT", + "ZEEUSDT": "ZEE-USDT", + "ZENUSDT": "ZEN-USDT", + "ZILBTC": "ZIL-BTC", + "ZILETH": "ZIL-ETH", + "ZILUSDT": "ZIL-USDT", + "ZKTUSDT": "ZKT-USDT", + "ZORTUSDT": "ZORT-USDT", + "ZRXBTC": "ZRX-BTC", + "ZRXETH": "ZRX-ETH", } func toLocalSymbol(symbol string) string { diff --git a/pkg/exchange/max/maxapi/account_test.go b/pkg/exchange/max/maxapi/account_test.go index f828eb1c4..e082586be 100644 --- a/pkg/exchange/max/maxapi/account_test.go +++ b/pkg/exchange/max/maxapi/account_test.go @@ -110,4 +110,3 @@ func TestAccountService_NewGetDepositHistoryRequest(t *testing.T) { assert.NotEmpty(t, deposits) t.Logf("deposits: %+v", deposits) } - diff --git a/pkg/exchange/max/maxapi/order_test.go b/pkg/exchange/max/maxapi/order_test.go index 778912916..0bfb887da 100644 --- a/pkg/exchange/max/maxapi/order_test.go +++ b/pkg/exchange/max/maxapi/order_test.go @@ -22,5 +22,3 @@ func integrationTestConfigured(t *testing.T, prefix string) (key, secret string, } return key, secret, ok } - - diff --git a/pkg/exchange/max/maxapi/v3/margin.go b/pkg/exchange/max/maxapi/v3/margin.go index 0b1e7995b..e69422a26 100644 --- a/pkg/exchange/max/maxapi/v3/margin.go +++ b/pkg/exchange/max/maxapi/v3/margin.go @@ -158,4 +158,3 @@ type MarginRepayRequest struct { currency string `param:"currency,slug,required"` amount string `param:"amount"` } - diff --git a/pkg/exchange/max/maxapi/websocket.go b/pkg/exchange/max/maxapi/websocket.go index c0af3c597..241adda6a 100644 --- a/pkg/exchange/max/maxapi/websocket.go +++ b/pkg/exchange/max/maxapi/websocket.go @@ -28,4 +28,3 @@ type WebsocketCommand struct { Action string `json:"action"` Subscriptions []Subscription `json:"subscriptions,omitempty"` } - diff --git a/pkg/exchange/max/maxapi/withdrawal.go b/pkg/exchange/max/maxapi/withdrawal.go index b5f30ee0e..7e3581539 100644 --- a/pkg/exchange/max/maxapi/withdrawal.go +++ b/pkg/exchange/max/maxapi/withdrawal.go @@ -56,8 +56,8 @@ type WithdrawalAddress struct { //go:generate GetRequest -url "v2/withdraw_addresses" -type GetWithdrawalAddressesRequest -responseType []WithdrawalAddress type GetWithdrawalAddressesRequest struct { - client requestgen.AuthenticatedAPIClient - currency string `param:"currency,required"` + client requestgen.AuthenticatedAPIClient + currency string `param:"currency,required"` } type WithdrawalService struct { diff --git a/pkg/exchange/max/ticker_test.go b/pkg/exchange/max/ticker_test.go index 68defb2f6..6ef459e1a 100644 --- a/pkg/exchange/max/ticker_test.go +++ b/pkg/exchange/max/ticker_test.go @@ -31,7 +31,6 @@ func TestExchange_QueryTickers_SomeSymbols(t *testing.T) { return } - e := New(key, secret) got, err := e.QueryTickers(context.Background(), "BTCUSDT", "ETHUSDT") if assert.NoError(t, err) { diff --git a/pkg/exchange/okex/exchange.go b/pkg/exchange/okex/exchange.go index b11ccf504..fe1b4deba 100644 --- a/pkg/exchange/okex/exchange.go +++ b/pkg/exchange/okex/exchange.go @@ -275,7 +275,7 @@ func (e *Exchange) NewStream() types.Stream { } func (e *Exchange) QueryKLines(ctx context.Context, symbol string, interval types.Interval, options types.KLineQueryOptions) ([]types.KLine, error) { - if err := marketDataLimiter.Wait(ctx) ; err != nil { + if err := marketDataLimiter.Wait(ctx); err != nil { return nil, err } diff --git a/pkg/exchange/okex/gensymbols.go b/pkg/exchange/okex/gensymbols.go index 4838f8f59..be27065e1 100644 --- a/pkg/exchange/okex/gensymbols.go +++ b/pkg/exchange/okex/gensymbols.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main diff --git a/pkg/exchange/okex/stream.go b/pkg/exchange/okex/stream.go index d803a6d30..348f48654 100644 --- a/pkg/exchange/okex/stream.go +++ b/pkg/exchange/okex/stream.go @@ -28,9 +28,9 @@ type Stream struct { client *okexapi.RestClient // public callbacks - candleEventCallbacks []func(candle Candle) - bookEventCallbacks []func(book BookEvent) - eventCallbacks []func(event WebSocketEvent) + candleEventCallbacks []func(candle Candle) + bookEventCallbacks []func(book BookEvent) + eventCallbacks []func(event WebSocketEvent) accountEventCallbacks []func(account okexapi.Account) orderDetailsEventCallbacks []func(orderDetails []okexapi.OrderDetails) diff --git a/pkg/exchange/okex/symbols.go b/pkg/exchange/okex/symbols.go index b8f0bce3d..dfbff1156 100644 --- a/pkg/exchange/okex/symbols.go +++ b/pkg/exchange/okex/symbols.go @@ -2,516 +2,515 @@ package okex var spotSymbolMap = map[string]string{ - "1INCHETH": "1INCH-ETH", - "1INCHUSDT": "1INCH-USDT", - "AACUSDT": "AAC-USDT", - "AAVEBTC": "AAVE-BTC", - "AAVEETH": "AAVE-ETH", - "AAVEUSDT": "AAVE-USDT", - "ABTBTC": "ABT-BTC", - "ABTETH": "ABT-ETH", - "ABTUSDT": "ABT-USDT", - "ACTBTC": "ACT-BTC", - "ACTUSDT": "ACT-USDT", - "ADABTC": "ADA-BTC", - "ADAETH": "ADA-ETH", - "ADAUSDT": "ADA-USDT", - "AEBTC": "AE-BTC", - "AEETH": "AE-ETH", - "AERGOBTC": "AERGO-BTC", - "AERGOUSDT": "AERGO-USDT", - "AEUSDT": "AE-USDT", - "AKITAUSDT": "AKITA-USDT", - "ALGOBTC": "ALGO-BTC", - "ALGOUSDK": "ALGO-USDK", - "ALGOUSDT": "ALGO-USDT", - "ALPHABTC": "ALPHA-BTC", - "ALPHAUSDT": "ALPHA-USDT", - "ALVUSDT": "ALV-USDT", - "ANCUSDT": "ANC-USDT", - "ANTBTC": "ANT-BTC", - "ANTUSDT": "ANT-USDT", - "ANWUSDT": "ANW-USDT", - "API3ETH": "API3-ETH", - "API3USDT": "API3-USDT", - "APIXUSDT": "APIX-USDT", - "APMUSDT": "APM-USDT", - "ARDRBTC": "ARDR-BTC", - "ARKBTC": "ARK-BTC", - "ARKUSDT": "ARK-USDT", - "ASTUSDT": "AST-USDT", - "ATOMBTC": "ATOM-BTC", - "ATOMETH": "ATOM-ETH", - "ATOMUSDT": "ATOM-USDT", + "1INCHETH": "1INCH-ETH", + "1INCHUSDT": "1INCH-USDT", + "AACUSDT": "AAC-USDT", + "AAVEBTC": "AAVE-BTC", + "AAVEETH": "AAVE-ETH", + "AAVEUSDT": "AAVE-USDT", + "ABTBTC": "ABT-BTC", + "ABTETH": "ABT-ETH", + "ABTUSDT": "ABT-USDT", + "ACTBTC": "ACT-BTC", + "ACTUSDT": "ACT-USDT", + "ADABTC": "ADA-BTC", + "ADAETH": "ADA-ETH", + "ADAUSDT": "ADA-USDT", + "AEBTC": "AE-BTC", + "AEETH": "AE-ETH", + "AERGOBTC": "AERGO-BTC", + "AERGOUSDT": "AERGO-USDT", + "AEUSDT": "AE-USDT", + "AKITAUSDT": "AKITA-USDT", + "ALGOBTC": "ALGO-BTC", + "ALGOUSDK": "ALGO-USDK", + "ALGOUSDT": "ALGO-USDT", + "ALPHABTC": "ALPHA-BTC", + "ALPHAUSDT": "ALPHA-USDT", + "ALVUSDT": "ALV-USDT", + "ANCUSDT": "ANC-USDT", + "ANTBTC": "ANT-BTC", + "ANTUSDT": "ANT-USDT", + "ANWUSDT": "ANW-USDT", + "API3ETH": "API3-ETH", + "API3USDT": "API3-USDT", + "APIXUSDT": "APIX-USDT", + "APMUSDT": "APM-USDT", + "ARDRBTC": "ARDR-BTC", + "ARKBTC": "ARK-BTC", + "ARKUSDT": "ARK-USDT", + "ASTUSDT": "AST-USDT", + "ATOMBTC": "ATOM-BTC", + "ATOMETH": "ATOM-ETH", + "ATOMUSDT": "ATOM-USDT", "AUCTIONUSDT": "AUCTION-USDT", - "AVAXBTC": "AVAX-BTC", - "AVAXETH": "AVAX-ETH", - "AVAXUSDT": "AVAX-USDT", - "BADGERBTC": "BADGER-BTC", - "BADGERUSDT": "BADGER-USDT", - "BALBTC": "BAL-BTC", - "BALUSDT": "BAL-USDT", - "BANDUSDT": "BAND-USDT", - "BATBTC": "BAT-BTC", - "BATUSDT": "BAT-USDT", - "BCDBTC": "BCD-BTC", - "BCDUSDT": "BCD-USDT", - "BCHABTC": "BCHA-BTC", - "BCHAUSDT": "BCHA-USDT", - "BCHBTC": "BCH-BTC", - "BCHUSDC": "BCH-USDC", - "BCHUSDK": "BCH-USDK", - "BCHUSDT": "BCH-USDT", - "BCXBTC": "BCX-BTC", - "BETHETH": "BETH-ETH", - "BETHUSDT": "BETH-USDT", - "BHPBTC": "BHP-BTC", - "BHPUSDT": "BHP-USDT", - "BLOCUSDT": "BLOC-USDT", - "BNTBTC": "BNT-BTC", - "BNTUSDT": "BNT-USDT", - "BOXUSDT": "BOX-USDT", - "BSVBTC": "BSV-BTC", - "BSVUSDC": "BSV-USDC", - "BSVUSDK": "BSV-USDK", - "BSVUSDT": "BSV-USDT", - "BTCDAI": "BTC-DAI", - "BTCUSDC": "BTC-USDC", - "BTCUSDK": "BTC-USDK", - "BTCUSDT": "BTC-USDT", - "BTGBTC": "BTG-BTC", - "BTGUSDT": "BTG-USDT", - "BTMBTC": "BTM-BTC", - "BTMETH": "BTM-ETH", - "BTMUSDT": "BTM-USDT", - "BTTBTC": "BTT-BTC", - "BTTUSDT": "BTT-USDT", - "CELOBTC": "CELO-BTC", - "CELOUSDT": "CELO-USDT", - "CELRUSDT": "CELR-USDT", - "CELUSDT": "CEL-USDT", - "CFXBTC": "CFX-BTC", - "CFXUSDT": "CFX-USDT", - "CHATUSDT": "CHAT-USDT", - "CHZBTC": "CHZ-BTC", - "CHZUSDT": "CHZ-USDT", - "CMTBTC": "CMT-BTC", - "CMTETH": "CMT-ETH", - "CMTUSDT": "CMT-USDT", - "CNTMUSDT": "CNTM-USDT", - "COMPBTC": "COMP-BTC", - "COMPUSDT": "COMP-USDT", - "CONVUSDT": "CONV-USDT", - "COVERUSDT": "COVER-USDT", - "CROBTC": "CRO-BTC", - "CROUSDK": "CRO-USDK", - "CROUSDT": "CRO-USDT", - "CRVBTC": "CRV-BTC", - "CRVETH": "CRV-ETH", - "CRVUSDT": "CRV-USDT", - "CSPRUSDT": "CSPR-USDT", - "CTCBTC": "CTC-BTC", - "CTCUSDT": "CTC-USDT", - "CTXCBTC": "CTXC-BTC", - "CTXCETH": "CTXC-ETH", - "CTXCUSDT": "CTXC-USDT", - "CVCBTC": "CVC-BTC", - "CVCUSDT": "CVC-USDT", - "CVPUSDT": "CVP-USDT", - "CVTBTC": "CVT-BTC", - "CVTUSDT": "CVT-USDT", - "DAIUSDT": "DAI-USDT", - "DAOUSDT": "DAO-USDT", - "DASHBTC": "DASH-BTC", - "DASHETH": "DASH-ETH", - "DASHUSDT": "DASH-USDT", - "DCRBTC": "DCR-BTC", - "DCRUSDT": "DCR-USDT", - "DEPUSDK": "DEP-USDK", - "DEPUSDT": "DEP-USDT", - "DGBBTC": "DGB-BTC", - "DGBUSDT": "DGB-USDT", - "DHTETH": "DHT-ETH", - "DHTUSDT": "DHT-USDT", - "DIAETH": "DIA-ETH", - "DIAUSDT": "DIA-USDT", - "DMDUSDT": "DMD-USDT", - "DMGUSDT": "DMG-USDT", - "DNABTC": "DNA-BTC", - "DNAUSDT": "DNA-USDT", - "DOGEBTC": "DOGE-BTC", - "DOGEETH": "DOGE-ETH", - "DOGEUSDK": "DOGE-USDK", - "DOGEUSDT": "DOGE-USDT", - "DORAUSDT": "DORA-USDT", - "DOTBTC": "DOT-BTC", - "DOTETH": "DOT-ETH", - "DOTUSDT": "DOT-USDT", - "ECUSDK": "EC-USDK", - "ECUSDT": "EC-USDT", - "EGLDBTC": "EGLD-BTC", - "EGLDUSDT": "EGLD-USDT", - "EGTBTC": "EGT-BTC", - "EGTETH": "EGT-ETH", - "EGTUSDT": "EGT-USDT", - "ELFBTC": "ELF-BTC", - "ELFUSDT": "ELF-USDT", - "EMUSDK": "EM-USDK", - "EMUSDT": "EM-USDT", - "ENJBTC": "ENJ-BTC", - "ENJUSDT": "ENJ-USDT", - "EOSBTC": "EOS-BTC", - "EOSETH": "EOS-ETH", - "EOSUSDC": "EOS-USDC", - "EOSUSDK": "EOS-USDK", - "EOSUSDT": "EOS-USDT", - "ETCBTC": "ETC-BTC", - "ETCETH": "ETC-ETH", - "ETCOKB": "ETC-OKB", - "ETCUSDC": "ETC-USDC", - "ETCUSDK": "ETC-USDK", - "ETCUSDT": "ETC-USDT", - "ETHBTC": "ETH-BTC", - "ETHDAI": "ETH-DAI", - "ETHUSDC": "ETH-USDC", - "ETHUSDK": "ETH-USDK", - "ETHUSDT": "ETH-USDT", - "ETMUSDT": "ETM-USDT", - "EXEUSDT": "EXE-USDT", - "FAIRUSDT": "FAIR-USDT", - "FILBTC": "FIL-BTC", - "FILETH": "FIL-ETH", - "FILUSDT": "FIL-USDT", - "FLMUSDT": "FLM-USDT", - "FLOWBTC": "FLOW-BTC", - "FLOWETH": "FLOW-ETH", - "FLOWUSDT": "FLOW-USDT", - "FORTHBTC": "FORTH-BTC", - "FORTHUSDT": "FORTH-USDT", - "FRONTETH": "FRONT-ETH", - "FRONTUSDT": "FRONT-USDT", - "FSNUSDK": "FSN-USDK", - "FSNUSDT": "FSN-USDT", - "FTMUSDK": "FTM-USDK", - "FTMUSDT": "FTM-USDT", - "FUNBTC": "FUN-BTC", - "GALUSDT": "GAL-USDT", - "GASBTC": "GAS-BTC", - "GASETH": "GAS-ETH", - "GASUSDT": "GAS-USDT", - "GHSTETH": "GHST-ETH", - "GHSTUSDT": "GHST-USDT", - "GLMBTC": "GLM-BTC", - "GLMUSDT": "GLM-USDT", - "GNXBTC": "GNX-BTC", - "GRTBTC": "GRT-BTC", - "GRTUSDT": "GRT-USDT", - "GTOBTC": "GTO-BTC", - "GTOUSDT": "GTO-USDT", - "GUSDBTC": "GUSD-BTC", - "GUSDUSDT": "GUSD-USDT", - "HBARBTC": "HBAR-BTC", - "HBARUSDK": "HBAR-USDK", - "HBARUSDT": "HBAR-USDT", - "HCBTC": "HC-BTC", - "HCUSDT": "HC-USDT", - "HDAOUSDK": "HDAO-USDK", - "HDAOUSDT": "HDAO-USDT", - "HEGICETH": "HEGIC-ETH", - "HEGICUSDT": "HEGIC-USDT", - "ICPBTC": "ICP-BTC", - "ICPUSDT": "ICP-USDT", - "ICXBTC": "ICX-BTC", - "ICXUSDT": "ICX-USDT", - "INTBTC": "INT-BTC", - "INTETH": "INT-ETH", - "INTUSDT": "INT-USDT", - "INXUSDT": "INX-USDT", - "IOSTBTC": "IOST-BTC", - "IOSTETH": "IOST-ETH", - "IOSTUSDT": "IOST-USDT", - "IOTABTC": "IOTA-BTC", - "IOTAUSDT": "IOTA-USDT", - "IQUSDT": "IQ-USDT", - "ITCUSDT": "ITC-USDT", - "JFIUSDT": "JFI-USDT", - "JSTUSDT": "JST-USDT", - "KANETH": "KAN-ETH", - "KANUSDT": "KAN-USDT", - "KCASHBTC": "KCASH-BTC", - "KCASHETH": "KCASH-ETH", - "KCASHUSDT": "KCASH-USDT", - "KINEUSDT": "KINE-USDT", - "KISHUUSDT": "KISHU-USDT", - "KLAYBTC": "KLAY-BTC", - "KLAYUSDT": "KLAY-USDT", - "KNCBTC": "KNC-BTC", - "KNCUSDT": "KNC-USDT", - "KONOUSDT": "KONO-USDT", - "KP3RUSDT": "KP3R-USDT", - "KSMBTC": "KSM-BTC", - "KSMETH": "KSM-ETH", - "KSMUSDT": "KSM-USDT", - "LAMBUSDK": "LAMB-USDK", - "LAMBUSDT": "LAMB-USDT", - "LATUSDT": "LAT-USDT", - "LBAUSDT": "LBA-USDT", - "LEOUSDK": "LEO-USDK", - "LEOUSDT": "LEO-USDT", - "LETUSDT": "LET-USDT", - "LINKBTC": "LINK-BTC", - "LINKETH": "LINK-ETH", - "LINKUSDT": "LINK-USDT", - "LMCHUSDT": "LMCH-USDT", - "LONETH": "LON-ETH", - "LONUSDT": "LON-USDT", - "LOONBTC": "LOON-BTC", - "LOONUSDT": "LOON-USDT", - "LPTUSDT": "LPT-USDT", - "LRCBTC": "LRC-BTC", - "LRCUSDT": "LRC-USDT", - "LSKBTC": "LSK-BTC", - "LSKUSDT": "LSK-USDT", - "LTCBTC": "LTC-BTC", - "LTCETH": "LTC-ETH", - "LTCOKB": "LTC-OKB", - "LTCUSDC": "LTC-USDC", - "LTCUSDK": "LTC-USDK", - "LTCUSDT": "LTC-USDT", - "LUNABTC": "LUNA-BTC", - "LUNAUSDT": "LUNA-USDT", - "MANABTC": "MANA-BTC", - "MANAETH": "MANA-ETH", - "MANAUSDT": "MANA-USDT", - "MASKUSDT": "MASK-USDT", - "MATICUSDT": "MATIC-USDT", - "MCOBTC": "MCO-BTC", - "MCOETH": "MCO-ETH", - "MCOUSDT": "MCO-USDT", - "MDAUSDT": "MDA-USDT", - "MDTUSDT": "MDT-USDT", - "MEMEUSDT": "MEME-USDT", - "MIRUSDT": "MIR-USDT", - "MITHBTC": "MITH-BTC", - "MITHETH": "MITH-ETH", - "MITHUSDT": "MITH-USDT", - "MKRBTC": "MKR-BTC", - "MKRETH": "MKR-ETH", - "MKRUSDT": "MKR-USDT", - "MLNUSDT": "MLN-USDT", - "MOFBTC": "MOF-BTC", - "MOFUSDT": "MOF-USDT", - "MXCUSDT": "MXC-USDT", - "MXTUSDT": "MXT-USDT", - "NANOBTC": "NANO-BTC", - "NANOUSDT": "NANO-USDT", - "NASBTC": "NAS-BTC", - "NASUSDT": "NAS-USDT", - "NDNUSDK": "NDN-USDK", - "NDNUSDT": "NDN-USDT", - "NEARBTC": "NEAR-BTC", - "NEARETH": "NEAR-ETH", - "NEARUSDT": "NEAR-USDT", - "NEOBTC": "NEO-BTC", - "NEOETH": "NEO-ETH", - "NEOUSDT": "NEO-USDT", - "NMRUSDT": "NMR-USDT", - "NUBTC": "NU-BTC", - "NULSBTC": "NULS-BTC", - "NULSETH": "NULS-ETH", - "NULSUSDT": "NULS-USDT", - "NUUSDT": "NU-USDT", - "OKBBTC": "OKB-BTC", - "OKBETH": "OKB-ETH", - "OKBUSDC": "OKB-USDC", - "OKBUSDK": "OKB-USDK", - "OKBUSDT": "OKB-USDT", - "OKTBTC": "OKT-BTC", - "OKTETH": "OKT-ETH", - "OKTUSDT": "OKT-USDT", - "OMETH": "OM-ETH", - "OMGBTC": "OMG-BTC", - "OMGUSDT": "OMG-USDT", - "OMUSDT": "OM-USDT", - "ONTBTC": "ONT-BTC", - "ONTETH": "ONT-ETH", - "ONTUSDT": "ONT-USDT", - "ORBSUSDK": "ORBS-USDK", - "ORBSUSDT": "ORBS-USDT", - "ORSUSDT": "ORS-USDT", - "OXTUSDT": "OXT-USDT", - "PAXBTC": "PAX-BTC", - "PAXUSDT": "PAX-USDT", - "PAYBTC": "PAY-BTC", - "PAYUSDT": "PAY-USDT", - "PERPUSDT": "PERP-USDT", - "PHAETH": "PHA-ETH", - "PHAUSDT": "PHA-USDT", - "PICKLEUSDT": "PICKLE-USDT", - "PLGUSDK": "PLG-USDK", - "PLGUSDT": "PLG-USDT", - "PMABTC": "PMA-BTC", - "PMAUSDK": "PMA-USDK", - "PNKUSDT": "PNK-USDT", - "POLSETH": "POLS-ETH", - "POLSUSDT": "POLS-USDT", - "PPTUSDT": "PPT-USDT", - "PROPSETH": "PROPS-ETH", - "PROPSUSDT": "PROPS-USDT", - "PRQUSDT": "PRQ-USDT", - "PSTBTC": "PST-BTC", - "PSTUSDT": "PST-USDT", - "QTUMBTC": "QTUM-BTC", - "QTUMETH": "QTUM-ETH", - "QTUMUSDT": "QTUM-USDT", - "QUNBTC": "QUN-BTC", - "QUNUSDT": "QUN-USDT", - "RENBTC": "REN-BTC", - "RENUSDT": "REN-USDT", - "REPETH": "REP-ETH", - "REPUSDT": "REP-USDT", - "RFUELETH": "RFUEL-ETH", - "RFUELUSDT": "RFUEL-USDT", - "RIOUSDT": "RIO-USDT", - "RNTUSDT": "RNT-USDT", - "ROADUSDK": "ROAD-USDK", - "ROADUSDT": "ROAD-USDT", - "RSRBTC": "RSR-BTC", - "RSRETH": "RSR-ETH", - "RSRUSDT": "RSR-USDT", - "RVNBTC": "RVN-BTC", - "RVNUSDT": "RVN-USDT", - "SANDUSDT": "SAND-USDT", - "SBTCBTC": "SBTC-BTC", - "SCBTC": "SC-BTC", - "SCUSDT": "SC-USDT", - "SFGUSDT": "SFG-USDT", - "SHIBUSDT": "SHIB-USDT", - "SKLUSDT": "SKL-USDT", - "SNCBTC": "SNC-BTC", - "SNTBTC": "SNT-BTC", - "SNTUSDT": "SNT-USDT", - "SNXETH": "SNX-ETH", - "SNXUSDT": "SNX-USDT", - "SOCUSDT": "SOC-USDT", - "SOLBTC": "SOL-BTC", - "SOLETH": "SOL-ETH", - "SOLUSDT": "SOL-USDT", - "SRMBTC": "SRM-BTC", - "SRMUSDT": "SRM-USDT", - "STORJUSDT": "STORJ-USDT", - "STRKUSDT": "STRK-USDT", - "STXBTC": "STX-BTC", - "STXUSDT": "STX-USDT", - "SUNETH": "SUN-ETH", - "SUNUSDT": "SUN-USDT", - "SUSHIETH": "SUSHI-ETH", - "SUSHIUSDT": "SUSHI-USDT", - "SWFTCBTC": "SWFTC-BTC", - "SWFTCETH": "SWFTC-ETH", - "SWFTCUSDT": "SWFTC-USDT", - "SWRVUSDT": "SWRV-USDT", - "TAIUSDT": "TAI-USDT", - "TCTBTC": "TCT-BTC", - "TCTUSDT": "TCT-USDT", - "THETABTC": "THETA-BTC", - "THETAUSDT": "THETA-USDT", - "TMTGBTC": "TMTG-BTC", - "TMTGUSDT": "TMTG-USDT", - "TOPCUSDT": "TOPC-USDT", - "TORNETH": "TORN-ETH", - "TORNUSDT": "TORN-USDT", - "TRADEETH": "TRADE-ETH", - "TRADEUSDT": "TRADE-USDT", - "TRAUSDT": "TRA-USDT", - "TRBUSDT": "TRB-USDT", - "TRIOBTC": "TRIO-BTC", - "TRIOUSDT": "TRIO-USDT", - "TRUEBTC": "TRUE-BTC", - "TRUEUSDT": "TRUE-USDT", - "TRXBTC": "TRX-BTC", - "TRXETH": "TRX-ETH", - "TRXUSDC": "TRX-USDC", - "TRXUSDK": "TRX-USDK", - "TRXUSDT": "TRX-USDT", - "TUSDBTC": "TUSD-BTC", - "TUSDUSDT": "TUSD-USDT", - "UBTCUSDT": "UBTC-USDT", - "UMAUSDT": "UMA-USDT", - "UNIBTC": "UNI-BTC", - "UNIETH": "UNI-ETH", - "UNIUSDT": "UNI-USDT", - "USDCBTC": "USDC-BTC", - "USDCUSDT": "USDC-USDT", - "USDTUSDK": "USDT-USDK", - "UTKUSDT": "UTK-USDT", - "VALUEETH": "VALUE-ETH", - "VALUEUSDT": "VALUE-USDT", - "VELOUSDT": "VELO-USDT", - "VIBBTC": "VIB-BTC", - "VIBUSDT": "VIB-USDT", - "VITEBTC": "VITE-BTC", - "VRAUSDT": "VRA-USDT", - "VSYSBTC": "VSYS-BTC", - "VSYSUSDK": "VSYS-USDK", - "VSYSUSDT": "VSYS-USDT", - "WAVESBTC": "WAVES-BTC", - "WAVESUSDT": "WAVES-USDT", - "WBTCBTC": "WBTC-BTC", - "WBTCETH": "WBTC-ETH", - "WBTCUSDT": "WBTC-USDT", - "WGRTUSDK": "WGRT-USDK", - "WGRTUSDT": "WGRT-USDT", - "WINGUSDT": "WING-USDT", - "WNXMUSDT": "WNXM-USDT", - "WTCBTC": "WTC-BTC", - "WTCUSDT": "WTC-USDT", - "WXTBTC": "WXT-BTC", - "WXTUSDK": "WXT-USDK", - "WXTUSDT": "WXT-USDT", - "XCHBTC": "XCH-BTC", - "XCHUSDT": "XCH-USDT", - "XEMBTC": "XEM-BTC", - "XEMETH": "XEM-ETH", - "XEMUSDT": "XEM-USDT", - "XLMBTC": "XLM-BTC", - "XLMETH": "XLM-ETH", - "XLMUSDT": "XLM-USDT", - "XMRBTC": "XMR-BTC", - "XMRETH": "XMR-ETH", - "XMRUSDT": "XMR-USDT", - "XPOUSDT": "XPO-USDT", - "XPRUSDT": "XPR-USDT", - "XRPBTC": "XRP-BTC", - "XRPETH": "XRP-ETH", - "XRPOKB": "XRP-OKB", - "XRPUSDC": "XRP-USDC", - "XRPUSDK": "XRP-USDK", - "XRPUSDT": "XRP-USDT", - "XSRUSDT": "XSR-USDT", - "XTZBTC": "XTZ-BTC", - "XTZUSDT": "XTZ-USDT", - "XUCUSDT": "XUC-USDT", - "YEEUSDT": "YEE-USDT", - "YFIBTC": "YFI-BTC", - "YFIETH": "YFI-ETH", - "YFIIUSDT": "YFII-USDT", - "YFIUSDT": "YFI-USDT", - "YOUBTC": "YOU-BTC", - "YOUUSDT": "YOU-USDT", - "YOYOUSDT": "YOYO-USDT", - "ZECBTC": "ZEC-BTC", - "ZECETH": "ZEC-ETH", - "ZECUSDT": "ZEC-USDT", - "ZENBTC": "ZEN-BTC", - "ZENUSDT": "ZEN-USDT", - "ZILBTC": "ZIL-BTC", - "ZILETH": "ZIL-ETH", - "ZILUSDT": "ZIL-USDT", - "ZKSUSDT": "ZKS-USDT", - "ZRXBTC": "ZRX-BTC", - "ZRXETH": "ZRX-ETH", - "ZRXUSDT": "ZRX-USDT", - "ZYROUSDT": "ZYRO-USDT", + "AVAXBTC": "AVAX-BTC", + "AVAXETH": "AVAX-ETH", + "AVAXUSDT": "AVAX-USDT", + "BADGERBTC": "BADGER-BTC", + "BADGERUSDT": "BADGER-USDT", + "BALBTC": "BAL-BTC", + "BALUSDT": "BAL-USDT", + "BANDUSDT": "BAND-USDT", + "BATBTC": "BAT-BTC", + "BATUSDT": "BAT-USDT", + "BCDBTC": "BCD-BTC", + "BCDUSDT": "BCD-USDT", + "BCHABTC": "BCHA-BTC", + "BCHAUSDT": "BCHA-USDT", + "BCHBTC": "BCH-BTC", + "BCHUSDC": "BCH-USDC", + "BCHUSDK": "BCH-USDK", + "BCHUSDT": "BCH-USDT", + "BCXBTC": "BCX-BTC", + "BETHETH": "BETH-ETH", + "BETHUSDT": "BETH-USDT", + "BHPBTC": "BHP-BTC", + "BHPUSDT": "BHP-USDT", + "BLOCUSDT": "BLOC-USDT", + "BNTBTC": "BNT-BTC", + "BNTUSDT": "BNT-USDT", + "BOXUSDT": "BOX-USDT", + "BSVBTC": "BSV-BTC", + "BSVUSDC": "BSV-USDC", + "BSVUSDK": "BSV-USDK", + "BSVUSDT": "BSV-USDT", + "BTCDAI": "BTC-DAI", + "BTCUSDC": "BTC-USDC", + "BTCUSDK": "BTC-USDK", + "BTCUSDT": "BTC-USDT", + "BTGBTC": "BTG-BTC", + "BTGUSDT": "BTG-USDT", + "BTMBTC": "BTM-BTC", + "BTMETH": "BTM-ETH", + "BTMUSDT": "BTM-USDT", + "BTTBTC": "BTT-BTC", + "BTTUSDT": "BTT-USDT", + "CELOBTC": "CELO-BTC", + "CELOUSDT": "CELO-USDT", + "CELRUSDT": "CELR-USDT", + "CELUSDT": "CEL-USDT", + "CFXBTC": "CFX-BTC", + "CFXUSDT": "CFX-USDT", + "CHATUSDT": "CHAT-USDT", + "CHZBTC": "CHZ-BTC", + "CHZUSDT": "CHZ-USDT", + "CMTBTC": "CMT-BTC", + "CMTETH": "CMT-ETH", + "CMTUSDT": "CMT-USDT", + "CNTMUSDT": "CNTM-USDT", + "COMPBTC": "COMP-BTC", + "COMPUSDT": "COMP-USDT", + "CONVUSDT": "CONV-USDT", + "COVERUSDT": "COVER-USDT", + "CROBTC": "CRO-BTC", + "CROUSDK": "CRO-USDK", + "CROUSDT": "CRO-USDT", + "CRVBTC": "CRV-BTC", + "CRVETH": "CRV-ETH", + "CRVUSDT": "CRV-USDT", + "CSPRUSDT": "CSPR-USDT", + "CTCBTC": "CTC-BTC", + "CTCUSDT": "CTC-USDT", + "CTXCBTC": "CTXC-BTC", + "CTXCETH": "CTXC-ETH", + "CTXCUSDT": "CTXC-USDT", + "CVCBTC": "CVC-BTC", + "CVCUSDT": "CVC-USDT", + "CVPUSDT": "CVP-USDT", + "CVTBTC": "CVT-BTC", + "CVTUSDT": "CVT-USDT", + "DAIUSDT": "DAI-USDT", + "DAOUSDT": "DAO-USDT", + "DASHBTC": "DASH-BTC", + "DASHETH": "DASH-ETH", + "DASHUSDT": "DASH-USDT", + "DCRBTC": "DCR-BTC", + "DCRUSDT": "DCR-USDT", + "DEPUSDK": "DEP-USDK", + "DEPUSDT": "DEP-USDT", + "DGBBTC": "DGB-BTC", + "DGBUSDT": "DGB-USDT", + "DHTETH": "DHT-ETH", + "DHTUSDT": "DHT-USDT", + "DIAETH": "DIA-ETH", + "DIAUSDT": "DIA-USDT", + "DMDUSDT": "DMD-USDT", + "DMGUSDT": "DMG-USDT", + "DNABTC": "DNA-BTC", + "DNAUSDT": "DNA-USDT", + "DOGEBTC": "DOGE-BTC", + "DOGEETH": "DOGE-ETH", + "DOGEUSDK": "DOGE-USDK", + "DOGEUSDT": "DOGE-USDT", + "DORAUSDT": "DORA-USDT", + "DOTBTC": "DOT-BTC", + "DOTETH": "DOT-ETH", + "DOTUSDT": "DOT-USDT", + "ECUSDK": "EC-USDK", + "ECUSDT": "EC-USDT", + "EGLDBTC": "EGLD-BTC", + "EGLDUSDT": "EGLD-USDT", + "EGTBTC": "EGT-BTC", + "EGTETH": "EGT-ETH", + "EGTUSDT": "EGT-USDT", + "ELFBTC": "ELF-BTC", + "ELFUSDT": "ELF-USDT", + "EMUSDK": "EM-USDK", + "EMUSDT": "EM-USDT", + "ENJBTC": "ENJ-BTC", + "ENJUSDT": "ENJ-USDT", + "EOSBTC": "EOS-BTC", + "EOSETH": "EOS-ETH", + "EOSUSDC": "EOS-USDC", + "EOSUSDK": "EOS-USDK", + "EOSUSDT": "EOS-USDT", + "ETCBTC": "ETC-BTC", + "ETCETH": "ETC-ETH", + "ETCOKB": "ETC-OKB", + "ETCUSDC": "ETC-USDC", + "ETCUSDK": "ETC-USDK", + "ETCUSDT": "ETC-USDT", + "ETHBTC": "ETH-BTC", + "ETHDAI": "ETH-DAI", + "ETHUSDC": "ETH-USDC", + "ETHUSDK": "ETH-USDK", + "ETHUSDT": "ETH-USDT", + "ETMUSDT": "ETM-USDT", + "EXEUSDT": "EXE-USDT", + "FAIRUSDT": "FAIR-USDT", + "FILBTC": "FIL-BTC", + "FILETH": "FIL-ETH", + "FILUSDT": "FIL-USDT", + "FLMUSDT": "FLM-USDT", + "FLOWBTC": "FLOW-BTC", + "FLOWETH": "FLOW-ETH", + "FLOWUSDT": "FLOW-USDT", + "FORTHBTC": "FORTH-BTC", + "FORTHUSDT": "FORTH-USDT", + "FRONTETH": "FRONT-ETH", + "FRONTUSDT": "FRONT-USDT", + "FSNUSDK": "FSN-USDK", + "FSNUSDT": "FSN-USDT", + "FTMUSDK": "FTM-USDK", + "FTMUSDT": "FTM-USDT", + "FUNBTC": "FUN-BTC", + "GALUSDT": "GAL-USDT", + "GASBTC": "GAS-BTC", + "GASETH": "GAS-ETH", + "GASUSDT": "GAS-USDT", + "GHSTETH": "GHST-ETH", + "GHSTUSDT": "GHST-USDT", + "GLMBTC": "GLM-BTC", + "GLMUSDT": "GLM-USDT", + "GNXBTC": "GNX-BTC", + "GRTBTC": "GRT-BTC", + "GRTUSDT": "GRT-USDT", + "GTOBTC": "GTO-BTC", + "GTOUSDT": "GTO-USDT", + "GUSDBTC": "GUSD-BTC", + "GUSDUSDT": "GUSD-USDT", + "HBARBTC": "HBAR-BTC", + "HBARUSDK": "HBAR-USDK", + "HBARUSDT": "HBAR-USDT", + "HCBTC": "HC-BTC", + "HCUSDT": "HC-USDT", + "HDAOUSDK": "HDAO-USDK", + "HDAOUSDT": "HDAO-USDT", + "HEGICETH": "HEGIC-ETH", + "HEGICUSDT": "HEGIC-USDT", + "ICPBTC": "ICP-BTC", + "ICPUSDT": "ICP-USDT", + "ICXBTC": "ICX-BTC", + "ICXUSDT": "ICX-USDT", + "INTBTC": "INT-BTC", + "INTETH": "INT-ETH", + "INTUSDT": "INT-USDT", + "INXUSDT": "INX-USDT", + "IOSTBTC": "IOST-BTC", + "IOSTETH": "IOST-ETH", + "IOSTUSDT": "IOST-USDT", + "IOTABTC": "IOTA-BTC", + "IOTAUSDT": "IOTA-USDT", + "IQUSDT": "IQ-USDT", + "ITCUSDT": "ITC-USDT", + "JFIUSDT": "JFI-USDT", + "JSTUSDT": "JST-USDT", + "KANETH": "KAN-ETH", + "KANUSDT": "KAN-USDT", + "KCASHBTC": "KCASH-BTC", + "KCASHETH": "KCASH-ETH", + "KCASHUSDT": "KCASH-USDT", + "KINEUSDT": "KINE-USDT", + "KISHUUSDT": "KISHU-USDT", + "KLAYBTC": "KLAY-BTC", + "KLAYUSDT": "KLAY-USDT", + "KNCBTC": "KNC-BTC", + "KNCUSDT": "KNC-USDT", + "KONOUSDT": "KONO-USDT", + "KP3RUSDT": "KP3R-USDT", + "KSMBTC": "KSM-BTC", + "KSMETH": "KSM-ETH", + "KSMUSDT": "KSM-USDT", + "LAMBUSDK": "LAMB-USDK", + "LAMBUSDT": "LAMB-USDT", + "LATUSDT": "LAT-USDT", + "LBAUSDT": "LBA-USDT", + "LEOUSDK": "LEO-USDK", + "LEOUSDT": "LEO-USDT", + "LETUSDT": "LET-USDT", + "LINKBTC": "LINK-BTC", + "LINKETH": "LINK-ETH", + "LINKUSDT": "LINK-USDT", + "LMCHUSDT": "LMCH-USDT", + "LONETH": "LON-ETH", + "LONUSDT": "LON-USDT", + "LOONBTC": "LOON-BTC", + "LOONUSDT": "LOON-USDT", + "LPTUSDT": "LPT-USDT", + "LRCBTC": "LRC-BTC", + "LRCUSDT": "LRC-USDT", + "LSKBTC": "LSK-BTC", + "LSKUSDT": "LSK-USDT", + "LTCBTC": "LTC-BTC", + "LTCETH": "LTC-ETH", + "LTCOKB": "LTC-OKB", + "LTCUSDC": "LTC-USDC", + "LTCUSDK": "LTC-USDK", + "LTCUSDT": "LTC-USDT", + "LUNABTC": "LUNA-BTC", + "LUNAUSDT": "LUNA-USDT", + "MANABTC": "MANA-BTC", + "MANAETH": "MANA-ETH", + "MANAUSDT": "MANA-USDT", + "MASKUSDT": "MASK-USDT", + "MATICUSDT": "MATIC-USDT", + "MCOBTC": "MCO-BTC", + "MCOETH": "MCO-ETH", + "MCOUSDT": "MCO-USDT", + "MDAUSDT": "MDA-USDT", + "MDTUSDT": "MDT-USDT", + "MEMEUSDT": "MEME-USDT", + "MIRUSDT": "MIR-USDT", + "MITHBTC": "MITH-BTC", + "MITHETH": "MITH-ETH", + "MITHUSDT": "MITH-USDT", + "MKRBTC": "MKR-BTC", + "MKRETH": "MKR-ETH", + "MKRUSDT": "MKR-USDT", + "MLNUSDT": "MLN-USDT", + "MOFBTC": "MOF-BTC", + "MOFUSDT": "MOF-USDT", + "MXCUSDT": "MXC-USDT", + "MXTUSDT": "MXT-USDT", + "NANOBTC": "NANO-BTC", + "NANOUSDT": "NANO-USDT", + "NASBTC": "NAS-BTC", + "NASUSDT": "NAS-USDT", + "NDNUSDK": "NDN-USDK", + "NDNUSDT": "NDN-USDT", + "NEARBTC": "NEAR-BTC", + "NEARETH": "NEAR-ETH", + "NEARUSDT": "NEAR-USDT", + "NEOBTC": "NEO-BTC", + "NEOETH": "NEO-ETH", + "NEOUSDT": "NEO-USDT", + "NMRUSDT": "NMR-USDT", + "NUBTC": "NU-BTC", + "NULSBTC": "NULS-BTC", + "NULSETH": "NULS-ETH", + "NULSUSDT": "NULS-USDT", + "NUUSDT": "NU-USDT", + "OKBBTC": "OKB-BTC", + "OKBETH": "OKB-ETH", + "OKBUSDC": "OKB-USDC", + "OKBUSDK": "OKB-USDK", + "OKBUSDT": "OKB-USDT", + "OKTBTC": "OKT-BTC", + "OKTETH": "OKT-ETH", + "OKTUSDT": "OKT-USDT", + "OMETH": "OM-ETH", + "OMGBTC": "OMG-BTC", + "OMGUSDT": "OMG-USDT", + "OMUSDT": "OM-USDT", + "ONTBTC": "ONT-BTC", + "ONTETH": "ONT-ETH", + "ONTUSDT": "ONT-USDT", + "ORBSUSDK": "ORBS-USDK", + "ORBSUSDT": "ORBS-USDT", + "ORSUSDT": "ORS-USDT", + "OXTUSDT": "OXT-USDT", + "PAXBTC": "PAX-BTC", + "PAXUSDT": "PAX-USDT", + "PAYBTC": "PAY-BTC", + "PAYUSDT": "PAY-USDT", + "PERPUSDT": "PERP-USDT", + "PHAETH": "PHA-ETH", + "PHAUSDT": "PHA-USDT", + "PICKLEUSDT": "PICKLE-USDT", + "PLGUSDK": "PLG-USDK", + "PLGUSDT": "PLG-USDT", + "PMABTC": "PMA-BTC", + "PMAUSDK": "PMA-USDK", + "PNKUSDT": "PNK-USDT", + "POLSETH": "POLS-ETH", + "POLSUSDT": "POLS-USDT", + "PPTUSDT": "PPT-USDT", + "PROPSETH": "PROPS-ETH", + "PROPSUSDT": "PROPS-USDT", + "PRQUSDT": "PRQ-USDT", + "PSTBTC": "PST-BTC", + "PSTUSDT": "PST-USDT", + "QTUMBTC": "QTUM-BTC", + "QTUMETH": "QTUM-ETH", + "QTUMUSDT": "QTUM-USDT", + "QUNBTC": "QUN-BTC", + "QUNUSDT": "QUN-USDT", + "RENBTC": "REN-BTC", + "RENUSDT": "REN-USDT", + "REPETH": "REP-ETH", + "REPUSDT": "REP-USDT", + "RFUELETH": "RFUEL-ETH", + "RFUELUSDT": "RFUEL-USDT", + "RIOUSDT": "RIO-USDT", + "RNTUSDT": "RNT-USDT", + "ROADUSDK": "ROAD-USDK", + "ROADUSDT": "ROAD-USDT", + "RSRBTC": "RSR-BTC", + "RSRETH": "RSR-ETH", + "RSRUSDT": "RSR-USDT", + "RVNBTC": "RVN-BTC", + "RVNUSDT": "RVN-USDT", + "SANDUSDT": "SAND-USDT", + "SBTCBTC": "SBTC-BTC", + "SCBTC": "SC-BTC", + "SCUSDT": "SC-USDT", + "SFGUSDT": "SFG-USDT", + "SHIBUSDT": "SHIB-USDT", + "SKLUSDT": "SKL-USDT", + "SNCBTC": "SNC-BTC", + "SNTBTC": "SNT-BTC", + "SNTUSDT": "SNT-USDT", + "SNXETH": "SNX-ETH", + "SNXUSDT": "SNX-USDT", + "SOCUSDT": "SOC-USDT", + "SOLBTC": "SOL-BTC", + "SOLETH": "SOL-ETH", + "SOLUSDT": "SOL-USDT", + "SRMBTC": "SRM-BTC", + "SRMUSDT": "SRM-USDT", + "STORJUSDT": "STORJ-USDT", + "STRKUSDT": "STRK-USDT", + "STXBTC": "STX-BTC", + "STXUSDT": "STX-USDT", + "SUNETH": "SUN-ETH", + "SUNUSDT": "SUN-USDT", + "SUSHIETH": "SUSHI-ETH", + "SUSHIUSDT": "SUSHI-USDT", + "SWFTCBTC": "SWFTC-BTC", + "SWFTCETH": "SWFTC-ETH", + "SWFTCUSDT": "SWFTC-USDT", + "SWRVUSDT": "SWRV-USDT", + "TAIUSDT": "TAI-USDT", + "TCTBTC": "TCT-BTC", + "TCTUSDT": "TCT-USDT", + "THETABTC": "THETA-BTC", + "THETAUSDT": "THETA-USDT", + "TMTGBTC": "TMTG-BTC", + "TMTGUSDT": "TMTG-USDT", + "TOPCUSDT": "TOPC-USDT", + "TORNETH": "TORN-ETH", + "TORNUSDT": "TORN-USDT", + "TRADEETH": "TRADE-ETH", + "TRADEUSDT": "TRADE-USDT", + "TRAUSDT": "TRA-USDT", + "TRBUSDT": "TRB-USDT", + "TRIOBTC": "TRIO-BTC", + "TRIOUSDT": "TRIO-USDT", + "TRUEBTC": "TRUE-BTC", + "TRUEUSDT": "TRUE-USDT", + "TRXBTC": "TRX-BTC", + "TRXETH": "TRX-ETH", + "TRXUSDC": "TRX-USDC", + "TRXUSDK": "TRX-USDK", + "TRXUSDT": "TRX-USDT", + "TUSDBTC": "TUSD-BTC", + "TUSDUSDT": "TUSD-USDT", + "UBTCUSDT": "UBTC-USDT", + "UMAUSDT": "UMA-USDT", + "UNIBTC": "UNI-BTC", + "UNIETH": "UNI-ETH", + "UNIUSDT": "UNI-USDT", + "USDCBTC": "USDC-BTC", + "USDCUSDT": "USDC-USDT", + "USDTUSDK": "USDT-USDK", + "UTKUSDT": "UTK-USDT", + "VALUEETH": "VALUE-ETH", + "VALUEUSDT": "VALUE-USDT", + "VELOUSDT": "VELO-USDT", + "VIBBTC": "VIB-BTC", + "VIBUSDT": "VIB-USDT", + "VITEBTC": "VITE-BTC", + "VRAUSDT": "VRA-USDT", + "VSYSBTC": "VSYS-BTC", + "VSYSUSDK": "VSYS-USDK", + "VSYSUSDT": "VSYS-USDT", + "WAVESBTC": "WAVES-BTC", + "WAVESUSDT": "WAVES-USDT", + "WBTCBTC": "WBTC-BTC", + "WBTCETH": "WBTC-ETH", + "WBTCUSDT": "WBTC-USDT", + "WGRTUSDK": "WGRT-USDK", + "WGRTUSDT": "WGRT-USDT", + "WINGUSDT": "WING-USDT", + "WNXMUSDT": "WNXM-USDT", + "WTCBTC": "WTC-BTC", + "WTCUSDT": "WTC-USDT", + "WXTBTC": "WXT-BTC", + "WXTUSDK": "WXT-USDK", + "WXTUSDT": "WXT-USDT", + "XCHBTC": "XCH-BTC", + "XCHUSDT": "XCH-USDT", + "XEMBTC": "XEM-BTC", + "XEMETH": "XEM-ETH", + "XEMUSDT": "XEM-USDT", + "XLMBTC": "XLM-BTC", + "XLMETH": "XLM-ETH", + "XLMUSDT": "XLM-USDT", + "XMRBTC": "XMR-BTC", + "XMRETH": "XMR-ETH", + "XMRUSDT": "XMR-USDT", + "XPOUSDT": "XPO-USDT", + "XPRUSDT": "XPR-USDT", + "XRPBTC": "XRP-BTC", + "XRPETH": "XRP-ETH", + "XRPOKB": "XRP-OKB", + "XRPUSDC": "XRP-USDC", + "XRPUSDK": "XRP-USDK", + "XRPUSDT": "XRP-USDT", + "XSRUSDT": "XSR-USDT", + "XTZBTC": "XTZ-BTC", + "XTZUSDT": "XTZ-USDT", + "XUCUSDT": "XUC-USDT", + "YEEUSDT": "YEE-USDT", + "YFIBTC": "YFI-BTC", + "YFIETH": "YFI-ETH", + "YFIIUSDT": "YFII-USDT", + "YFIUSDT": "YFI-USDT", + "YOUBTC": "YOU-BTC", + "YOUUSDT": "YOU-USDT", + "YOYOUSDT": "YOYO-USDT", + "ZECBTC": "ZEC-BTC", + "ZECETH": "ZEC-ETH", + "ZECUSDT": "ZEC-USDT", + "ZENBTC": "ZEN-BTC", + "ZENUSDT": "ZEN-USDT", + "ZILBTC": "ZIL-BTC", + "ZILETH": "ZIL-ETH", + "ZILUSDT": "ZIL-USDT", + "ZKSUSDT": "ZKS-USDT", + "ZRXBTC": "ZRX-BTC", + "ZRXETH": "ZRX-ETH", + "ZRXUSDT": "ZRX-USDT", + "ZYROUSDT": "ZYRO-USDT", } - diff --git a/pkg/fixedpoint/dec.go b/pkg/fixedpoint/dec.go index 64f55f70c..f25c20d78 100644 --- a/pkg/fixedpoint/dec.go +++ b/pkg/fixedpoint/dec.go @@ -282,7 +282,7 @@ func (dn Value) FormatString(prec int) string { // decimal within dec := nd + e decimals := digits[dec:min(dec+prec, nd)] - return sign + digits[:dec] + "." + decimals + strings.Repeat("0", max(0, prec - len(decimals))) + return sign + digits[:dec] + "." + decimals + strings.Repeat("0", max(0, prec-len(decimals))) } else if 0 < dn.exp && dn.exp <= digitsMax { // decimal to the right if prec > 0 { @@ -403,7 +403,7 @@ func (dn Value) FormatPercentage(prec int) string { // decimal within dec := nd + e decimals := digits[dec:min(dec+prec, nd)] - return sign + digits[:dec] + "." + decimals + strings.Repeat("0", max(0, prec - len(decimals))) + "%" + return sign + digits[:dec] + "." + decimals + strings.Repeat("0", max(0, prec-len(decimals))) + "%" } else if 0 < exp && exp <= digitsMax { // decimal to the right if prec > 0 { diff --git a/pkg/fixedpoint/dec_legacy_test.go b/pkg/fixedpoint/dec_legacy_test.go index 412c2e875..848b77ec6 100644 --- a/pkg/fixedpoint/dec_legacy_test.go +++ b/pkg/fixedpoint/dec_legacy_test.go @@ -19,7 +19,7 @@ func TestNumFractionalDigitsLegacy(t *testing.T) { }, { name: "zero underflow", - v: MustNewFromString("1e-100"), + v: MustNewFromString("1e-100"), want: 0, }, } diff --git a/pkg/fixedpoint/dec_test.go b/pkg/fixedpoint/dec_test.go index da23679ad..5f63fe7c5 100644 --- a/pkg/fixedpoint/dec_test.go +++ b/pkg/fixedpoint/dec_test.go @@ -1,10 +1,10 @@ package fixedpoint import ( + "encoding/json" + "github.com/stretchr/testify/assert" "math/big" "testing" - "github.com/stretchr/testify/assert" - "encoding/json" ) const Delta = 1e-9 @@ -167,7 +167,6 @@ func TestJson(t *testing.T) { assert.Equal(t, "0.00000000", p.FormatString(8)) assert.Equal(t, "0.00000000", string(e)) - _ = json.Unmarshal([]byte("0.00153917575"), &p) assert.Equal(t, "0.00153917", p.FormatString(8)) diff --git a/pkg/grpc/convert.go b/pkg/grpc/convert.go index e8354cf1d..928cbd449 100644 --- a/pkg/grpc/convert.go +++ b/pkg/grpc/convert.go @@ -97,14 +97,14 @@ func toSide(side pb.Side) types.SideType { func toSubmitOrders(pbOrders []*pb.SubmitOrder) (submitOrders []types.SubmitOrder) { for _, pbOrder := range pbOrders { submitOrders = append(submitOrders, types.SubmitOrder{ - ClientOrderID: pbOrder.ClientOrderId, - Symbol: pbOrder.Symbol, - Side: toSide(pbOrder.Side), - Type: toOrderType(pbOrder.OrderType), - Price: fixedpoint.MustNewFromString(pbOrder.Price), - Quantity: fixedpoint.MustNewFromString(pbOrder.Quantity), - StopPrice: fixedpoint.MustNewFromString(pbOrder.StopPrice), - TimeInForce: "", + ClientOrderID: pbOrder.ClientOrderId, + Symbol: pbOrder.Symbol, + Side: toSide(pbOrder.Side), + Type: toOrderType(pbOrder.OrderType), + Price: fixedpoint.MustNewFromString(pbOrder.Price), + Quantity: fixedpoint.MustNewFromString(pbOrder.Quantity), + StopPrice: fixedpoint.MustNewFromString(pbOrder.StopPrice), + TimeInForce: "", }) } diff --git a/pkg/indicator/dmi_test.go b/pkg/indicator/dmi_test.go index c5755e1b5..62d2b0aa7 100644 --- a/pkg/indicator/dmi_test.go +++ b/pkg/indicator/dmi_test.go @@ -2,8 +2,8 @@ package indicator import ( "encoding/json" - "testing" "fmt" + "testing" "github.com/c9s/bbgo/pkg/fixedpoint" "github.com/c9s/bbgo/pkg/types" @@ -51,27 +51,31 @@ func Test_DMI(t *testing.T) { return klines } - type output struct{dip float64; dim float64; adx float64} + type output struct { + dip float64 + dim float64 + adx float64 + } tests := []struct { - name string + name string klines []types.KLine - want output - next output - total int + want output + next output + total int }{ { - name: "test_dmi", + name: "test_dmi", klines: buildKLines(highb, lowb, clozeb), - want: output{dip: 4.85114, dim: 1.339736, adx: 37.857156}, - next: output{dip: 4.813853, dim: 1.67532, adx: 36.111434}, + want: output{dip: 4.85114, dim: 1.339736, adx: 37.857156}, + next: output{dip: 4.813853, dim: 1.67532, adx: 36.111434}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { dmi := &DMI{ IntervalWindow: types.IntervalWindow{Window: 5}, - ADXSmoothing: 14, + ADXSmoothing: 14, } dmi.calculateAndUpdate(tt.klines) assert.InDelta(t, dmi.GetDIPlus().Last(), tt.want.dip, Delta) diff --git a/pkg/service/account.go b/pkg/service/account.go index 2c599ca08..d92493266 100644 --- a/pkg/service/account.go +++ b/pkg/service/account.go @@ -41,22 +41,22 @@ func (s *AccountService) InsertAsset(time time.Time, session string, name types. price_in_usd, is_margin, is_isolated, isolated_symbol) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);`, - session, - name, - account, - time, - v.Currency, - v.InUSD, - v.InBTC, - v.Total, - v.Available, - v.Locked, - v.Borrowed, - v.NetAsset, - v.PriceInUSD, - isMargin, - isIsolatedMargin, - isolatedMarginSymbol) + session, + name, + account, + time, + v.Currency, + v.InUSD, + v.InBTC, + v.Total, + v.Available, + v.Locked, + v.Borrowed, + v.NetAsset, + v.PriceInUSD, + isMargin, + isIsolatedMargin, + isolatedMarginSymbol) err = multierr.Append(err, _err) // successful request diff --git a/pkg/service/persistence_json.go b/pkg/service/persistence_json.go index c125ea041..3bea74556 100644 --- a/pkg/service/persistence_json.go +++ b/pkg/service/persistence_json.go @@ -76,4 +76,3 @@ func (store JsonStore) Save(val interface{}) error { p := filepath.Join(store.Directory, store.ID) + ".json" return ioutil.WriteFile(p, data, 0666) } - diff --git a/pkg/service/reward.go b/pkg/service/reward.go index c90f73abb..739391cbd 100644 --- a/pkg/service/reward.go +++ b/pkg/service/reward.go @@ -93,8 +93,6 @@ func (s *RewardService) Sync(ctx context.Context, exchange types.Exchange) error return <-errC } - - type CurrencyPositionMap map[string]fixedpoint.Value func (s *RewardService) AggregateUnspentCurrencyPosition(ctx context.Context, ex types.ExchangeName, since time.Time) (CurrencyPositionMap, error) { @@ -128,8 +126,8 @@ func (s *RewardService) QueryUnspentSince(ctx context.Context, ex types.Exchange sql += " ORDER BY created_at ASC" rows, err := s.DB.NamedQueryContext(ctx, sql, map[string]interface{}{ - "exchange": ex, - "since": since, + "exchange": ex, + "since": since, }) if err != nil { diff --git a/pkg/service/reward_test.go b/pkg/service/reward_test.go index b136724c6..2485d8199 100644 --- a/pkg/service/reward_test.go +++ b/pkg/service/reward_test.go @@ -74,7 +74,6 @@ func TestRewardService_InsertAndQueryUnspent(t *testing.T) { assert.Equal(t, types.RewardCommission, rewards[0].Type) } - func TestRewardService_AggregateUnspentCurrencyPosition(t *testing.T) { db, err := prepareDB(t) if err != nil { @@ -126,7 +125,7 @@ func TestRewardService_AggregateUnspentCurrencyPosition(t *testing.T) { }) assert.NoError(t, err) - currencyPositions, err := service.AggregateUnspentCurrencyPosition(ctx, types.ExchangeMax, now.Add(-10 * time.Second)) + currencyPositions, err := service.AggregateUnspentCurrencyPosition(ctx, types.ExchangeMax, now.Add(-10*time.Second)) assert.NoError(t, err) assert.NotEmpty(t, currencyPositions) assert.Len(t, currencyPositions, 2) diff --git a/pkg/service/withdraw_test.go b/pkg/service/withdraw_test.go index 3be439933..3328a0eee 100644 --- a/pkg/service/withdraw_test.go +++ b/pkg/service/withdraw_test.go @@ -7,8 +7,8 @@ import ( "github.com/jmoiron/sqlx" "github.com/stretchr/testify/assert" - "github.com/c9s/bbgo/pkg/types" "github.com/c9s/bbgo/pkg/fixedpoint" + "github.com/c9s/bbgo/pkg/types" ) func TestWithdrawService(t *testing.T) { diff --git a/pkg/strategy/factorzoo/strategy.go b/pkg/strategy/factorzoo/strategy.go index f4b049418..5ed9d7a84 100644 --- a/pkg/strategy/factorzoo/strategy.go +++ b/pkg/strategy/factorzoo/strategy.go @@ -154,7 +154,7 @@ func (s *Strategy) Run(ctx context.Context, orderExecutor bbgo.OrderExecutor, se // s.pvDivergence.OnUpdate(func(corr float64) { // //fmt.Printf("now we've got corr: %f\n", corr) // }) - windowSize := 360/s.Interval.Minutes() + windowSize := 360 / s.Interval.Minutes() if windowSize == 0 { windowSize = 3 } diff --git a/pkg/strategy/wall/strategy.go b/pkg/strategy/wall/strategy.go index 86fb05b86..fedd99623 100644 --- a/pkg/strategy/wall/strategy.go +++ b/pkg/strategy/wall/strategy.go @@ -340,7 +340,6 @@ func (s *Strategy) Run(ctx context.Context, orderExecutor bbgo.OrderExecutor, se log.WithError(err).Errorf("can not place order") } - if err := s.activeAdjustmentOrders.GracefulCancel(ctx, s.session.Exchange); err != nil { log.WithError(err).Errorf("graceful cancel order error") } diff --git a/pkg/strategy/xmaker/state.go b/pkg/strategy/xmaker/state.go index 097a8ebe8..1b6169730 100644 --- a/pkg/strategy/xmaker/state.go +++ b/pkg/strategy/xmaker/state.go @@ -11,10 +11,10 @@ type State struct { CoveredPosition fixedpoint.Value `json:"coveredPosition,omitempty"` // Deprecated: - Position *types.Position `json:"position,omitempty"` + Position *types.Position `json:"position,omitempty"` // Deprecated: - ProfitStats ProfitStats `json:"profitStats,omitempty"` + ProfitStats ProfitStats `json:"profitStats,omitempty"` } type ProfitStats struct { diff --git a/pkg/types/indicator.go b/pkg/types/indicator.go index 23e4a942c..0a3765818 100644 --- a/pkg/types/indicator.go +++ b/pkg/types/indicator.go @@ -11,40 +11,40 @@ import ( // Super basic Series type that simply holds the float64 data // with size limit (the only difference compare to float64slice) type Queue struct { - arr []float64 - size int + arr []float64 + size int } func NewQueue(size int) *Queue { - return &Queue{ - arr: make([]float64, 0, size), - size: size, - } + return &Queue{ + arr: make([]float64, 0, size), + size: size, + } } func (inc *Queue) Last() float64 { - if len(inc.arr) == 0 { - return 0 - } - return inc.arr[len(inc.arr)-1] + if len(inc.arr) == 0 { + return 0 + } + return inc.arr[len(inc.arr)-1] } func (inc *Queue) Index(i int) float64 { - if len(inc.arr)-i-1 < 0 { - return 0 - } - return inc.arr[len(inc.arr)-i-1] + if len(inc.arr)-i-1 < 0 { + return 0 + } + return inc.arr[len(inc.arr)-i-1] } func (inc *Queue) Length() int { - return len(inc.arr) + return len(inc.arr) } func (inc *Queue) Update(v float64) { - inc.arr = append(inc.arr, v) - if len(inc.arr) > inc.size { - inc.arr = inc.arr[len(inc.arr)-inc.size:] - } + inc.arr = append(inc.arr, v) + if len(inc.arr) > inc.size { + inc.arr = inc.arr[len(inc.arr)-inc.size:] + } } var _ Series = &Queue{} diff --git a/pkg/types/market_test.go b/pkg/types/market_test.go index 5ecb70772..d0544e9ba 100644 --- a/pkg/types/market_test.go +++ b/pkg/types/market_test.go @@ -91,7 +91,7 @@ func Test_formatPrice(t *testing.T) { { name: "no fraction", args: args{ - price: fixedpoint.NewFromFloat(10.0), + price: fixedpoint.NewFromFloat(10.0), tickSize: fixedpoint.NewFromFloat(0.001), }, want: "10.000", @@ -99,7 +99,7 @@ func Test_formatPrice(t *testing.T) { { name: "fraction truncate", args: args{ - price: fixedpoint.NewFromFloat(2.334), + price: fixedpoint.NewFromFloat(2.334), tickSize: fixedpoint.NewFromFloat(0.01), }, want: "2.33", @@ -107,7 +107,7 @@ func Test_formatPrice(t *testing.T) { { name: "fraction", args: args{ - price: fixedpoint.NewFromFloat(2.334), + price: fixedpoint.NewFromFloat(2.334), tickSize: fixedpoint.NewFromFloat(0.0001), }, want: "2.3340", @@ -115,7 +115,7 @@ func Test_formatPrice(t *testing.T) { { name: "more fraction", args: args{ - price: fixedpoint.MustNewFromString("2.1234567898888"), + price: fixedpoint.MustNewFromString("2.1234567898888"), tickSize: fixedpoint.NewFromFloat(0.0001), }, want: "2.1234", @@ -125,7 +125,7 @@ func Test_formatPrice(t *testing.T) { binanceFormatRE := regexp.MustCompile("^([0-9]{1,20})(.[0-9]{1,20})?$") for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got := formatPrice(tt.args.price, tt.args.tickSize); + got := formatPrice(tt.args.price, tt.args.tickSize) if got != tt.want { t.Errorf("formatPrice() = %v, want %v", got, tt.want) } @@ -135,10 +135,9 @@ func Test_formatPrice(t *testing.T) { } } - func Test_formatQuantity(t *testing.T) { type args struct { - quantity fixedpoint.Value + quantity fixedpoint.Value tickSize fixedpoint.Value } tests := []struct { @@ -183,7 +182,7 @@ func Test_formatQuantity(t *testing.T) { binanceFormatRE := regexp.MustCompile("^([0-9]{1,20})(.[0-9]{1,20})?$") for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got := formatQuantity(tt.args.quantity, tt.args.tickSize); + got := formatQuantity(tt.args.quantity, tt.args.tickSize) if got != tt.want { t.Errorf("formatQuantity() = %v, want %v", got, tt.want) } diff --git a/pkg/types/profit.go b/pkg/types/profit.go index 0e7a87014..f783f996a 100644 --- a/pkg/types/profit.go +++ b/pkg/types/profit.go @@ -227,7 +227,6 @@ func NewProfitStats(market Market) *ProfitStats { } } - func (s *ProfitStats) Init(market Market) { s.Symbol = market.Symbol s.BaseCurrency = market.BaseCurrency diff --git a/pkg/types/sort_test.go b/pkg/types/sort_test.go index 02eadbcb3..4e5171ace 100644 --- a/pkg/types/sort_test.go +++ b/pkg/types/sort_test.go @@ -8,24 +8,24 @@ import ( ) func TestSortTradesAscending(t *testing.T) { - var trades = []Trade { + var trades = []Trade{ { - ID: 1, - Symbol: "BTCUSDT", - Side: SideTypeBuy, - IsBuyer: false, - IsMaker: false, - Time: Time(time.Unix(2000, 0 )), + ID: 1, + Symbol: "BTCUSDT", + Side: SideTypeBuy, + IsBuyer: false, + IsMaker: false, + Time: Time(time.Unix(2000, 0)), }, { - ID: 2, - Symbol: "BTCUSDT", - Side: SideTypeBuy, - IsBuyer: false, - IsMaker: false, - Time: Time(time.Unix(1000, 0 )), + ID: 2, + Symbol: "BTCUSDT", + Side: SideTypeBuy, + IsBuyer: false, + IsMaker: false, + Time: Time(time.Unix(1000, 0)), }, } trades = SortTradesAscending(trades) - assert.True(t ,trades[0].Time.Before(trades[1].Time.Time())) + assert.True(t, trades[0].Time.Before(trades[1].Time.Time())) } diff --git a/pkg/util/exchange_icon.go b/pkg/util/exchange_icon.go index a5e4c54fa..c7d868219 100644 --- a/pkg/util/exchange_icon.go +++ b/pkg/util/exchange_icon.go @@ -1,2 +1 @@ package util - diff --git a/pkg/version/dev.go b/pkg/version/dev.go index 74f7b7979..071b787c9 100644 --- a/pkg/version/dev.go +++ b/pkg/version/dev.go @@ -1,3 +1,4 @@ +//go:build !release // +build !release package version @@ -5,4 +6,3 @@ package version const Version = "v1.35.0-daaa3352-dev" const VersionGitRef = "daaa3352" - diff --git a/pkg/version/version.go b/pkg/version/version.go index 5131ec14c..8a443c987 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -1,3 +1,4 @@ +//go:build release // +build release package version @@ -5,4 +6,3 @@ package version const Version = "v1.35.0-daaa3352" const VersionGitRef = "daaa3352" - From ba1342cbc33189d22123c192dcef695e0bd6ce49 Mon Sep 17 00:00:00 2001 From: zenix Date: Fri, 17 Jun 2022 16:04:23 +0900 Subject: [PATCH 2/6] feature: add pre-commit --- .github/workflows/go.yml | 11 ++++- .markdownlint.yaml | 5 ++ .pre-commit-config.yaml | 21 ++++++++ README.md | 48 +++++++++++++++---- pkg/bbgo/environment.go | 9 ++-- pkg/bbgo/strategycontroller_callbacks.go | 10 +++- pkg/datasource/coinmarketcap/v1/client.go | 1 + .../glassnode/glassnodeapi/client.go | 1 + pkg/exchange/binance/binanceapi/client.go | 1 + pkg/exchange/binance/exchange.go | 3 +- pkg/exchange/ftx/exchange.go | 5 +- pkg/exchange/ftx/ftxapi/client.go | 1 + pkg/exchange/ftx/rest.go | 1 + pkg/exchange/ftx/stream.go | 5 +- pkg/exchange/ftx/websocket_messages_test.go | 1 + pkg/exchange/kucoin/exchange.go | 3 +- pkg/exchange/kucoin/kucoinapi/client.go | 1 + pkg/exchange/max/exchange.go | 5 +- pkg/exchange/max/maxapi/restapi.go | 2 + pkg/exchange/max/stream.go | 7 ++- pkg/exchange/okex/exchange.go | 3 +- pkg/exchange/okex/okexapi/client.go | 1 + pkg/fixedpoint/convert.go | 8 ++-- pkg/interact/auth.go | 3 +- pkg/migrations/mysql/migration_api_test.go | 4 +- pkg/migrations/sqlite3/migration_api_test.go | 4 +- pkg/server/envvars.go | 4 ++ pkg/service/persistence_redis.go | 1 + 28 files changed, 134 insertions(+), 35 deletions(-) create mode 100644 .markdownlint.yaml create mode 100644 .pre-commit-config.yaml diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 59879902b..517b2f8dc 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -17,7 +17,7 @@ jobs: env: MYSQL_DATABASE: bbgo MYSQL_USER: "root" - MYSQL_PASSWORD: "root" + MYSQL_PASSWORD: "root" # pragma: allowlist secret steps: @@ -48,6 +48,15 @@ jobs: with: go-version: 1.18 + - name: Run pre-commit + run: | + pip install pre-commit + go get -v -u github.com/go-critic/go-critic/cmd/gocritic + pre-commit install-hooks + pre-commit run markdownlint --files=README.md --verbose + pre-commit run go-fmt --all-files --verbose + pre-commit run go-critic --all-files --verbose + - name: Install Migration Tool run: go install github.com/c9s/rockhopper/cmd/rockhopper@v1.2.1 diff --git a/.markdownlint.yaml b/.markdownlint.yaml new file mode 100644 index 000000000..cd599ae32 --- /dev/null +++ b/.markdownlint.yaml @@ -0,0 +1,5 @@ +default: true +extends: null +MD033: false +MD010: false +MD013: false diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..2a4c2857e --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,21 @@ +--- +repos: + # Secret Detection + - repo: https://github.com/Yelp/detect-secrets + rev: v1.2.0 + hooks: + - id: detect-secrets + args: ['--exclude-secrets', '3899a918953e01bfe218116cdfeccbed579e26275c4a89abcbc70d2cb9e9bbb8'] + exclude: pacakge.lock.json + # Markdown + - repo: https://github.com/igorshubovych/markdownlint-cli + rev: v0.31.1 + hooks: + - id: markdownlint + # Go + - repo: https://github.com/dnephin/pre-commit-golang + rev: v0.5.0 + hooks: + - id: go-fmt + args: ['-l'] + - id: go-critic diff --git a/README.md b/README.md index 6c425bd52..2e896b34f 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ A trading bot framework written in Go. The name bbgo comes from the BB8 bot in t ## Current Status [![Go](https://github.com/c9s/bbgo/actions/workflows/go.yml/badge.svg?branch=main)](https://github.com/c9s/bbgo/actions/workflows/go.yml) +[![GoDoc](https://godoc.org/github.com/c9s/bbgo?status.svg)](https://pkg.go.dev/github.com/c9s/bbgo) +[![Go Report Card](https://goreportcard.com/badge/github.com/c9s/bbgo)](https://goreportcard.com/report/github.com/c9s/bbgo) [![DockerHub](https://img.shields.io/docker/pulls/yoanlin/bbgo.svg)](https://hub.docker.com/r/yoanlin/bbgo) [![Coverage Status](http://codecov.io/github/c9s/bbgo/coverage.svg?branch=main)](http://codecov.io/github/c9s/bbgo?branch=main) open collective badge @@ -42,7 +44,38 @@ You can use BBGO's underlying common exchange API, currently it supports 4+ majo - Built-in parameter optimization tool. - Built-in Grid strategy and many other built-in strategies. - Multi-exchange session support: you can connect to more than 2 exchanges with different accounts or subaccounts. -- Standard indicators, e.g., SMA, EMA, BOLL, VMA, MACD... +- Indicators with interface similar to `pandas.Series`([series](https://github.com/c9s/bbgo/blob/main/doc/development/series.md))([usage](https://github.com/c9s/bbgo/blob/main/doc/development/indicator.md)): + - [Accumulation/Distribution Indicator](./pkg/indicator/ad.go) + - [Arnaud Legoux Moving Average](./pkg/indicator/alma.go) + - [Average True Range](./pkg/indicator/atr.go) + - [Bollinger Bands](./pkg/indicator/boll.go) + - [Commodity Channel Index](./pkg/indicator/cci.go) + - [Cumulative Moving Average](./pkg/indicator/cma.go) + - [Double Exponential Moving Average](./pkg/indicator/dema.go) + - [Directional Movement Index](./pkg/indicator/dmi.go) + - [Brownian Motion's Drift Factor](./pkg/indicator/drift.go) + - [Ease of Movement](./pkg/indicator/emv.go) + - [Exponentially Weighted Moving Average](./pkg/indicator/ewma.go) + - [Hull Moving Average](./pkg/indicator/hull.go) + - [Trend Line (Tool)](./pkg/indicator/line.go) + - [Moving Average Convergence Divergence Indicator](./pkg/indicator/macd.go) + - [On-Balance Volume](./pkg/indicator/obv.go) + - [Pivot](./pkg/indicator/pivot.go) + - [Running Moving Average](./pkg/indicator/rma.go) + - [Relative Strength Index](./pkg/indicator/rsi.go) + - [Simple Moving Average](./pkg/indicator/sma.go) + - [Ehler's Super Smoother Filter](./pkg/indicator/ssf.go) + - [Stochastic Oscillator](./pkg/indicator/stoch.go) + - [SuperTrend](./pkg/indicator/supertrend.go) + - [Triple Exponential Moving Average](./pkg/indicator/tema.go) + - [Tillson T3 Moving Average](./pkg/indicator/till.go) + - [Triangular Moving Average](./pkg/indicator/tma.go) + - [Variable Index Dynamic Average](./pkg/indicator/vidya.go) + - [Volatility Indicator](./pkg/indicator/volatility.go) + - [Volume Weighted Average Price](./pkg/indicator/vwap.go) + - [Zero Lag Exponential Moving Average](./pkg/indicator/zlema.go) + - And more... +- HeikinAshi OHLC / Normal OHLC (check [this config](https://github.com/c9s/bbgo/blob/main/config/skeleton.yaml#L5)) - React-powered Web Dashboard. - Docker image ready. - Kubernetes support. @@ -51,7 +84,7 @@ You can use BBGO's underlying common exchange API, currently it supports 4+ majo ## Screenshots -![bbgo dashboard](assets/screenshots/dashboard.jpeg) +![bbgo dashboard](assets/screenshots/dashboard.jpeg) ![bbgo backtest report](assets/screenshots/backtest-report.jpg) @@ -63,8 +96,8 @@ You can use BBGO's underlying common exchange API, currently it supports 4+ majo - Kucoin Spot Exchange - MAX Spot Exchange (located in Taiwan) - ## Documentation and General Topics + - Check the [documentation index](doc/README.md) ## BBGO Tokenomics @@ -105,6 +138,7 @@ bash <(curl -s https://raw.githubusercontent.com/c9s/bbgo/main/scripts/setup-bol ``` If you already have configuration somewhere, a download-only script might be suitable for you: + ```sh bash <(curl -s https://raw.githubusercontent.com/c9s/bbgo/main/scripts/download.sh) ``` @@ -114,7 +148,7 @@ Or refer to the [Release Page](https://github.com/c9s/bbgo/releases) and downloa Since v2, we've added new float point implementation from dnum to support decimals with higher precision. To download & setup, please refer to [Dnum Installation](doc/topics/dnum-binary.md) -### One-click Linode StackScript: +### One-click Linode StackScript - BBGO Grid Trading on Binance - BBGO USDT/TWD Grid Trading on MAX @@ -165,14 +199,12 @@ Prepare your dotenv file `.env.local` and BBGO yaml config file `bbgo.yaml`. To check the available environment variables, please see [Environment Variables](./doc/configuration/envvars.md) - The minimal bbgo.yaml could be generated by: ```sh curl -o bbgo.yaml https://raw.githubusercontent.com/c9s/bbgo/main/config/minimal.yaml ``` - To run strategy: ```sh @@ -185,14 +217,12 @@ To start bbgo with the frontend dashboard: bbgo run --enable-webserver ``` - If you want to switch to other dotenv file, you can add an `--dotenv` option or `--config`: ```sh bbgo sync --dotenv .env.dev --config config/grid.yaml --session binance ``` - To query transfer history: ```sh @@ -207,13 +237,13 @@ bbgo pnl --exchange binance --asset BTC --since "2019-01-01" ``` ---> - ## Advanced Configuration ### Testnet (Paper Trading) Currently only supports binance testnet. To run bbgo in testnet, apply new API keys from [Binance Test Network](https://testnet.binance.vision), and set the following env before you start bbgo: + ```bash export PAPER_TRADE=1 export DISABLE_MARKET_CACHE=1 # the symbols supported in testnet is far less than the mainnet diff --git a/pkg/bbgo/environment.go b/pkg/bbgo/environment.go index bace19b25..b1f11da2f 100644 --- a/pkg/bbgo/environment.go +++ b/pkg/bbgo/environment.go @@ -928,10 +928,11 @@ func (environ *Environment) setupInteraction(persistence service.PersistenceServ } interact.AddCustomInteraction(&interact.AuthInteract{ - Strict: authStrict, - Mode: authMode, - Token: authToken, // can be empty string here - OneTimePasswordKey: key, // can be nil here + Strict: authStrict, + Mode: authMode, + Token: authToken, // can be empty string here + // pragma: allowlist nextline secret + OneTimePasswordKey: key, // can be nil here }) return nil } diff --git a/pkg/bbgo/strategycontroller_callbacks.go b/pkg/bbgo/strategycontroller_callbacks.go index caa3e68fb..dd432fcb5 100644 --- a/pkg/bbgo/strategycontroller_callbacks.go +++ b/pkg/bbgo/strategycontroller_callbacks.go @@ -1,4 +1,4 @@ -// Code generated by "callbackgen -type StrategyController strategy_controller.go"; DO NOT EDIT. +// Code generated by "callbackgen -type StrategyController -interface"; DO NOT EDIT. package bbgo @@ -33,3 +33,11 @@ func (s *StrategyController) EmitEmergencyStop() { cb() } } + +type StrategyControllerEventHub interface { + OnSuspend(cb func()) + + OnResume(cb func()) + + OnEmergencyStop(cb func()) +} diff --git a/pkg/datasource/coinmarketcap/v1/client.go b/pkg/datasource/coinmarketcap/v1/client.go index d1e68da60..be4f3d181 100644 --- a/pkg/datasource/coinmarketcap/v1/client.go +++ b/pkg/datasource/coinmarketcap/v1/client.go @@ -35,6 +35,7 @@ func New() *RestClient { } func (c *RestClient) Auth(apiKey string) { + // pragma: allowlist nextline secret c.apiKey = apiKey } diff --git a/pkg/datasource/glassnode/glassnodeapi/client.go b/pkg/datasource/glassnode/glassnodeapi/client.go index c1631a015..fcc71d0b1 100644 --- a/pkg/datasource/glassnode/glassnodeapi/client.go +++ b/pkg/datasource/glassnode/glassnodeapi/client.go @@ -35,6 +35,7 @@ func NewRestClient() *RestClient { } func (c *RestClient) Auth(apiKey string) { + // pragma: allowlist nextline secret c.apiKey = apiKey } diff --git a/pkg/exchange/binance/binanceapi/client.go b/pkg/exchange/binance/binanceapi/client.go index 45c39e6f1..0fa05db42 100644 --- a/pkg/exchange/binance/binanceapi/client.go +++ b/pkg/exchange/binance/binanceapi/client.go @@ -60,6 +60,7 @@ func NewClient(baseURL string) *RestClient { func (c *RestClient) Auth(key, secret string) { c.Key = key + // pragma: allowlist nextline secret c.Secret = secret } diff --git a/pkg/exchange/binance/exchange.go b/pkg/exchange/binance/exchange.go index f8a5fc023..9dc464e65 100644 --- a/pkg/exchange/binance/exchange.go +++ b/pkg/exchange/binance/exchange.go @@ -122,7 +122,8 @@ func New(key, secret string) *Exchange { } return &Exchange{ - key: key, + key: key, + // pragma: allowlist nextline secret secret: secret, client: client, futuresClient: futuresClient, diff --git a/pkg/exchange/ftx/exchange.go b/pkg/exchange/ftx/exchange.go index a941caa0c..b947dc5c0 100644 --- a/pkg/exchange/ftx/exchange.go +++ b/pkg/exchange/ftx/exchange.go @@ -90,8 +90,9 @@ func NewExchange(key, secret string, subAccount string) *Exchange { client: client, restEndpoint: u, key: key, - secret: secret, - subAccount: subAccount, + // pragma: allowlist nextline secret + secret: secret, + subAccount: subAccount, } } diff --git a/pkg/exchange/ftx/ftxapi/client.go b/pkg/exchange/ftx/ftxapi/client.go index 58b2ddde0..2437bd48f 100644 --- a/pkg/exchange/ftx/ftxapi/client.go +++ b/pkg/exchange/ftx/ftxapi/client.go @@ -68,6 +68,7 @@ func NewClient() *RestClient { func (c *RestClient) Auth(key, secret, subAccount string) { c.Key = key + // pragma: allowlist nextline secret c.Secret = secret c.subAccount = subAccount } diff --git a/pkg/exchange/ftx/rest.go b/pkg/exchange/ftx/rest.go index 9d9cc96b1..18282551c 100644 --- a/pkg/exchange/ftx/rest.go +++ b/pkg/exchange/ftx/rest.go @@ -92,6 +92,7 @@ func newRestRequest(c *http.Client, baseURL *url.URL) *restRequest { func (r *restRequest) Auth(key, secret string) *restRequest { r.key = key + // pragma: allowlist nextline secret r.secret = secret return r } diff --git a/pkg/exchange/ftx/stream.go b/pkg/exchange/ftx/stream.go index 4e6650c5d..6a70a249d 100644 --- a/pkg/exchange/ftx/stream.go +++ b/pkg/exchange/ftx/stream.go @@ -37,8 +37,9 @@ type klineSubscription struct { func NewStream(key, secret string, subAccount string, e *Exchange) *Stream { s := &Stream{ - exchange: e, - key: key, + exchange: e, + key: key, + // pragma: allowlist nextline secret secret: secret, subAccount: subAccount, StandardStream: &types.StandardStream{}, diff --git a/pkg/exchange/ftx/websocket_messages_test.go b/pkg/exchange/ftx/websocket_messages_test.go index bbe0f6e6f..5a9635e5a 100644 --- a/pkg/exchange/ftx/websocket_messages_test.go +++ b/pkg/exchange/ftx/websocket_messages_test.go @@ -182,6 +182,7 @@ func Test_insertAt(t *testing.T) { func Test_newLoginRequest(t *testing.T) { // From API doc: https://docs.ftx.com/?javascript#authentication-2 r := newLoginRequest("", "Y2QTHI23f23f23jfjas23f23To0RfUwX3H42fvN-", time.Unix(0, 1557246346499*int64(time.Millisecond)), "") + // pragma: allowlist nextline secret expectedSignature := "d10b5a67a1a941ae9463a60b285ae845cdeac1b11edc7da9977bef0228b96de9" assert.Equal(t, expectedSignature, r.Login.Signature) jsonStr, err := json.Marshal(r) diff --git a/pkg/exchange/kucoin/exchange.go b/pkg/exchange/kucoin/exchange.go index 84e8a8d1b..28da3a04e 100644 --- a/pkg/exchange/kucoin/exchange.go +++ b/pkg/exchange/kucoin/exchange.go @@ -44,7 +44,8 @@ func New(key, secret, passphrase string) *Exchange { } return &Exchange{ - key: key, + key: key, + // pragma: allowlist nextline secret secret: secret, passphrase: passphrase, client: client, diff --git a/pkg/exchange/kucoin/kucoinapi/client.go b/pkg/exchange/kucoin/kucoinapi/client.go index 0e084310d..6df47191c 100644 --- a/pkg/exchange/kucoin/kucoinapi/client.go +++ b/pkg/exchange/kucoin/kucoinapi/client.go @@ -58,6 +58,7 @@ func NewClient() *RestClient { func (c *RestClient) Auth(key, secret, passphrase string) { c.Key = key + // pragma: allowlist nextline secret c.Secret = secret c.Passphrase = passphrase } diff --git a/pkg/exchange/max/exchange.go b/pkg/exchange/max/exchange.go index 2972719ff..f7493975e 100644 --- a/pkg/exchange/max/exchange.go +++ b/pkg/exchange/max/exchange.go @@ -47,8 +47,9 @@ func New(key, secret string) *Exchange { client := maxapi.NewRestClient(baseURL) client.Auth(key, secret) return &Exchange{ - client: client, - key: key, + client: client, + key: key, + // pragma: allowlist nextline secret secret: secret, v3order: &v3.OrderService{Client: client}, v3margin: &v3.MarginService{Client: client}, diff --git a/pkg/exchange/max/maxapi/restapi.go b/pkg/exchange/max/maxapi/restapi.go index cd3f1743a..c9f1a0a3e 100644 --- a/pkg/exchange/max/maxapi/restapi.go +++ b/pkg/exchange/max/maxapi/restapi.go @@ -130,7 +130,9 @@ func NewRestClient(baseURL string) *RestClient { // Auth sets api key and secret for usage is requests that requires authentication. func (c *RestClient) Auth(key string, secret string) *RestClient { + // pragma: allowlist nextline secret c.APIKey = key + // pragma: allowlist nextline secret c.APISecret = secret return c } diff --git a/pkg/exchange/max/stream.go b/pkg/exchange/max/stream.go index b5a96212f..8a80bc7ad 100644 --- a/pkg/exchange/max/stream.go +++ b/pkg/exchange/max/stream.go @@ -44,7 +44,8 @@ func NewStream(key, secret string) *Stream { stream := &Stream{ StandardStream: types.NewStandardStream(), key: key, - secret: secret, + // pragma: allowlist nextline secret + secret: secret, } stream.SetEndpointCreator(stream.getEndpoint) stream.SetParser(max.ParseMessage) @@ -116,7 +117,9 @@ func (s *Stream) handleConnect() { nonce := time.Now().UnixNano() / int64(time.Millisecond) auth := &max.AuthMessage{ - Action: "auth", + // pragma: allowlist nextline secret + Action: "auth", + // pragma: allowlist nextline secret APIKey: s.key, Nonce: nonce, Signature: signPayload(fmt.Sprintf("%d", nonce), s.secret), diff --git a/pkg/exchange/okex/exchange.go b/pkg/exchange/okex/exchange.go index fe1b4deba..ab8dcddd2 100644 --- a/pkg/exchange/okex/exchange.go +++ b/pkg/exchange/okex/exchange.go @@ -38,7 +38,8 @@ func New(key, secret, passphrase string) *Exchange { } return &Exchange{ - key: key, + key: key, + // pragma: allowlist nextline secret secret: secret, passphrase: passphrase, client: client, diff --git a/pkg/exchange/okex/okexapi/client.go b/pkg/exchange/okex/okexapi/client.go index 5f23a0094..626e84160 100644 --- a/pkg/exchange/okex/okexapi/client.go +++ b/pkg/exchange/okex/okexapi/client.go @@ -91,6 +91,7 @@ func NewClient() *RestClient { func (c *RestClient) Auth(key, secret, passphrase string) { c.Key = key + // pragma: allowlist nextline secret c.Secret = secret c.Passphrase = passphrase } diff --git a/pkg/fixedpoint/convert.go b/pkg/fixedpoint/convert.go index f70f25885..9d4d83950 100644 --- a/pkg/fixedpoint/convert.go +++ b/pkg/fixedpoint/convert.go @@ -349,11 +349,11 @@ func NewFromString(input string) (Value, error) { } } if hasDecimal { - after := input[dotIndex+1 : len(input)] + after := input[dotIndex+1:] if decimalCount >= 8 { - after = after[0:8] + "." + after[8:len(after)] + after = after[0:8] + "." + after[8:] } else { - after = after[0:decimalCount] + strings.Repeat("0", 8-decimalCount) + after[decimalCount:len(after)] + after = after[0:decimalCount] + strings.Repeat("0", 8-decimalCount) + after[decimalCount:] } input = input[0:dotIndex] + after v, err := strconv.ParseFloat(input, 64) @@ -368,7 +368,7 @@ func NewFromString(input string) (Value, error) { return Value(int64(math.Trunc(v))), nil } else if hasScientificNotion { - exp, err := strconv.ParseInt(input[scIndex+1:len(input)], 10, 32) + exp, err := strconv.ParseInt(input[scIndex+1:], 10, 32) if err != nil { return 0, err } diff --git a/pkg/interact/auth.go b/pkg/interact/auth.go index 71212df76..343ff382a 100644 --- a/pkg/interact/auth.go +++ b/pkg/interact/auth.go @@ -37,6 +37,7 @@ type AuthInteract struct { func (it *AuthInteract) Commands(interact *Interact) { if it.Strict { // generate a one-time-use otp + // pragma: allowlist nextline secret if it.OneTimePasswordKey == nil { opts := totp.GenerateOpts{ Issuer: "interact", @@ -48,7 +49,7 @@ func (it *AuthInteract) Commands(interact *Interact) { if err != nil { panic(err) } - + // pragma: allowlist nextline secret it.OneTimePasswordKey = key } interact.Command("/auth", "authorize", func(reply Reply, session Session) error { diff --git a/pkg/migrations/mysql/migration_api_test.go b/pkg/migrations/mysql/migration_api_test.go index 2684076d3..9864095ce 100644 --- a/pkg/migrations/mysql/migration_api_test.go +++ b/pkg/migrations/mysql/migration_api_test.go @@ -14,7 +14,7 @@ func TestGetMigrationsMap(t *testing.T) { func TestMergeMigrationsMap(t *testing.T) { MergeMigrationsMap(map[int64]*rockhopper.Migration{ - 2: &rockhopper.Migration{}, - 3: &rockhopper.Migration{}, + 2: {}, + 3: {}, }) } diff --git a/pkg/migrations/sqlite3/migration_api_test.go b/pkg/migrations/sqlite3/migration_api_test.go index d1f4fe1ab..d7f77c875 100644 --- a/pkg/migrations/sqlite3/migration_api_test.go +++ b/pkg/migrations/sqlite3/migration_api_test.go @@ -14,7 +14,7 @@ func TestGetMigrationsMap(t *testing.T) { func TestMergeMigrationsMap(t *testing.T) { MergeMigrationsMap(map[int64]*rockhopper.Migration{ - 2: &rockhopper.Migration{}, - 3: &rockhopper.Migration{}, + 2: {}, + 3: {}, }) } diff --git a/pkg/server/envvars.go b/pkg/server/envvars.go index 82f4fbbf9..f11a418f9 100644 --- a/pkg/server/envvars.go +++ b/pkg/server/envvars.go @@ -17,11 +17,15 @@ func collectSessionEnvVars(sessions map[string]*bbgo.ExchangeSession) (envVars m } if len(session.EnvVarPrefix) > 0 { + // pragma: allowlist nextline secret envVars[session.EnvVarPrefix+"_API_KEY"] = session.Key + // pragma: allowlist nextline secret envVars[session.EnvVarPrefix+"_API_SECRET"] = session.Secret } else if len(session.Name) > 0 { sn := strings.ToUpper(session.Name) + // pragma: allowlist nextline secret envVars[sn+"_API_KEY"] = session.Key + // pragma: allowlist nextline secret envVars[sn+"_API_SECRET"] = session.Secret } else { err = fmt.Errorf("session %s name or env var prefix is not defined", session.Name) diff --git a/pkg/service/persistence_redis.go b/pkg/service/persistence_redis.go index e71629138..6b91d0583 100644 --- a/pkg/service/persistence_redis.go +++ b/pkg/service/persistence_redis.go @@ -19,6 +19,7 @@ func NewRedisPersistenceService(config *RedisPersistenceConfig) *RedisPersistenc client := redis.NewClient(&redis.Options{ Addr: net.JoinHostPort(config.Host, config.Port), // Username: "", // username is only for redis 6.0 + // pragma: allowlist nextline secret Password: config.Password, // no password set DB: config.DB, // use default DB }) From 2d08747722087dc8636392dbf096c26a62c9e2ab Mon Sep 17 00:00:00 2001 From: zenix Date: Fri, 17 Jun 2022 16:23:12 +0900 Subject: [PATCH 3/6] fix: go get binary path --- .github/workflows/go.yml | 9 ++++++--- .pre-commit-config.yaml | 1 - 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 517b2f8dc..7c9991020 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -44,18 +44,21 @@ jobs: # auto-start: "false" - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18 - name: Run pre-commit run: | pip install pre-commit - go get -v -u github.com/go-critic/go-critic/cmd/gocritic pre-commit install-hooks pre-commit run markdownlint --files=README.md --verbose pre-commit run go-fmt --all-files --verbose - pre-commit run go-critic --all-files --verbose + + - name: CI Lint + uses: golangci/golangci-lint-action@v3 + with: + version: v1.46.2 - name: Install Migration Tool run: go install github.com/c9s/rockhopper/cmd/rockhopper@v1.2.1 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2a4c2857e..9bedc2d1d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,4 +18,3 @@ repos: hooks: - id: go-fmt args: ['-l'] - - id: go-critic From 933c90e805c854514507127bf295d07207432ec6 Mon Sep 17 00:00:00 2001 From: zenix Date: Fri, 17 Jun 2022 17:12:58 +0900 Subject: [PATCH 4/6] fix: split golangci-lint to separate file --- .github/workflows/go.yml | 5 ----- .github/workflows/golang-lint.yml | 22 ++++++++++++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/golang-lint.yml diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 7c9991020..2af2b1632 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -55,11 +55,6 @@ jobs: pre-commit run markdownlint --files=README.md --verbose pre-commit run go-fmt --all-files --verbose - - name: CI Lint - uses: golangci/golangci-lint-action@v3 - with: - version: v1.46.2 - - name: Install Migration Tool run: go install github.com/c9s/rockhopper/cmd/rockhopper@v1.2.1 diff --git a/.github/workflows/golang-lint.yml b/.github/workflows/golang-lint.yml new file mode 100644 index 000000000..420724cb7 --- /dev/null +++ b/.github/workflows/golang-lint.yml @@ -0,0 +1,22 @@ +name: golang-lint +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] +permissions: + contents: read + +jobs: + golangci: + name: lint + runs-on: ubuntu-latest + steps: + - uses: actions/setup-go@v3 + with: + go-version: 1.18 + - uses: actions/checkout@v3 + - name: golangci-lint + uses: golangci/golangci-lint-action@v3 + with: + version: v1.46.2 From dca80cfb7e35d65241e36ee3720e75bab38034b1 Mon Sep 17 00:00:00 2001 From: zenix Date: Fri, 17 Jun 2022 19:00:36 +0900 Subject: [PATCH 5/6] fix: move gofmt to golintci, disable most of the checks --- .github/workflows/go.yml | 2 +- .golangci.yml | 7 +++++++ .pre-commit-config.yaml | 6 ------ 3 files changed, 8 insertions(+), 7 deletions(-) create mode 100644 .golangci.yml diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 2af2b1632..974f950c6 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -53,7 +53,7 @@ jobs: pip install pre-commit pre-commit install-hooks pre-commit run markdownlint --files=README.md --verbose - pre-commit run go-fmt --all-files --verbose + pre-commit run detect-secrets --all-files --verbose - name: Install Migration Tool run: go install github.com/c9s/rockhopper/cmd/rockhopper@v1.2.1 diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 000000000..081c79221 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,7 @@ +run: + issues-exit-code: 0 + tests: false +linters: + disable-all: true + enable: + - gofmt diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9bedc2d1d..cbb041829 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,9 +12,3 @@ repos: rev: v0.31.1 hooks: - id: markdownlint - # Go - - repo: https://github.com/dnephin/pre-commit-golang - rev: v0.5.0 - hooks: - - id: go-fmt - args: ['-l'] From 0c7a98cc4ba7f108737efb41534910baa10d3b96 Mon Sep 17 00:00:00 2001 From: zenix Date: Fri, 17 Jun 2022 19:26:14 +0900 Subject: [PATCH 6/6] fix: race condition in buffer --- pkg/depth/buffer.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/depth/buffer.go b/pkg/depth/buffer.go index 620743639..0b627f255 100644 --- a/pkg/depth/buffer.go +++ b/pkg/depth/buffer.go @@ -3,6 +3,7 @@ package depth import ( "fmt" "sync" + "sync/atomic" "time" log "github.com/sirupsen/logrus" @@ -40,7 +41,7 @@ type Buffer struct { updateTimeout time.Duration // bufferingPeriod is used to buffer the update message before we get the full depth - bufferingPeriod time.Duration + bufferingPeriod atomic.Value } func NewBuffer(fetcher SnapshotFetcher) *Buffer { @@ -55,7 +56,7 @@ func (b *Buffer) SetUpdateTimeout(d time.Duration) { } func (b *Buffer) SetBufferingPeriod(d time.Duration) { - b.bufferingPeriod = d + b.bufferingPeriod.Store(d) } func (b *Buffer) resetSnapshot() { @@ -185,8 +186,8 @@ func (b *Buffer) fetchAndPush() error { func (b *Buffer) tryFetch() { for { - if b.bufferingPeriod > 0 { - <-time.After(b.bufferingPeriod) + if period := b.bufferingPeriod.Load(); period != nil { + <-time.After(period.(time.Duration)) } err := b.fetchAndPush()