@limitless-exchange/sdk 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # Limitless Exchange TypeScript SDK
2
2
 
3
- **v1.0.0 LTS (Long-Term Support)** | Production-Ready | Type-Safe | Fully Documented
3
+ **v1.0.3** | Production-Ready | Type-Safe | Fully Documented
4
4
 
5
5
  A TypeScript SDK for interacting with the Limitless Exchange platform, providing type-safe access to CLOB and NegRisk prediction markets.
6
6
 
7
- > 🎉 **v1.0.0 LTS Release**: This is the first stable, production-ready release with long-term support. Recommended for all production deployments. See [Changelog](#changelog) for details.
7
+ > 🎉 **v1.0.3 Release**: Adds market-pages navigation API support, redirect-aware path resolution, and expanded typing parity. See [Changelog](#changelog) for details.
8
8
 
9
9
  ## ⚠️ Disclaimer
10
10
 
@@ -91,9 +91,40 @@ const page2 = await marketFetcher.getActiveMarkets({
91
91
 
92
92
  See [examples/project-integration/src/active-markets.ts](./examples/project-integration/src/active-markets.ts) for more examples.
93
93
 
94
+ ### Market Pages & Navigation (No Authentication Required)
95
+
96
+ ```typescript
97
+ import { HttpClient, MarketPageFetcher } from '@limitless-exchange/sdk';
98
+
99
+ const httpClient = new HttpClient({
100
+ baseURL: 'https://api.limitless.exchange',
101
+ });
102
+
103
+ const pageFetcher = new MarketPageFetcher(httpClient);
104
+
105
+ // Resolve a page from URL path
106
+ const page = await pageFetcher.getMarketPageByPath('/crypto');
107
+
108
+ // Fetch page markets with dynamic filters
109
+ const markets = await pageFetcher.getMarkets(page.id, {
110
+ limit: 20,
111
+ sort: '-updatedAt',
112
+ filters: {
113
+ duration: 'hourly',
114
+ ticker: ['btc', 'eth'],
115
+ },
116
+ });
117
+
118
+ if ('pagination' in markets) {
119
+ console.log(`Total markets: ${markets.pagination.total}`);
120
+ }
121
+ ```
122
+
123
+ Detailed guide: [docs/market-pages/README.md](./docs/market-pages/README.md)
124
+
94
125
  ### Authentication
95
126
 
96
- The SDK uses API keys for authentication. API keys can be obtained from your Limitless Exchange account settings.
127
+ The SDK uses API keys for authentication. API keys can be obtained from your Limitless Exchange account settings(Click on User Profile).
97
128
 
98
129
  ```typescript
99
130
  import { HttpClient } from '@limitless-exchange/sdk';
@@ -122,7 +153,7 @@ Create a `.env` file:
122
153
  # Required for authenticated endpoints
123
154
  LIMITLESS_API_KEY=sk_live_your_api_key_here
124
155
 
125
- # Optional: Private key for order signing (EIP-712)
156
+ # REQUIRED: Private key for order signing (EIP-712)
126
157
  PRIVATE_KEY=0x...
127
158
  ```
128
159
 
@@ -325,7 +356,7 @@ HTTP client with API key authentication.
325
356
  ```typescript
326
357
  const httpClient = new HttpClient({
327
358
  baseURL: 'https://api.limitless.exchange',
328
- apiKey: process.env.LIMITLESS_API_KEY, // Optional - auto-loads from env
359
+ apiKey: process.env.LIMITLESS_API_KEY, // you are allowed to pass it that way, otherwise will be loaded from .env
329
360
  timeout: 30000,
330
361
  });
331
362
 
@@ -451,11 +482,11 @@ docs/
451
482
 
452
483
  ## Changelog
453
484
 
454
- ### v1.0.0 (LTS - Long-Term Support Release)
485
+ ### v1.0.3
455
486
 
456
- **Release Date**: January 2026
487
+ **Release Date**: March 2026
457
488
 
458
- This is the first stable, production-ready release of the Limitless Exchange TypeScript SDK, designated as a Long-Term Support (LTS) version.
489
+ Latest release with navigation-driven market discovery APIs and improved response/type parity.
459
490
 
460
491
  #### Highlights
461
492
 
@@ -466,23 +497,26 @@ This is the first stable, production-ready release of the Limitless Exchange Typ
466
497
  - 🔄 **Robust Error Handling**: Automatic retry logic with multiple strategies
467
498
  - 🌐 **Real-Time Updates**: WebSocket support for orderbook and position streaming
468
499
  - 🎯 **NegRisk Support**: Full support for group markets with multiple outcomes
500
+ - 🧭 **Market Pages API**: Navigation tree, by-path resolver with 301 handling, page-scoped markets, property keys
469
501
 
470
502
  #### Core Features
471
503
 
472
504
  - **Authentication**: API key authentication, EIP-712 signing, EOA support
473
505
  - **Market Data**: Active markets with sorting, orderbook access, venue caching
506
+ - **Market Pages & Navigation**: `/navigation`, `/market-pages/by-path`, `/market-pages/:id/markets`, `/property-keys`
474
507
  - **Order Management**: GTC and FOK orders, tick alignment, automatic signing
475
508
  - **Portfolio**: Position tracking, user history
476
509
  - **WebSocket**: Real-time orderbook, price updates, event streaming
477
510
  - **Error Handling**: Decorator and wrapper retry patterns, configurable strategies
478
511
  - **Token Approvals**: Complete setup script, CLOB and NegRisk workflows
479
512
 
480
- #### Documentation Enhancements (v1.0.0)
513
+ #### Documentation Enhancements (v1.0.3)
481
514
 
482
515
  - Added FOK order examples to README with clear `makerAmount` semantics
483
516
  - Created comprehensive CHANGELOG.md following Keep a Changelog format
484
517
  - All 17 code samples include step-by-step comments and error handling
485
518
  - Detailed guides for authentication, trading, markets, portfolio, and WebSocket
519
+ - Added market-pages guide and README quick-start for navigation-driven discovery
486
520
 
487
521
  For complete release notes, see [CHANGELOG.md](./CHANGELOG.md).
488
522
 
@@ -496,18 +530,6 @@ For complete release notes, see [CHANGELOG.md](./CHANGELOG.md).
496
530
 
497
531
  ---
498
532
 
499
- ## LTS Support Policy
500
-
501
- **v1.0.0 LTS** will receive:
502
-
503
- - Security updates and critical bug fixes
504
- - Compatibility maintenance with Limitless Exchange API
505
- - Community support and issue resolution
506
- - Documentation updates and improvements
507
- - Long-term stability for production deployments
508
-
509
- **Recommended for production use.** We commit to maintaining backward compatibility and providing timely security updates for this LTS release.
510
-
511
533
  ## License
512
534
 
513
535
  MIT - See [LICENSE](./LICENSE) file for details
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { AxiosRequestConfig } from 'axios';
1
+ import { AxiosRequestConfig, RawAxiosResponseHeaders, AxiosResponseHeaders } from 'axios';
2
2
  import { ethers } from 'ethers';
3
3
 
4
4
  /**
@@ -1096,11 +1096,15 @@ interface MarketSettings {
1096
1096
  /**
1097
1097
  * Rewards epoch duration
1098
1098
  */
1099
- rewardsEpoch: string;
1099
+ rewardsEpoch: string | number;
1100
1100
  /**
1101
1101
  * Constant parameter
1102
1102
  */
1103
- c: string;
1103
+ c: string | number;
1104
+ /**
1105
+ * Market maker rebate rate.
1106
+ */
1107
+ rebateRate?: number;
1104
1108
  }
1105
1109
  /**
1106
1110
  * Trade prices for different order types.
@@ -1257,7 +1261,7 @@ interface Venue {
1257
1261
  * Required for NegRisk/Grouped markets only.
1258
1262
  * SELL orders on NegRisk markets require CT approval to both exchange AND adapter.
1259
1263
  */
1260
- adapter: string;
1264
+ adapter: string | null;
1261
1265
  }
1262
1266
  /**
1263
1267
  * Market token IDs for CLOB markets.
@@ -1358,6 +1362,38 @@ interface Market$1 {
1358
1362
  * Formatted trading volume
1359
1363
  */
1360
1364
  volumeFormatted?: string;
1365
+ /**
1366
+ * Market automation type.
1367
+ */
1368
+ automationType?: 'manual' | 'lumy' | 'sports';
1369
+ /**
1370
+ * Primary market image URL.
1371
+ */
1372
+ imageUrl?: string | null;
1373
+ /**
1374
+ * Price trend data.
1375
+ */
1376
+ trends?: Record<string, unknown>;
1377
+ /**
1378
+ * Open interest (AMM markets).
1379
+ */
1380
+ openInterest?: string;
1381
+ /**
1382
+ * Formatted open interest (AMM markets).
1383
+ */
1384
+ openInterestFormatted?: string;
1385
+ /**
1386
+ * Liquidity (AMM markets).
1387
+ */
1388
+ liquidity?: string;
1389
+ /**
1390
+ * Formatted liquidity (AMM markets).
1391
+ */
1392
+ liquidityFormatted?: string;
1393
+ /**
1394
+ * Position IDs (AMM markets).
1395
+ */
1396
+ positionIds?: string[];
1361
1397
  /**
1362
1398
  * Condition ID (CLOB only)
1363
1399
  */
@@ -1897,6 +1933,28 @@ interface HttpClientConfig {
1897
1933
  */
1898
1934
  additionalHeaders?: Record<string, string>;
1899
1935
  }
1936
+ /**
1937
+ * Raw HTTP response with status and headers.
1938
+ *
1939
+ * @remarks
1940
+ * Useful for endpoints where response metadata matters (for example redirect handling).
1941
+ *
1942
+ * @public
1943
+ */
1944
+ interface HttpRawResponse<T = any> {
1945
+ /**
1946
+ * HTTP status code.
1947
+ */
1948
+ status: number;
1949
+ /**
1950
+ * Response headers.
1951
+ */
1952
+ headers: RawAxiosResponseHeaders | AxiosResponseHeaders;
1953
+ /**
1954
+ * Response body.
1955
+ */
1956
+ data: T;
1957
+ }
1900
1958
  /**
1901
1959
  * HTTP client wrapper for Limitless Exchange API.
1902
1960
  *
@@ -1921,6 +1979,16 @@ declare class HttpClient {
1921
1979
  * @internal
1922
1980
  */
1923
1981
  private setupInterceptors;
1982
+ /**
1983
+ * Extracts a human-readable error message from API response payload.
1984
+ * @internal
1985
+ */
1986
+ private extractErrorMessage;
1987
+ /**
1988
+ * Creates a typed API error class from status code.
1989
+ * @internal
1990
+ */
1991
+ private createTypedApiError;
1924
1992
  /**
1925
1993
  * Sets the API key for authenticated requests.
1926
1994
  *
@@ -1939,6 +2007,17 @@ declare class HttpClient {
1939
2007
  * @returns Promise resolving to the response data
1940
2008
  */
1941
2009
  get<T = any>(url: string, config?: AxiosRequestConfig): Promise<T>;
2010
+ /**
2011
+ * Performs a GET request and returns raw response metadata.
2012
+ *
2013
+ * @remarks
2014
+ * Use this when callers need access to status code or headers (e.g. redirect `Location`).
2015
+ *
2016
+ * @param url - Request URL
2017
+ * @param config - Additional request configuration
2018
+ * @returns Promise resolving to status, headers, and response data
2019
+ */
2020
+ getRaw<T = any>(url: string, config?: AxiosRequestConfig): Promise<HttpRawResponse<T>>;
1942
2021
  /**
1943
2022
  * Performs a POST request.
1944
2023
  *
@@ -1998,6 +2077,14 @@ declare class Market {
1998
2077
  metadata: MarketMetadata;
1999
2078
  volume?: string;
2000
2079
  volumeFormatted?: string;
2080
+ automationType?: 'manual' | 'lumy' | 'sports';
2081
+ imageUrl?: string | null;
2082
+ trends?: Record<string, unknown>;
2083
+ openInterest?: string;
2084
+ openInterestFormatted?: string;
2085
+ liquidity?: string;
2086
+ liquidityFormatted?: string;
2087
+ positionIds?: string[];
2001
2088
  conditionId?: string;
2002
2089
  negRiskRequestId?: string | null;
2003
2090
  tokens?: MarketTokens;
@@ -2048,6 +2135,159 @@ declare class Market {
2048
2135
  getUserOrders(): Promise<any[]>;
2049
2136
  }
2050
2137
 
2138
+ /**
2139
+ * Navigation node returned by /navigation endpoint.
2140
+ * @public
2141
+ */
2142
+ interface NavigationNode {
2143
+ id: string;
2144
+ name: string;
2145
+ slug: string;
2146
+ path: string;
2147
+ icon?: string;
2148
+ children: NavigationNode[];
2149
+ }
2150
+ /**
2151
+ * Filter group option for market pages.
2152
+ * @public
2153
+ */
2154
+ interface FilterGroupOption {
2155
+ label: string;
2156
+ value: string;
2157
+ metadata?: Record<string, unknown>;
2158
+ }
2159
+ /**
2160
+ * Filter group for market pages.
2161
+ * @public
2162
+ */
2163
+ interface FilterGroup {
2164
+ name?: string;
2165
+ slug?: string;
2166
+ allowMultiple?: boolean;
2167
+ presentation?: string;
2168
+ options?: FilterGroupOption[];
2169
+ source?: Record<string, unknown>;
2170
+ }
2171
+ /**
2172
+ * Breadcrumb item returned by /market-pages/by-path endpoint.
2173
+ * @public
2174
+ */
2175
+ interface BreadcrumbItem {
2176
+ name: string;
2177
+ slug: string;
2178
+ path: string;
2179
+ }
2180
+ /**
2181
+ * Market page data resolved by path.
2182
+ * @public
2183
+ */
2184
+ interface MarketPage {
2185
+ id: string;
2186
+ name: string;
2187
+ slug: string;
2188
+ fullPath: string;
2189
+ description: string | null;
2190
+ baseFilter: Record<string, unknown>;
2191
+ filterGroups: FilterGroup[];
2192
+ metadata: Record<string, unknown>;
2193
+ breadcrumb: BreadcrumbItem[];
2194
+ }
2195
+ /**
2196
+ * Property option returned by property-keys endpoints.
2197
+ * @public
2198
+ */
2199
+ interface PropertyOption {
2200
+ id: string;
2201
+ propertyKeyId: string;
2202
+ value: string;
2203
+ label: string;
2204
+ sortOrder: number;
2205
+ parentOptionId: string | null;
2206
+ metadata: Record<string, unknown>;
2207
+ createdAt: string;
2208
+ updatedAt: string;
2209
+ }
2210
+ /**
2211
+ * Property key returned by property-keys endpoints.
2212
+ * @public
2213
+ */
2214
+ interface PropertyKey {
2215
+ id: string;
2216
+ name: string;
2217
+ slug: string;
2218
+ type: 'select' | 'multi-select';
2219
+ metadata: Record<string, unknown>;
2220
+ isSystem: boolean;
2221
+ options?: PropertyOption[];
2222
+ createdAt: string;
2223
+ updatedAt: string;
2224
+ }
2225
+ /**
2226
+ * Offset pagination metadata.
2227
+ * @public
2228
+ */
2229
+ interface OffsetPagination {
2230
+ page: number;
2231
+ limit: number;
2232
+ total: number;
2233
+ totalPages: number;
2234
+ }
2235
+ /**
2236
+ * Cursor pagination metadata.
2237
+ * @public
2238
+ */
2239
+ interface CursorPagination {
2240
+ nextCursor: string | null;
2241
+ }
2242
+ /**
2243
+ * Sort field for market-pages market listing.
2244
+ * @public
2245
+ */
2246
+ type MarketPageSortField = 'createdAt' | 'updatedAt' | 'deadline' | 'id';
2247
+ /**
2248
+ * Sort value for market-pages market listing.
2249
+ * @public
2250
+ */
2251
+ type MarketPageSort = MarketPageSortField | `-${MarketPageSortField}`;
2252
+ /**
2253
+ * Query params for /market-pages/:id/markets endpoint.
2254
+ * @public
2255
+ */
2256
+ type MarketPageFilterPrimitive = string | number | boolean;
2257
+ type MarketPageFilterValue = MarketPageFilterPrimitive | MarketPageFilterPrimitive[];
2258
+ /**
2259
+ * Query params for /market-pages/:id/markets endpoint.
2260
+ * @public
2261
+ */
2262
+ interface MarketPageMarketsParams {
2263
+ page?: number;
2264
+ limit?: number;
2265
+ sort?: MarketPageSort;
2266
+ cursor?: string;
2267
+ filters?: Record<string, MarketPageFilterValue>;
2268
+ }
2269
+ /**
2270
+ * Offset response for /market-pages/:id/markets endpoint.
2271
+ * @public
2272
+ */
2273
+ interface MarketPageMarketsOffsetResponse {
2274
+ data: Market[];
2275
+ pagination: OffsetPagination;
2276
+ }
2277
+ /**
2278
+ * Cursor response for /market-pages/:id/markets endpoint.
2279
+ * @public
2280
+ */
2281
+ interface MarketPageMarketsCursorResponse {
2282
+ data: Market[];
2283
+ cursor: CursorPagination;
2284
+ }
2285
+ /**
2286
+ * Union response for /market-pages/:id/markets endpoint.
2287
+ * @public
2288
+ */
2289
+ type MarketPageMarketsResponse = MarketPageMarketsOffsetResponse | MarketPageMarketsCursorResponse;
2290
+
2051
2291
  /**
2052
2292
  * API error types for Limitless Exchange SDK.
2053
2293
  * @module api/errors
@@ -3187,6 +3427,57 @@ declare class OrderClient {
3187
3427
  get ownerId(): number | undefined;
3188
3428
  }
3189
3429
 
3430
+ /**
3431
+ * Fetcher for market-pages and property-keys APIs.
3432
+ *
3433
+ * @remarks
3434
+ * This class provides access to the new navigation-driven market discovery API.
3435
+ *
3436
+ * @public
3437
+ */
3438
+ declare class MarketPageFetcher {
3439
+ private httpClient;
3440
+ private logger;
3441
+ /**
3442
+ * Creates a new market-pages fetcher.
3443
+ *
3444
+ * @param httpClient - HTTP client for API calls
3445
+ * @param logger - Optional logger
3446
+ */
3447
+ constructor(httpClient: HttpClient, logger?: ILogger);
3448
+ /**
3449
+ * Gets the navigation tree.
3450
+ */
3451
+ getNavigation(): Promise<NavigationNode[]>;
3452
+ /**
3453
+ * Resolves a market page by path.
3454
+ *
3455
+ * @remarks
3456
+ * Handles 301 redirects manually by re-requesting `/market-pages/by-path` with the
3457
+ * redirected path value from `Location` header.
3458
+ */
3459
+ getMarketPageByPath(path: string): Promise<MarketPage>;
3460
+ private getMarketPageByPathInternal;
3461
+ private extractRedirectPath;
3462
+ /**
3463
+ * Gets markets for a market page with optional filtering and pagination.
3464
+ */
3465
+ getMarkets(pageId: string, params?: MarketPageMarketsParams): Promise<MarketPageMarketsResponse>;
3466
+ /**
3467
+ * Lists all property keys with options.
3468
+ */
3469
+ getPropertyKeys(): Promise<PropertyKey[]>;
3470
+ /**
3471
+ * Gets a single property key by ID.
3472
+ */
3473
+ getPropertyKey(id: string): Promise<PropertyKey>;
3474
+ /**
3475
+ * Lists options for a property key, optionally filtered by parent option ID.
3476
+ */
3477
+ getPropertyOptions(keyId: string, parentId?: string): Promise<PropertyOption[]>;
3478
+ private stringifyFilterValue;
3479
+ }
3480
+
3190
3481
  /**
3191
3482
  * Portfolio data fetcher for Limitless Exchange.
3192
3483
  * @module portfolio/fetcher
@@ -3530,4 +3821,4 @@ declare class WebSocketClient {
3530
3821
  private getChannelFromKey;
3531
3822
  }
3532
3823
 
3533
- export { type AMMPosition, APIError, type ActiveMarketsParams, type ActiveMarketsResponse, type ActiveMarketsSortBy, type AmmPriceEntry, AuthenticationError, BASE_SEPOLIA_CHAIN_ID, type BaseOrderArgs, type CLOBPosition, CONTRACT_ADDRESSES, type CollateralToken, ConsoleLogger, type CreatedOrder, DEFAULT_API_URL, DEFAULT_CHAIN_ID, DEFAULT_WS_URL, type FOKOrderArgs, type FillEvent, type GTCOrderArgs, type HistoryEntry, type HistoryResponse, HttpClient, type HttpClientConfig, type ILogger, type LatestTrade, Market, type MarketCreator, MarketFetcher, type Market$1 as MarketInterface, type MarketMetadata, type MarketOutcome, type MarketSettings, type MarketTokens, type MarketUpdate, type MarketsResponse, type ModeInfo, type NewOrderPayload, type NewPriceData, NoOpLogger, type OrderArgs, type OrderBook, OrderBuilder, OrderClient, type OrderClientConfig, type OrderMatch, type OrderResponse, OrderSigner, type OrderSigningConfig, OrderType, type OrderUpdate, OrderValidationError, type OrderbookData, type OrderbookEntry, type OrderbookUpdate, PortfolioFetcher, type PortfolioPositionsResponse, type PortfolioSummary, type Position, type PositionMarket, type PositionSide, type PriceOracleMetadata, type PriceUpdate, RateLimitError, type ReferralData, RetryConfig, type RetryConfigOptions, RetryableClient, SIGNING_MESSAGE_TEMPLATE, Side, SignatureType, type SignedOrder, type SubscriptionChannel, type SubscriptionOptions, type TokenBalance, type TradeEvent, type TradePrices, type TradingMode, type TransactionEvent, type UnsignedOrder, type UserData, type UserProfile, type UserRank, ValidationError, type Venue, WebSocketClient, type WebSocketConfig, type WebSocketEvents, WebSocketState, ZERO_ADDRESS, getContractAddress, retryOnErrors, validateOrderArgs, validateSignedOrder, validateUnsignedOrder, withRetry };
3824
+ export { type AMMPosition, APIError, type ActiveMarketsParams, type ActiveMarketsResponse, type ActiveMarketsSortBy, type AmmPriceEntry, AuthenticationError, BASE_SEPOLIA_CHAIN_ID, type BaseOrderArgs, type BreadcrumbItem, type CLOBPosition, CONTRACT_ADDRESSES, type CollateralToken, ConsoleLogger, type CreatedOrder, type CursorPagination, DEFAULT_API_URL, DEFAULT_CHAIN_ID, DEFAULT_WS_URL, type FOKOrderArgs, type FillEvent, type FilterGroup, type FilterGroupOption, type GTCOrderArgs, type HistoryEntry, type HistoryResponse, HttpClient, type HttpClientConfig, type HttpRawResponse, type ILogger, type LatestTrade, Market, type MarketCreator, MarketFetcher, type Market$1 as MarketInterface, type MarketMetadata, type MarketOutcome, type MarketPage, MarketPageFetcher, type MarketPageFilterPrimitive, type MarketPageFilterValue, type MarketPageMarketsCursorResponse, type MarketPageMarketsOffsetResponse, type MarketPageMarketsParams, type MarketPageMarketsResponse, type MarketPageSort, type MarketPageSortField, type MarketSettings, type MarketTokens, type MarketUpdate, type MarketsResponse, type ModeInfo, type NavigationNode, type NewOrderPayload, type NewPriceData, NoOpLogger, type OffsetPagination, type OrderArgs, type OrderBook, OrderBuilder, OrderClient, type OrderClientConfig, type OrderMatch, type OrderResponse, OrderSigner, type OrderSigningConfig, OrderType, type OrderUpdate, OrderValidationError, type OrderbookData, type OrderbookEntry, type OrderbookUpdate, PortfolioFetcher, type PortfolioPositionsResponse, type PortfolioSummary, type Position, type PositionMarket, type PositionSide, type PriceOracleMetadata, type PriceUpdate, type PropertyKey, type PropertyOption, RateLimitError, type ReferralData, RetryConfig, type RetryConfigOptions, RetryableClient, SIGNING_MESSAGE_TEMPLATE, Side, SignatureType, type SignedOrder, type SubscriptionChannel, type SubscriptionOptions, type TokenBalance, type TradeEvent, type TradePrices, type TradingMode, type TransactionEvent, type UnsignedOrder, type UserData, type UserProfile, type UserRank, ValidationError, type Venue, WebSocketClient, type WebSocketConfig, type WebSocketEvents, WebSocketState, ZERO_ADDRESS, getContractAddress, retryOnErrors, validateOrderArgs, validateSignedOrder, validateUnsignedOrder, withRetry };