@0xarchive/sdk 0.3.1 → 0.3.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/dist/index.js CHANGED
@@ -20,9 +20,50 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
+ ApiMetaSchema: () => ApiMetaSchema,
24
+ ApiResponseSchema: () => ApiResponseSchema,
25
+ DataSourceSchema: () => DataSourceSchema,
26
+ FundingRateArrayResponseSchema: () => FundingRateArrayResponseSchema,
27
+ FundingRateResponseSchema: () => FundingRateResponseSchema,
28
+ FundingRateSchema: () => FundingRateSchema,
29
+ InstrumentArrayResponseSchema: () => InstrumentArrayResponseSchema,
30
+ InstrumentResponseSchema: () => InstrumentResponseSchema,
31
+ InstrumentSchema: () => InstrumentSchema,
32
+ InstrumentTypeSchema: () => InstrumentTypeSchema,
33
+ OpenInterestArrayResponseSchema: () => OpenInterestArrayResponseSchema,
34
+ OpenInterestResponseSchema: () => OpenInterestResponseSchema,
35
+ OpenInterestSchema: () => OpenInterestSchema,
36
+ OrderBookArrayResponseSchema: () => OrderBookArrayResponseSchema,
37
+ OrderBookResponseSchema: () => OrderBookResponseSchema,
38
+ OrderBookSchema: () => OrderBookSchema,
23
39
  OxArchive: () => OxArchive,
24
40
  OxArchiveError: () => OxArchiveError,
25
41
  OxArchiveWs: () => OxArchiveWs,
42
+ PriceLevelSchema: () => PriceLevelSchema,
43
+ TimestampedRecordSchema: () => TimestampedRecordSchema,
44
+ TradeArrayResponseSchema: () => TradeArrayResponseSchema,
45
+ TradeDirectionSchema: () => TradeDirectionSchema,
46
+ TradeSchema: () => TradeSchema,
47
+ TradeSideSchema: () => TradeSideSchema,
48
+ WsChannelSchema: () => WsChannelSchema,
49
+ WsConnectionStateSchema: () => WsConnectionStateSchema,
50
+ WsDataSchema: () => WsDataSchema,
51
+ WsErrorSchema: () => WsErrorSchema,
52
+ WsHistoricalBatchSchema: () => WsHistoricalBatchSchema,
53
+ WsHistoricalDataSchema: () => WsHistoricalDataSchema,
54
+ WsPongSchema: () => WsPongSchema,
55
+ WsReplayCompletedSchema: () => WsReplayCompletedSchema,
56
+ WsReplayPausedSchema: () => WsReplayPausedSchema,
57
+ WsReplayResumedSchema: () => WsReplayResumedSchema,
58
+ WsReplayStartedSchema: () => WsReplayStartedSchema,
59
+ WsReplayStoppedSchema: () => WsReplayStoppedSchema,
60
+ WsServerMessageSchema: () => WsServerMessageSchema,
61
+ WsStreamCompletedSchema: () => WsStreamCompletedSchema,
62
+ WsStreamProgressSchema: () => WsStreamProgressSchema,
63
+ WsStreamStartedSchema: () => WsStreamStartedSchema,
64
+ WsStreamStoppedSchema: () => WsStreamStoppedSchema,
65
+ WsSubscribedSchema: () => WsSubscribedSchema,
66
+ WsUnsubscribedSchema: () => WsUnsubscribedSchema,
26
67
  default: () => OxArchive
27
68
  });
28
69
  module.exports = __toCommonJS(index_exports);
