diff --git a/package.json b/package.json index d167d3f..c1d9e16 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.5.3", + "version": "0.5.4", "description": "Orion Protocol SDK", "main": "./lib/esm/index.js", "module": "./lib/esm/index.js", diff --git a/src/services/OrionAggregator/index.ts b/src/services/OrionAggregator/index.ts index 8ab758d..cc3f4ef 100644 --- a/src/services/OrionAggregator/index.ts +++ b/src/services/OrionAggregator/index.ts @@ -11,6 +11,9 @@ import { OrionAggregatorWS } from './ws'; import { atomicSwapHistorySchema } from './schemas/atomicSwapHistorySchema'; import { SignedCancelOrderRequest, SignedOrder, SupportedChainId } from '../../types'; import { pairConfigSchema } from './schemas'; +import { + aggregatedOrderbookSchema, exchangeOrderbookSchema, +} from './schemas/aggregatedOrderbookSchema'; class OrionAggregator { private readonly apiUrl: string; @@ -32,6 +35,8 @@ class OrionAggregator { this.cancelOrder = this.cancelOrder.bind(this); this.checkWhitelisted = this.checkWhitelisted.bind(this); this.getLockedBalance = this.getLockedBalance.bind(this); + this.getAggregatedOrderbook = this.getAggregatedOrderbook.bind(this); + this.getExchangeOrderbook = this.getExchangeOrderbook.bind(this); } get aggregatorWSUrl() { return `wss://${this.apiUrl}/v1`; } @@ -47,6 +52,33 @@ class OrionAggregator { ); } + getAggregatedOrderbook(pair: string, depth = 20) { + const url = new URL(`${this.aggregatorUrl}/api/v1/orderbook`); + url.searchParams.append('pair', pair); + url.searchParams.append('depth', depth.toString()); + return fetchWithValidation( + url.toString(), + aggregatedOrderbookSchema, + undefined, + errorSchema, + ); + } + + getExchangeOrderbook(pair: string, exchange: string, depth = 20, filterByBrokerBalances: boolean | null = null) { + const url = new URL(`${this.aggregatorUrl}/api/v1/orderbook/${exchange}/${pair}`); + url.searchParams.append('pair', pair); + url.searchParams.append('depth', depth.toString()); + if (filterByBrokerBalances !== null) { + url.searchParams.append('filterByBrokerBalances', filterByBrokerBalances.toString()); + } + return fetchWithValidation( + url.toString(), + exchangeOrderbookSchema, + undefined, + errorSchema, + ); + } + getPairConfigs() { return fetchWithValidation( `${this.aggregatorUrl}/api/v1/pairs/exchangeInfo`, diff --git a/src/services/OrionAggregator/schemas/aggregatedOrderbookSchema.ts b/src/services/OrionAggregator/schemas/aggregatedOrderbookSchema.ts new file mode 100644 index 0000000..8b781f8 --- /dev/null +++ b/src/services/OrionAggregator/schemas/aggregatedOrderbookSchema.ts @@ -0,0 +1,25 @@ +import { z } from 'zod'; + +const orderbookElementSchema = z.object({ + price: z.number(), + amount: z.number(), + path: z.array(z.object({ + assetPair: z.string(), + action: z.enum(['BUY', 'SELL']), + })), +}); + +const aggregatedOrderbookElementSchema = orderbookElementSchema + .extend({ + exchanges: z.string().array(), + }); + +export const aggregatedOrderbookSchema = z.object({ + asks: z.array(aggregatedOrderbookElementSchema), + bids: z.array(aggregatedOrderbookElementSchema), +}); + +export const exchangeOrderbookSchema = z.object({ + asks: z.array(orderbookElementSchema), + bids: z.array(orderbookElementSchema), +});