@@ -44,15 +85,25 @@ var HttpClient = class {
44
85
  baseUrl;
45
86
  apiKey;
46
87
  timeout;
88
+ validate;
47
89
  constructor(options) {
48
90
  this.baseUrl = options.baseUrl.replace(/\/$/, "");
49
91
  this.apiKey = options.apiKey;
50
92
  this.timeout = options.timeout;
93
+ this.validate = options.validate ?? false;
94
+ }
95
+ /** Whether validation is enabled */
96
+ get validationEnabled() {
97
+ return this.validate;
51
98
  }
52
99
  /**
53
100
  * Make a GET request to the API
101
+ *
102
+ * @param path - API endpoint path
103
+ * @param params - Query parameters
104
+ * @param schema - Optional Zod schema for validation (used when validation is enabled)
54
105
  */
55
- async get(path, params) {
106
+ async get(path, params, schema) {
56
107
  const url = new URL(`${this.baseUrl}${path}`);
57
108
  if (params) {
58
109
  for (const [key, value] of Object.entries(params)) {
@@ -82,6 +133,17 @@ var HttpClient = class {
82
133
  data.meta?.request_id
83
134
  );
84
135
  }
136
+ if (this.validate && schema) {
137
+ const result = schema.safeParse(data);
138
+ if (!result.success) {
139
+ throw new OxArchiveError(
140
+ `Response validation failed: ${result.error.message}`,
141
+ 422,
142
+ data.meta?.request_id
143
+ );
144
+ }
145
+ return result.data;
146
+ }
85
147
  return data;
86
148
  } catch (error) {
87
149
  clearTimeout(timeoutId);
@@ -99,6 +161,203 @@ var HttpClient = class {
99
161
  }
100
162
  };
101
163
 
164
+ // src/schemas.ts
165
+ var import_zod = require("zod");
166
+ var ApiMetaSchema = import_zod.z.object({
167
+ count: import_zod.z.number(),
168
+ next_cursor: import_zod.z.string().optional(),
169
+ request_id: import_zod.z.string()
170
+ });
171
+ var ApiResponseSchema = (dataSchema) => import_zod.z.object({
172
+ success: import_zod.z.boolean(),
173
+ data: dataSchema,
174
+ meta: ApiMetaSchema
175
+ });
176
+ var PriceLevelSchema = import_zod.z.object({
177
+ px: import_zod.z.string(),
178
+ sz: import_zod.z.string(),
179
+ n: import_zod.z.number()
180
+ });
181
+ var OrderBookSchema = import_zod.z.object({
182
+ coin: import_zod.z.string(),
183
+ timestamp: import_zod.z.string(),
184
+ bids: import_zod.z.array(PriceLevelSchema),
185
+ asks: import_zod.z.array(PriceLevelSchema),
186
+ mid_price: import_zod.z.string().optional(),
187
+ spread: import_zod.z.string().optional(),
188
+ spread_bps: import_zod.z.string().optional()
189
+ });
190
+ var TradeSideSchema = import_zod.z.enum(["A", "B"]);
191
+ var TradeDirectionSchema = import_zod.z.enum([
192
+ "Open Long",
193
+ "Open Short",
194
+ "Close Long",
195
+ "Close Short"
196
+ ]);
197
+ var DataSourceSchema = import_zod.z.enum(["s3", "ws", "api", "live"]);
198
+ var TradeSchema = import_zod.z.object({
199
+ coin: import_zod.z.string(),
200
+ side: TradeSideSchema,
201
+ price: import_zod.z.string(),
202
+ size: import_zod.z.string(),
203
+ timestamp: import_zod.z.string(),
204
+ tx_hash: import_zod.z.string().optional(),
205
+ trade_id: import_zod.z.number().optional(),
206
+ order_id: import_zod.z.number().optional(),
207
+ crossed: import_zod.z.boolean().optional(),
208
+ fee: import_zod.z.string().optional(),
209
+ fee_token: import_zod.z.string().optional(),
210
+ closed_pnl: import_zod.z.string().optional(),
211
+ direction: TradeDirectionSchema.optional(),
212
+ start_position: import_zod.z.string().optional(),
213
+ source: DataSourceSchema.optional(),
214
+ user_address: import_zod.z.string().optional(),
215
+ maker_address: import_zod.z.string().optional(),
216
+ taker_address: import_zod.z.string().optional()
217
+ });
218
+ var InstrumentTypeSchema = import_zod.z.enum(["perp", "spot"]);
219
+ var InstrumentSchema = import_zod.z.object({
220
+ name: import_zod.z.string(),
221
+ szDecimals: import_zod.z.number(),
222
+ maxLeverage: import_zod.z.number().optional(),
223
+ onlyIsolated: import_zod.z.boolean().optional(),
224
+ instrumentType: InstrumentTypeSchema.optional(),
225
+ isActive: import_zod.z.boolean()
226
+ });
227
+ var FundingRateSchema = import_zod.z.object({
228
+ coin: import_zod.z.string(),
229
+ timestamp: import_zod.z.string(),
230
+ funding_rate: import_zod.z.string(),
231
+ premium: import_zod.z.string().optional()
232
+ });
233
+ var OpenInterestSchema = import_zod.z.object({
234
+ coin: import_zod.z.string(),
235
+ timestamp: import_zod.z.string(),
236
+ open_interest: import_zod.z.string(),
237
+ mark_price: import_zod.z.string().optional(),
238
+ oracle_price: import_zod.z.string().optional(),
239
+ day_ntl_volume: import_zod.z.string().optional(),
240
+ prev_day_price: import_zod.z.string().optional(),
241
+ mid_price: import_zod.z.string().optional(),
242
+ impact_bid_price: import_zod.z.string().optional(),
243
+ impact_ask_price: import_zod.z.string().optional()
244
+ });
245
+ var WsChannelSchema = import_zod.z.enum(["orderbook", "trades", "ticker", "all_tickers"]);
246
+ var WsConnectionStateSchema = import_zod.z.enum(["connecting", "connected", "disconnected", "reconnecting"]);
247
+ var WsSubscribedSchema = import_zod.z.object({
248
+ type: import_zod.z.literal("subscribed"),
249
+ channel: WsChannelSchema,
250
+ coin: import_zod.z.string().optional()
251
+ });
252
+ var WsUnsubscribedSchema = import_zod.z.object({
253
+ type: import_zod.z.literal("unsubscribed"),
254
+ channel: WsChannelSchema,
255
+ coin: import_zod.z.string().optional()
256
+ });
257
+ var WsPongSchema = import_zod.z.object({
258
+ type: import_zod.z.literal("pong")
259
+ });
260
+ var WsErrorSchema = import_zod.z.object({
261
+ type: import_zod.z.literal("error"),
262
+ message: import_zod.z.string()
263
+ });
264
+ var WsDataSchema = import_zod.z.object({
265
+ type: import_zod.z.literal("data"),
266
+ channel: WsChannelSchema,
267
+ coin: import_zod.z.string(),
268
+ data: import_zod.z.unknown()
269
+ });
270
+ var WsReplayStartedSchema = import_zod.z.object({
271
+ type: import_zod.z.literal("replay_started"),
272
+ channel: WsChannelSchema,
273
+ coin: import_zod.z.string(),
274
+ start: import_zod.z.number(),
275
+ end: import_zod.z.number(),
276
+ speed: import_zod.z.number()
277
+ });
278
+ var WsReplayPausedSchema = import_zod.z.object({
279
+ type: import_zod.z.literal("replay_paused"),
280
+ current_timestamp: import_zod.z.number()
281
+ });
282
+ var WsReplayResumedSchema = import_zod.z.object({
283
+ type: import_zod.z.literal("replay_resumed"),
284
+ current_timestamp: import_zod.z.number()
285
+ });
286
+ var WsReplayCompletedSchema = import_zod.z.object({
287
+ type: import_zod.z.literal("replay_completed"),
288
+ channel: WsChannelSchema,
289
+ coin: import_zod.z.string(),
290
+ snapshots_sent: import_zod.z.number()
291
+ });
292
+ var WsReplayStoppedSchema = import_zod.z.object({
293
+ type: import_zod.z.literal("replay_stopped")
294
+ });
295
+ var WsHistoricalDataSchema = import_zod.z.object({
296
+ type: import_zod.z.literal("historical_data"),
297
+ channel: WsChannelSchema,
298
+ coin: import_zod.z.string(),
299
+ timestamp: import_zod.z.number(),
300
+ data: import_zod.z.unknown()
301
+ });
302
+ var WsStreamStartedSchema = import_zod.z.object({
303
+ type: import_zod.z.literal("stream_started"),
304
+ channel: WsChannelSchema,
305
+ coin: import_zod.z.string(),
306
+ start: import_zod.z.number(),
307
+ end: import_zod.z.number()
308
+ });
309
+ var WsStreamProgressSchema = import_zod.z.object({
310
+ type: import_zod.z.literal("stream_progress"),
311
+ snapshots_sent: import_zod.z.number()
312
+ });
313
+ var TimestampedRecordSchema = import_zod.z.object({
314
+ timestamp: import_zod.z.number(),
315
+ data: import_zod.z.unknown()
316
+ });
317
+ var WsHistoricalBatchSchema = import_zod.z.object({
318
+ type: import_zod.z.literal("historical_batch"),
319
+ channel: WsChannelSchema,
320
+ coin: import_zod.z.string(),
321
+ data: import_zod.z.array(TimestampedRecordSchema)
322
+ });
323
+ var WsStreamCompletedSchema = import_zod.z.object({
324
+ type: import_zod.z.literal("stream_completed"),
325
+ channel: WsChannelSchema,
326
+ coin: import_zod.z.string(),
327
+ snapshots_sent: import_zod.z.number()
328
+ });
329
+ var WsStreamStoppedSchema = import_zod.z.object({
330
+ type: import_zod.z.literal("stream_stopped"),
331
+ snapshots_sent: import_zod.z.number()
332
+ });
333
+ var WsServerMessageSchema = import_zod.z.discriminatedUnion("type", [
334
+ WsSubscribedSchema,
335
+ WsUnsubscribedSchema,
336
+ WsPongSchema,
337
+ WsErrorSchema,
338
+ WsDataSchema,
339
+ WsReplayStartedSchema,
340
+ WsReplayPausedSchema,
341
+ WsReplayResumedSchema,
342
+ WsReplayCompletedSchema,
343
+ WsReplayStoppedSchema,
344
+ WsHistoricalDataSchema,
345
+ WsStreamStartedSchema,
346
+ WsStreamProgressSchema,
347
+ WsHistoricalBatchSchema,
348
+ WsStreamCompletedSchema,
349
+ WsStreamStoppedSchema
350
+ ]);
351
+ var OrderBookResponseSchema = ApiResponseSchema(OrderBookSchema);
352
+ var OrderBookArrayResponseSchema = ApiResponseSchema(import_zod.z.array(OrderBookSchema));
353
+ var TradeArrayResponseSchema = ApiResponseSchema(import_zod.z.array(TradeSchema));
354
+ var InstrumentResponseSchema = ApiResponseSchema(InstrumentSchema);
355
+ var InstrumentArrayResponseSchema = ApiResponseSchema(import_zod.z.array(InstrumentSchema));
356
+ var FundingRateResponseSchema = ApiResponseSchema(FundingRateSchema);
357
+ var FundingRateArrayResponseSchema = ApiResponseSchema(import_zod.z.array(FundingRateSchema));
358
+ var OpenInterestResponseSchema = ApiResponseSchema(OpenInterestSchema);
359
+ var OpenInterestArrayResponseSchema = ApiResponseSchema(import_zod.z.array(OpenInterestSchema));
360
+
102
361
  // src/resources/orderbook.ts
103
362
  var OrderBookResource = class {
104
363
  constructor(http) {
@@ -114,7 +373,8 @@ var OrderBookResource = class {
114
373
  async get(coin, params) {
115
374
  const response = await this.http.get(
116
375
  `/v1/orderbook/${coin.toUpperCase()}`,
117
- params
376
+ params,
377
+ this.http.validationEnabled ? OrderBookResponseSchema : void 0
118
378
  );
119
379
  return response.data;
120
380
  }
@@ -128,7 +388,8 @@ var OrderBookResource = class {
128
388
  async history(coin, params) {
129
389
  const response = await this.http.get(
130
390
  `/v1/orderbook/${coin.toUpperCase()}/history`,
131
- params
391
+ params,
392
+ this.http.validationEnabled ? OrderBookArrayResponseSchema : void 0
132
393
  );
133
394
  return response.data;
134
395
  }
@@ -172,7 +433,8 @@ var TradesResource = class {
172
433
  async list(coin, params) {
173
434
  const response = await this.http.get(
174
435
  `/v1/trades/${coin.toUpperCase()}`,
175
- params
436
+ params,
437
+ this.http.validationEnabled ? TradeArrayResponseSchema : void 0
176
438
  );
177
439
  return {
178
440
  data: response.data,
@@ -189,7 +451,8 @@ var TradesResource = class {
189
451
  async recent(coin, limit) {
190
452
  const response = await this.http.get(
191
453
  `/v1/trades/${coin.toUpperCase()}/recent`,
192
- { limit }
454
+ { limit },
455
+ this.http.validationEnabled ? TradeArrayResponseSchema : void 0
193
456
  );
194
457
  return response.data;
195
458
  }
@@ -217,7 +480,8 @@ var TradesResource = class {
217
480
  async listWithOffset(coin, params) {
218
481
  const response = await this.http.get(
219
482
  `/v1/trades/${coin.toUpperCase()}`,
220
- params
483
+ params,
484
+ this.http.validationEnabled ? TradeArrayResponseSchema : void 0
221
485
  );
222
486
  return response.data;
223
487
  }
@@ -235,7 +499,9 @@ var InstrumentsResource = class {
235
499
  */
236
500
  async list() {
237
501
  const response = await this.http.get(
238
- "/v1/instruments"
502
+ "/v1/instruments",
503
+ void 0,
504
+ this.http.validationEnabled ? InstrumentArrayResponseSchema : void 0
239
505
  );
240
506
  return response.data;
241
507
  }
@@ -247,7 +513,9 @@ var InstrumentsResource = class {
247
513
  */
248
514
  async get(coin) {
249
515
  const response = await this.http.get(
250
- `/v1/instruments/${coin.toUpperCase()}`
516
+ `/v1/instruments/${coin.toUpperCase()}`,
517
+ void 0,
518
+ this.http.validationEnabled ? InstrumentResponseSchema : void 0
251
519
  );
252
520
  return response.data;
253
521
  }
@@ -268,7 +536,8 @@ var FundingResource = class {
268
536
  async history(coin, params) {
269
537
  const response = await this.http.get(
270
538
  `/v1/funding/${coin.toUpperCase()}`,
271
- params
539
+ params,
540
+ this.http.validationEnabled ? FundingRateArrayResponseSchema : void 0
272
541
  );
273
542
  return response.data;
274
543
  }
@@ -280,7 +549,9 @@ var FundingResource = class {
280
549
  */
281
550
  async current(coin) {
282
551
  const response = await this.http.get(
283
- `/v1/funding/${coin.toUpperCase()}/current`
552
+ `/v1/funding/${coin.toUpperCase()}/current`,
553
+ void 0,
554
+ this.http.validationEnabled ? FundingRateResponseSchema : void 0
284
555
  );
285
556
  return response.data;
286
557
  }
@@ -301,7 +572,8 @@ var OpenInterestResource = class {
301
572
  async history(coin, params) {
302
573
  const response = await this.http.get(
303
574
  `/v1/openinterest/${coin.toUpperCase()}`,
304
- params
575
+ params,
576
+ this.http.validationEnabled ? OpenInterestArrayResponseSchema : void 0
305
577
  );
306
578
  return response.data;
307
579
  }
@@ -313,7 +585,9 @@ var OpenInterestResource = class {
313
585
  */
314
586
  async current(coin) {
315
587
  const response = await this.http.get(
316
- `/v1/openinterest/${coin.toUpperCase()}/current`
588
+ `/v1/openinterest/${coin.toUpperCase()}/current`,
589
+ void 0,
590
+ this.http.validationEnabled ? OpenInterestResponseSchema : void 0
317
591
  );
318
592
  return response.data;
319
593
  }
@@ -356,7 +630,8 @@ var OxArchive = class {
356
630
  this.http = new HttpClient({
357
631
  baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,
358
632
  apiKey: options.apiKey,
359
- timeout: options.timeout ?? DEFAULT_TIMEOUT
633
+ timeout: options.timeout ?? DEFAULT_TIMEOUT,
634
+ validate: options.validate ?? false
360
635
  });
361
636
  this.orderbook = new OrderBookResource(this.http);
362
637
  this.trades = new TradesResource(this.http);
@@ -381,6 +656,10 @@ function transformTrade(coin, raw) {
381
656
  const time = raw.time;
382
657
  const hash = raw.hash;
383
658
  const tid = raw.tid;
659
+ const users = raw.users;
660
+ const maker_address = users && users.length > 0 ? users[0] : void 0;
661
+ const taker_address = users && users.length > 1 ? users[1] : void 0;
662
+ const user_address = raw.userAddress ?? raw.user_address;
384
663
  return {
385
664
  coin,
386
665
  side: side === "A" || side === "B" ? side : "B",
@@ -388,7 +667,10 @@ function transformTrade(coin, raw) {
388
667
  size: sz ?? "0",
389
668
  timestamp: time ? new Date(time).toISOString() : (/* @__PURE__ */ new Date()).toISOString(),
390
669
  tx_hash: hash,
391
- trade_id: tid
670
+ trade_id: tid,
671
+ maker_address,
672
+ taker_address,
673
+ user_address
392
674
  };
393
675
  }
394
676
  function transformTrades(coin, rawTrades) {
@@ -864,8 +1146,49 @@ var OxArchiveWs = class {
864
1146
  };
865
1147
  // Annotate the CommonJS export names for ESM import in node:
866
1148
  0 && (module.exports = {
1149
+ ApiMetaSchema,
1150
+ ApiResponseSchema,
1151
+ DataSourceSchema,
1152
+ FundingRateArrayResponseSchema,
1153
+ FundingRateResponseSchema,
1154
+ FundingRateSchema,
1155
+ InstrumentArrayResponseSchema,
1156
+ InstrumentResponseSchema,
1157
+ InstrumentSchema,
1158
+ InstrumentTypeSchema,
1159
+ OpenInterestArrayResponseSchema,
1160
+ OpenInterestResponseSchema,
1161
+ OpenInterestSchema,
1162
+ OrderBookArrayResponseSchema,
1163
+ OrderBookResponseSchema,
1164
+ OrderBookSchema,
867
1165
  OxArchive,
868
1166
  OxArchiveError,
869
- OxArchiveWs
1167
+ OxArchiveWs,
1168
+ PriceLevelSchema,
1169
+ TimestampedRecordSchema,
1170
+ TradeArrayResponseSchema,
1171
+ TradeDirectionSchema,
1172
+ TradeSchema,
1173
+ TradeSideSchema,
1174
+ WsChannelSchema,
1175
+ WsConnectionStateSchema,
1176
+ WsDataSchema,
1177
+ WsErrorSchema,
1178
+ WsHistoricalBatchSchema,
1179
+ WsHistoricalDataSchema,
1180
+ WsPongSchema,
1181
+ WsReplayCompletedSchema,
1182
+ WsReplayPausedSchema,
1183
+ WsReplayResumedSchema,
1184
+ WsReplayStartedSchema,
1185
+ WsReplayStoppedSchema,
1186
+ WsServerMessageSchema,
1187
+ WsStreamCompletedSchema,
1188
+ WsStreamProgressSchema,
1189
+ WsStreamStartedSchema,
1190
+ WsStreamStoppedSchema,
1191
+ WsSubscribedSchema,
1192
+ WsUnsubscribedSchema
870
1193
  });
871
1194
  //# sourceMappingURL=index.js.map