@0xmonaco/core 0.4.1 → 0.5.0
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 +23 -8
- package/dist/api/applications/api.d.ts +1 -2
- package/dist/api/applications/api.d.ts.map +1 -1
- package/dist/api/applications/api.js +1 -2
- package/dist/api/applications/api.js.map +1 -1
- package/dist/api/applications/index.d.ts +1 -2
- package/dist/api/applications/index.d.ts.map +1 -1
- package/dist/api/applications/index.js +1 -1
- package/dist/api/applications/index.js.map +1 -1
- package/dist/api/auth/api.d.ts +1 -1
- package/dist/api/auth/api.d.ts.map +1 -1
- package/dist/api/auth/api.js +2 -2
- package/dist/api/auth/api.js.map +1 -1
- package/dist/api/auth/index.d.ts +1 -2
- package/dist/api/auth/index.d.ts.map +1 -1
- package/dist/api/auth/index.js +1 -1
- package/dist/api/auth/index.js.map +1 -1
- package/dist/api/base.d.ts +26 -1
- package/dist/api/base.d.ts.map +1 -1
- package/dist/api/base.js +173 -43
- package/dist/api/base.js.map +1 -1
- package/dist/api/fees/api.d.ts +1 -1
- package/dist/api/fees/api.d.ts.map +1 -1
- package/dist/api/fees/api.js +4 -4
- package/dist/api/fees/api.js.map +1 -1
- package/dist/api/fees/index.d.ts +1 -1
- package/dist/api/fees/index.d.ts.map +1 -1
- package/dist/api/fees/index.js +1 -1
- package/dist/api/fees/index.js.map +1 -1
- package/dist/api/index.d.ts +10 -8
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +10 -8
- package/dist/api/index.js.map +1 -1
- package/dist/api/market/api.d.ts +1 -1
- package/dist/api/market/api.d.ts.map +1 -1
- package/dist/api/market/api.js +12 -3
- package/dist/api/market/api.js.map +1 -1
- package/dist/api/market/index.d.ts +1 -2
- package/dist/api/market/index.d.ts.map +1 -1
- package/dist/api/market/index.js +1 -1
- package/dist/api/market/index.js.map +1 -1
- package/dist/api/orderbook/api.d.ts +16 -0
- package/dist/api/orderbook/api.d.ts.map +1 -0
- package/dist/api/orderbook/api.js +38 -0
- package/dist/api/orderbook/api.js.map +1 -0
- package/dist/api/orderbook/index.d.ts +2 -0
- package/dist/api/orderbook/index.d.ts.map +1 -0
- package/dist/api/orderbook/index.js +2 -0
- package/dist/api/orderbook/index.js.map +1 -0
- package/dist/api/profile/api.d.ts +10 -11
- package/dist/api/profile/api.d.ts.map +1 -1
- package/dist/api/profile/api.js +17 -11
- package/dist/api/profile/api.js.map +1 -1
- package/dist/api/profile/index.d.ts +1 -1
- package/dist/api/profile/index.d.ts.map +1 -1
- package/dist/api/profile/index.js +1 -1
- package/dist/api/profile/index.js.map +1 -1
- package/dist/api/trades/api.d.ts +45 -0
- package/dist/api/trades/api.d.ts.map +1 -0
- package/dist/api/trades/api.js +43 -0
- package/dist/api/trades/api.js.map +1 -0
- package/dist/api/trades/index.d.ts +2 -0
- package/dist/api/trades/index.d.ts.map +1 -0
- package/dist/api/trades/index.js +2 -0
- package/dist/api/trades/index.js.map +1 -0
- package/dist/api/trading/api.d.ts +1 -2
- package/dist/api/trading/api.d.ts.map +1 -1
- package/dist/api/trading/api.js +10 -2
- package/dist/api/trading/api.js.map +1 -1
- package/dist/api/trading/index.d.ts +1 -2
- package/dist/api/trading/index.d.ts.map +1 -1
- package/dist/api/trading/index.js +1 -1
- package/dist/api/trading/index.js.map +1 -1
- package/dist/api/vault/api.d.ts +17 -19
- package/dist/api/vault/api.d.ts.map +1 -1
- package/dist/api/vault/api.js +58 -46
- package/dist/api/vault/api.js.map +1 -1
- package/dist/api/vault/index.d.ts +1 -2
- package/dist/api/vault/index.d.ts.map +1 -1
- package/dist/api/vault/index.js +1 -1
- package/dist/api/vault/index.js.map +1 -1
- package/dist/api/websocket/index.d.ts +3 -9
- package/dist/api/websocket/index.d.ts.map +1 -1
- package/dist/api/websocket/index.js +3 -9
- package/dist/api/websocket/index.js.map +1 -1
- package/dist/api/websocket/types.d.ts +34 -0
- package/dist/api/websocket/types.d.ts.map +1 -0
- package/dist/api/websocket/types.js +2 -0
- package/dist/api/websocket/types.js.map +1 -0
- package/dist/api/websocket/utils.d.ts +9 -0
- package/dist/api/websocket/utils.d.ts.map +1 -0
- package/dist/api/websocket/utils.js +23 -0
- package/dist/api/websocket/utils.js.map +1 -0
- package/dist/api/websocket/websocket.d.ts +6 -0
- package/dist/api/websocket/websocket.d.ts.map +1 -0
- package/dist/api/websocket/websocket.js +309 -0
- package/dist/api/websocket/websocket.js.map +1 -0
- package/dist/errors/errors.d.ts +382 -0
- package/dist/errors/errors.d.ts.map +1 -0
- package/dist/errors/errors.js +801 -0
- package/dist/errors/errors.js.map +1 -0
- package/dist/errors/index.d.ts +2 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +2 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +5 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -22
- package/dist/index.js.map +1 -1
- package/dist/networks/index.d.ts +2 -0
- package/dist/networks/index.d.ts.map +1 -0
- package/dist/networks/index.js +2 -0
- package/dist/networks/index.js.map +1 -0
- package/dist/{networks.d.ts → networks/networks.d.ts} +1 -1
- package/dist/networks/networks.d.ts.map +1 -0
- package/dist/{networks.js → networks/networks.js} +4 -3
- package/dist/networks/networks.js.map +1 -0
- package/dist/sdk.d.ts +19 -27
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +77 -107
- package/dist/sdk.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +5 -7
- package/dist/api/websocket/base-ws-client.d.ts +0 -85
- package/dist/api/websocket/base-ws-client.d.ts.map +0 -1
- package/dist/api/websocket/base-ws-client.js +0 -256
- package/dist/api/websocket/base-ws-client.js.map +0 -1
- package/dist/api/websocket/clients/ohlcv-ws-client.d.ts +0 -57
- package/dist/api/websocket/clients/ohlcv-ws-client.d.ts.map +0 -1
- package/dist/api/websocket/clients/ohlcv-ws-client.js +0 -132
- package/dist/api/websocket/clients/ohlcv-ws-client.js.map +0 -1
- package/dist/api/websocket/clients/orderbook-ws-client.d.ts +0 -70
- package/dist/api/websocket/clients/orderbook-ws-client.d.ts.map +0 -1
- package/dist/api/websocket/clients/orderbook-ws-client.js +0 -197
- package/dist/api/websocket/clients/orderbook-ws-client.js.map +0 -1
- package/dist/api/websocket/clients/orders-ws-client.d.ts +0 -61
- package/dist/api/websocket/clients/orders-ws-client.d.ts.map +0 -1
- package/dist/api/websocket/clients/orders-ws-client.js +0 -150
- package/dist/api/websocket/clients/orders-ws-client.js.map +0 -1
- package/dist/errors.d.ts +0 -103
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -108
- package/dist/errors.js.map +0 -1
- package/dist/networks.d.ts.map +0 -1
- package/dist/networks.js.map +0 -1
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Orderbook WebSocket Client Implementation
|
|
3
|
-
*
|
|
4
|
-
* PUBLIC WebSocket client for orderbook-related events and operations.
|
|
5
|
-
* No authentication required - provides public orderbook market data.
|
|
6
|
-
* Extends the base WebSocket client with orderbook-specific functionality.
|
|
7
|
-
*/
|
|
8
|
-
import { type OrderbookEvent, type OrderbookQuotationMode, type OrderbookWebSocketClient, type RawEventMessage, type TradingMode } from "@0xmonaco/types";
|
|
9
|
-
import { BaseWebSocketClientImpl } from "../base-ws-client.js";
|
|
10
|
-
/**
|
|
11
|
-
* Orderbook-specific WebSocket client implementation
|
|
12
|
-
*/
|
|
13
|
-
export declare class OrderbookWebSocketClientImpl extends BaseWebSocketClientImpl implements OrderbookWebSocketClient {
|
|
14
|
-
private orderbookHandlers;
|
|
15
|
-
/** Build channel name for orderbook subscription */
|
|
16
|
-
private getChannelName;
|
|
17
|
-
/** Build subscription key for handler lookup */
|
|
18
|
-
private getSubscriptionKey;
|
|
19
|
-
/** Extract magnitude and quotationMode from channel string (e.g., "orderbook:BTC/USDC:SPOT:10:BASE" -> { magnitude: 10, quotationMode: "BASE" }) */
|
|
20
|
-
private extractChannelParams;
|
|
21
|
-
/**
|
|
22
|
-
* Subscribe to orderbook events for a specific market and trading mode.
|
|
23
|
-
* No authentication required - provides public orderbook data.
|
|
24
|
-
*
|
|
25
|
-
* @param market - Trading pair symbol (e.g., "BTC/USDC")
|
|
26
|
-
* @param tradingMode - Trading mode (TradingMode.SPOT or TradingMode.MARGIN)
|
|
27
|
-
* @param callback - Function to handle incoming orderbook events
|
|
28
|
-
* @param magnitude - Optional magnitude for orderbook grouping (0.0001 to 10000, defaults to no grouping)
|
|
29
|
-
* @param quotationMode - Optional quotation mode ("BASE" or "QUOTE"), defaults to "BASE"
|
|
30
|
-
*
|
|
31
|
-
* @example
|
|
32
|
-
* ```typescript
|
|
33
|
-
* // No authentication required
|
|
34
|
-
* await orderbookWS.connect();
|
|
35
|
-
*
|
|
36
|
-
* orderbookWS.subscribeToOrderbookEvents("BTC/USDC", TradingMode.SPOT, (event) => {
|
|
37
|
-
* console.log("Orderbook update:", event.bids.length, "bids", event.asks.length, "asks");
|
|
38
|
-
* });
|
|
39
|
-
*
|
|
40
|
-
* // With magnitude for grouping
|
|
41
|
-
* orderbookWS.subscribeToOrderbookEvents("BTC/USDC", TradingMode.SPOT, (event) => {
|
|
42
|
-
* console.log("Grouped orderbook:", event);
|
|
43
|
-
* }, 10);
|
|
44
|
-
*
|
|
45
|
-
* // With QUOTE quotation mode
|
|
46
|
-
* orderbookWS.subscribeToOrderbookEvents("BTC/USDC", TradingMode.SPOT, (event) => {
|
|
47
|
-
* console.log("Orderbook in QUOTE:", event);
|
|
48
|
-
* }, undefined, "QUOTE");
|
|
49
|
-
* ```
|
|
50
|
-
*/
|
|
51
|
-
subscribeToOrderbookEvents(market: string, tradingMode: TradingMode, callback: (event: OrderbookEvent) => void, magnitude?: number, quotationMode?: OrderbookQuotationMode): void;
|
|
52
|
-
/**
|
|
53
|
-
* Unsubscribe from orderbook events for a specific market and trading mode.
|
|
54
|
-
*
|
|
55
|
-
* @param market - Trading pair symbol (e.g., "BTC/USDC")
|
|
56
|
-
* @param tradingMode - Trading mode (TradingMode.SPOT or TradingMode.MARGIN)
|
|
57
|
-
* @param magnitude - Optional magnitude that was used when subscribing
|
|
58
|
-
* @param quotationMode - Optional quotation mode that was used when subscribing
|
|
59
|
-
*/
|
|
60
|
-
unsubscribeFromOrderbookEvents(market: string, tradingMode: TradingMode, magnitude?: number, quotationMode?: OrderbookQuotationMode): void;
|
|
61
|
-
/** Handle incoming WebSocket messages with orderbook-specific logic */
|
|
62
|
-
protected handleMessage(message: RawEventMessage): void;
|
|
63
|
-
/** Check if message is an orderbook event from the backend */
|
|
64
|
-
private isOrderbookEvent;
|
|
65
|
-
/** Handle orderbook-specific events from the backend */
|
|
66
|
-
private handleOrderbookEvent;
|
|
67
|
-
/** Clean up resources when disconnecting */
|
|
68
|
-
protected cleanup(): void;
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=orderbook-ws-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orderbook-ws-client.d.ts","sourceRoot":"","sources":["../../../../src/api/websocket/clients/orderbook-ws-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAE7B,KAAK,eAAe,EAEpB,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D;;GAEG;AACH,qBAAa,4BAA6B,SAAQ,uBAAwB,YAAW,wBAAwB;IAC3G,OAAO,CAAC,iBAAiB,CAA2D;IAEpF,oDAAoD;IACpD,OAAO,CAAC,cAAc;IAOtB,gDAAgD;IAChD,OAAO,CAAC,kBAAkB;IAM1B,oJAAoJ;IACpJ,OAAO,CAAC,oBAAoB;IAmC5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,0BAA0B,CACxB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,EACzC,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,sBAAsB,GACrC,IAAI;IAaP;;;;;;;OAOG;IACH,8BAA8B,CAC5B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,sBAAsB,GACrC,IAAI;IAaP,uEAAuE;IACvE,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAUvD,8DAA8D;IAC9D,OAAO,CAAC,gBAAgB;IAIxB,wDAAwD;IACxD,OAAO,CAAC,oBAAoB;IAkE5B,4CAA4C;IAC5C,SAAS,CAAC,OAAO,IAAI,IAAI;CAG1B"}
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Orderbook WebSocket Client Implementation
|
|
3
|
-
*
|
|
4
|
-
* PUBLIC WebSocket client for orderbook-related events and operations.
|
|
5
|
-
* No authentication required - provides public orderbook market data.
|
|
6
|
-
* Extends the base WebSocket client with orderbook-specific functionality.
|
|
7
|
-
*/
|
|
8
|
-
import { WebSocketChannel, } from "@0xmonaco/types";
|
|
9
|
-
import { BaseWebSocketClientImpl } from "../base-ws-client.js";
|
|
10
|
-
/**
|
|
11
|
-
* Orderbook-specific WebSocket client implementation
|
|
12
|
-
*/
|
|
13
|
-
export class OrderbookWebSocketClientImpl extends BaseWebSocketClientImpl {
|
|
14
|
-
constructor() {
|
|
15
|
-
super(...arguments);
|
|
16
|
-
this.orderbookHandlers = new Map();
|
|
17
|
-
}
|
|
18
|
-
/** Build channel name for orderbook subscription */
|
|
19
|
-
getChannelName(market, tradingMode, magnitude, quotationMode) {
|
|
20
|
-
const mode = quotationMode || "BASE";
|
|
21
|
-
return magnitude !== undefined
|
|
22
|
-
? `orderbook:${market}:${tradingMode}:${magnitude}:${mode}`
|
|
23
|
-
: `orderbook:${market}:${tradingMode}:${mode}`;
|
|
24
|
-
}
|
|
25
|
-
/** Build subscription key for handler lookup */
|
|
26
|
-
getSubscriptionKey(market, tradingMode, magnitude, quotationMode) {
|
|
27
|
-
const mode = (quotationMode || "BASE").toUpperCase();
|
|
28
|
-
const base = `${market.toUpperCase()}-${tradingMode.toUpperCase()}`;
|
|
29
|
-
return magnitude !== undefined ? `${base}-${magnitude}-${mode}` : `${base}-${mode}`;
|
|
30
|
-
}
|
|
31
|
-
/** Extract magnitude and quotationMode from channel string (e.g., "orderbook:BTC/USDC:SPOT:10:BASE" -> { magnitude: 10, quotationMode: "BASE" }) */
|
|
32
|
-
extractChannelParams(channel) {
|
|
33
|
-
const parts = channel.split(":");
|
|
34
|
-
// Channel formats:
|
|
35
|
-
// "orderbook:market:tradingMode" - old 3-part format (no magnitude, no quotationMode)
|
|
36
|
-
// "orderbook:market:tradingMode:BASE" or "orderbook:market:tradingMode:QUOTE" (4 parts)
|
|
37
|
-
// "orderbook:market:tradingMode:magnitude:BASE" or "orderbook:market:tradingMode:magnitude:QUOTE" (5 parts)
|
|
38
|
-
// Old 3-part format: "orderbook:market:tradingMode" (no magnitude, no quotationMode)
|
|
39
|
-
if (parts.length === 3) {
|
|
40
|
-
return {};
|
|
41
|
-
}
|
|
42
|
-
if (parts.length === 4) {
|
|
43
|
-
const lastPart = parts[3].toUpperCase();
|
|
44
|
-
// Check if it's a quotation mode
|
|
45
|
-
if (lastPart === "BASE" || lastPart === "QUOTE") {
|
|
46
|
-
return { quotationMode: lastPart };
|
|
47
|
-
}
|
|
48
|
-
// Otherwise it might be magnitude (old format)
|
|
49
|
-
const magnitude = Number(parts[3]);
|
|
50
|
-
return Number.isNaN(magnitude) ? {} : { magnitude };
|
|
51
|
-
}
|
|
52
|
-
if (parts.length === 5) {
|
|
53
|
-
const magnitude = Number(parts[3]);
|
|
54
|
-
const quotationMode = parts[4].toUpperCase();
|
|
55
|
-
return {
|
|
56
|
-
magnitude: Number.isNaN(magnitude) ? undefined : magnitude,
|
|
57
|
-
quotationMode: quotationMode === "BASE" || quotationMode === "QUOTE" ? quotationMode : undefined,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
return {};
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Subscribe to orderbook events for a specific market and trading mode.
|
|
64
|
-
* No authentication required - provides public orderbook data.
|
|
65
|
-
*
|
|
66
|
-
* @param market - Trading pair symbol (e.g., "BTC/USDC")
|
|
67
|
-
* @param tradingMode - Trading mode (TradingMode.SPOT or TradingMode.MARGIN)
|
|
68
|
-
* @param callback - Function to handle incoming orderbook events
|
|
69
|
-
* @param magnitude - Optional magnitude for orderbook grouping (0.0001 to 10000, defaults to no grouping)
|
|
70
|
-
* @param quotationMode - Optional quotation mode ("BASE" or "QUOTE"), defaults to "BASE"
|
|
71
|
-
*
|
|
72
|
-
* @example
|
|
73
|
-
* ```typescript
|
|
74
|
-
* // No authentication required
|
|
75
|
-
* await orderbookWS.connect();
|
|
76
|
-
*
|
|
77
|
-
* orderbookWS.subscribeToOrderbookEvents("BTC/USDC", TradingMode.SPOT, (event) => {
|
|
78
|
-
* console.log("Orderbook update:", event.bids.length, "bids", event.asks.length, "asks");
|
|
79
|
-
* });
|
|
80
|
-
*
|
|
81
|
-
* // With magnitude for grouping
|
|
82
|
-
* orderbookWS.subscribeToOrderbookEvents("BTC/USDC", TradingMode.SPOT, (event) => {
|
|
83
|
-
* console.log("Grouped orderbook:", event);
|
|
84
|
-
* }, 10);
|
|
85
|
-
*
|
|
86
|
-
* // With QUOTE quotation mode
|
|
87
|
-
* orderbookWS.subscribeToOrderbookEvents("BTC/USDC", TradingMode.SPOT, (event) => {
|
|
88
|
-
* console.log("Orderbook in QUOTE:", event);
|
|
89
|
-
* }, undefined, "QUOTE");
|
|
90
|
-
* ```
|
|
91
|
-
*/
|
|
92
|
-
subscribeToOrderbookEvents(market, tradingMode, callback, magnitude, quotationMode) {
|
|
93
|
-
const channel = this.getChannelName(market, tradingMode, magnitude, quotationMode);
|
|
94
|
-
const subscriptionKey = this.getSubscriptionKey(market, tradingMode, magnitude, quotationMode);
|
|
95
|
-
this.orderbookHandlers.set(subscriptionKey, callback);
|
|
96
|
-
// Send subscription message using backend's channel format
|
|
97
|
-
this.send({
|
|
98
|
-
type: "Subscribe",
|
|
99
|
-
channels: [channel],
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Unsubscribe from orderbook events for a specific market and trading mode.
|
|
104
|
-
*
|
|
105
|
-
* @param market - Trading pair symbol (e.g., "BTC/USDC")
|
|
106
|
-
* @param tradingMode - Trading mode (TradingMode.SPOT or TradingMode.MARGIN)
|
|
107
|
-
* @param magnitude - Optional magnitude that was used when subscribing
|
|
108
|
-
* @param quotationMode - Optional quotation mode that was used when subscribing
|
|
109
|
-
*/
|
|
110
|
-
unsubscribeFromOrderbookEvents(market, tradingMode, magnitude, quotationMode) {
|
|
111
|
-
const channel = this.getChannelName(market, tradingMode, magnitude, quotationMode);
|
|
112
|
-
const subscriptionKey = this.getSubscriptionKey(market, tradingMode, magnitude, quotationMode);
|
|
113
|
-
this.orderbookHandlers.delete(subscriptionKey);
|
|
114
|
-
// Send unsubscription message
|
|
115
|
-
this.send({
|
|
116
|
-
type: "Unsubscribe",
|
|
117
|
-
channels: [channel],
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
/** Handle incoming WebSocket messages with orderbook-specific logic */
|
|
121
|
-
handleMessage(message) {
|
|
122
|
-
// Handle base messages first (PONG, etc.)
|
|
123
|
-
super.handleMessage(message);
|
|
124
|
-
// Handle orderbook-specific Event messages
|
|
125
|
-
if (this.isOrderbookEvent(message)) {
|
|
126
|
-
this.handleOrderbookEvent(message);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
/** Check if message is an orderbook event from the backend */
|
|
130
|
-
isOrderbookEvent(message) {
|
|
131
|
-
return this.isEventMessage(message, WebSocketChannel.Orderbook);
|
|
132
|
-
}
|
|
133
|
-
/** Handle orderbook-specific events from the backend */
|
|
134
|
-
handleOrderbookEvent(event) {
|
|
135
|
-
try {
|
|
136
|
-
const msg = event;
|
|
137
|
-
const backendEvent = msg.data; // Parent (has pair, trading_mode)
|
|
138
|
-
const orderbookData = backendEvent.data; // Nested (has bids, asks, etc.)
|
|
139
|
-
const symbol = backendEvent.pair;
|
|
140
|
-
const tradingMode = backendEvent.trading_mode;
|
|
141
|
-
if (!symbol || !tradingMode) {
|
|
142
|
-
console.warn("Missing required orderbook event data:", backendEvent);
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
// Extract magnitude and quotationMode from the channel if present (e.g., "orderbook:BTC/USDC:SPOT:10:BASE")
|
|
146
|
-
const { magnitude, quotationMode } = this.extractChannelParams(event.channel);
|
|
147
|
-
const subscriptionKey = this.getSubscriptionKey(symbol, tradingMode, magnitude, quotationMode);
|
|
148
|
-
const handler = this.orderbookHandlers.get(subscriptionKey);
|
|
149
|
-
if (handler) {
|
|
150
|
-
// Backend orderbook event structure (matching matching_engine::types::OrderbookUpdateEvent)
|
|
151
|
-
const transformedEvent = {
|
|
152
|
-
symbol: symbol,
|
|
153
|
-
tradingMode: tradingMode,
|
|
154
|
-
bids: (orderbookData?.bids || []).map((level) => ({
|
|
155
|
-
price: level.price,
|
|
156
|
-
quantity: level.quantity,
|
|
157
|
-
orderCount: level.order_count || 0,
|
|
158
|
-
})),
|
|
159
|
-
asks: (orderbookData?.asks || []).map((level) => ({
|
|
160
|
-
price: level.price,
|
|
161
|
-
quantity: level.quantity,
|
|
162
|
-
orderCount: level.order_count || 0,
|
|
163
|
-
})),
|
|
164
|
-
bestBid: orderbookData?.best_bid || undefined,
|
|
165
|
-
bestAsk: orderbookData?.best_ask || undefined,
|
|
166
|
-
bidVolume: orderbookData?.bid_volume || "0",
|
|
167
|
-
askVolume: orderbookData?.ask_volume || "0",
|
|
168
|
-
priceChange: orderbookData?.price_change
|
|
169
|
-
? {
|
|
170
|
-
side: orderbookData.price_change.side,
|
|
171
|
-
oldPrice: orderbookData.price_change.old_price,
|
|
172
|
-
newPrice: orderbookData.price_change.new_price,
|
|
173
|
-
levelRemoved: orderbookData.price_change.level_removed || false,
|
|
174
|
-
levelAdded: orderbookData.price_change.level_added || false,
|
|
175
|
-
}
|
|
176
|
-
: undefined,
|
|
177
|
-
baseDecimals: backendEvent.base_decimals || 0,
|
|
178
|
-
quoteDecimals: backendEvent.quote_decimals || 0,
|
|
179
|
-
timestamp: backendEvent.timestamp || new Date().toISOString(),
|
|
180
|
-
sequence: backendEvent.sequence_number || 0,
|
|
181
|
-
};
|
|
182
|
-
handler(transformedEvent);
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
console.debug(`No handler registered for orderbook subscription: ${subscriptionKey}`);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
catch (error) {
|
|
189
|
-
console.error("Error handling orderbook event:", error, event);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
/** Clean up resources when disconnecting */
|
|
193
|
-
cleanup() {
|
|
194
|
-
this.orderbookHandlers.clear();
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
//# sourceMappingURL=orderbook-ws-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orderbook-ws-client.js","sourceRoot":"","sources":["../../../../src/api/websocket/clients/orderbook-ws-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Orders WebSocket Client Implementation
|
|
3
|
-
*
|
|
4
|
-
* AUTHENTICATED WebSocket client for personal order-related events.
|
|
5
|
-
* Requires JWT authentication via access token.
|
|
6
|
-
* Shows user-specific order updates and events.
|
|
7
|
-
*/
|
|
8
|
-
import { type OrderEvent, type OrdersWebSocketClient, type RawOrderEventMessage, type TradingMode } from "@0xmonaco/types";
|
|
9
|
-
import { BaseWebSocketClientImpl } from "../index.js";
|
|
10
|
-
/**
|
|
11
|
-
* Orders-specific WebSocket client implementation
|
|
12
|
-
*/
|
|
13
|
-
export declare class OrdersWebSocketClientImpl extends BaseWebSocketClientImpl implements OrdersWebSocketClient {
|
|
14
|
-
private orderHandlers;
|
|
15
|
-
/**
|
|
16
|
-
* Override connect to enforce authentication requirement for Orders channel.
|
|
17
|
-
* Orders WebSocket requires JWT authentication for personal order updates.
|
|
18
|
-
*/
|
|
19
|
-
connect(): Promise<void>;
|
|
20
|
-
/**
|
|
21
|
-
* Subscribe to personal order events for a specific market and trading mode.
|
|
22
|
-
* Requires authentication - call setAccessToken() before connecting.
|
|
23
|
-
*
|
|
24
|
-
* @param market - Trading pair symbol (e.g., "BTC/USDC")
|
|
25
|
-
* @param tradingMode - Trading mode (TradingMode.SPOT or TradingMode.MARGIN)
|
|
26
|
-
* @param callback - Function to handle incoming order events
|
|
27
|
-
*
|
|
28
|
-
* @example
|
|
29
|
-
* ```typescript
|
|
30
|
-
* // Set authentication token first
|
|
31
|
-
* ordersWS.setAccessToken(authState.accessToken);
|
|
32
|
-
* await ordersWS.connect();
|
|
33
|
-
*
|
|
34
|
-
* ordersWS.subscribeToOrderEvents("BTC/USDC", TradingMode.SPOT, (event) => {
|
|
35
|
-
* console.log("Personal order event:", event.eventType);
|
|
36
|
-
* });
|
|
37
|
-
* ```
|
|
38
|
-
*/
|
|
39
|
-
subscribeToOrderEvents(market: string, tradingMode: TradingMode, callback: (event: OrderEvent) => void): void;
|
|
40
|
-
/**
|
|
41
|
-
* Unsubscribe from order events for a specific market and trading mode.
|
|
42
|
-
*
|
|
43
|
-
* @param market - Trading pair symbol (e.g., "BTC/USDC")
|
|
44
|
-
* @param tradingMode - Trading mode (TradingMode.SPOT or TradingMode.MARGIN)
|
|
45
|
-
*
|
|
46
|
-
* @example
|
|
47
|
-
* ```typescript
|
|
48
|
-
* ordersWS.unsubscribeFromOrderEvents("BTC/USDC", TradingMode.SPOT);
|
|
49
|
-
* ```
|
|
50
|
-
*/
|
|
51
|
-
unsubscribeFromOrderEvents(market: string, tradingMode: TradingMode): void;
|
|
52
|
-
/** Override message handling to process order-specific events */
|
|
53
|
-
protected handleMessage(message: RawOrderEventMessage): void;
|
|
54
|
-
/** Check if message is an order event from the backend */
|
|
55
|
-
private isOrderEvent;
|
|
56
|
-
/** Handle order-specific events from the backend */
|
|
57
|
-
private handleOrderEvent;
|
|
58
|
-
/** Clean up resources when disconnecting */
|
|
59
|
-
protected cleanup(): void;
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=orders-ws-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orders-ws-client.d.ts","sourceRoot":"","sources":["../../../../src/api/websocket/clients/orders-ws-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAyBtD;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,uBAAwB,YAAW,qBAAqB;IAErG,OAAO,CAAC,aAAa,CAAkD;IAEvE;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B;;;;;;;;;;;;;;;;;;OAkBG;IACH,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAa7G;;;;;;;;;;OAUG;IACH,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI;IAa1E,iEAAiE;IACjE,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAS5D,0DAA0D;IAC1D,OAAO,CAAC,YAAY;IAIpB,oDAAoD;IACpD,OAAO,CAAC,gBAAgB;IAiCxB,4CAA4C;IAC5C,SAAS,CAAC,OAAO,IAAI,IAAI;CAG1B"}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Orders WebSocket Client Implementation
|
|
3
|
-
*
|
|
4
|
-
* AUTHENTICATED WebSocket client for personal order-related events.
|
|
5
|
-
* Requires JWT authentication via access token.
|
|
6
|
-
* Shows user-specific order updates and events.
|
|
7
|
-
*/
|
|
8
|
-
import { WebSocketChannel, } from "@0xmonaco/types";
|
|
9
|
-
import { BaseWebSocketClientImpl } from "../index.js";
|
|
10
|
-
/**
|
|
11
|
-
* Convert snake_case keys to camelCase
|
|
12
|
-
*/
|
|
13
|
-
function toCamelCase(str) {
|
|
14
|
-
return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Convert an object's keys from snake_case to camelCase
|
|
18
|
-
*/
|
|
19
|
-
function keysToCamelCase(obj) {
|
|
20
|
-
if (obj === null || obj === undefined)
|
|
21
|
-
return obj;
|
|
22
|
-
if (typeof obj !== "object")
|
|
23
|
-
return obj;
|
|
24
|
-
if (Array.isArray(obj))
|
|
25
|
-
return obj.map((item) => keysToCamelCase(item));
|
|
26
|
-
const result = {};
|
|
27
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
28
|
-
const camelKey = toCamelCase(key);
|
|
29
|
-
result[camelKey] = typeof value === "object" && value !== null ? keysToCamelCase(value) : value;
|
|
30
|
-
}
|
|
31
|
-
return result;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Orders-specific WebSocket client implementation
|
|
35
|
-
*/
|
|
36
|
-
export class OrdersWebSocketClientImpl extends BaseWebSocketClientImpl {
|
|
37
|
-
constructor() {
|
|
38
|
-
super(...arguments);
|
|
39
|
-
// Map to store order event handlers by subscription key
|
|
40
|
-
this.orderHandlers = new Map();
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Override connect to enforce authentication requirement for Orders channel.
|
|
44
|
-
* Orders WebSocket requires JWT authentication for personal order updates.
|
|
45
|
-
*/
|
|
46
|
-
async connect() {
|
|
47
|
-
if (!this.config.accessToken?.trim()) {
|
|
48
|
-
throw new Error("Authentication required: Orders WebSocket requires a JWT access token. " +
|
|
49
|
-
"Call setAccessToken() before connecting or sdk.login() to authenticate.");
|
|
50
|
-
}
|
|
51
|
-
return super.connect();
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Subscribe to personal order events for a specific market and trading mode.
|
|
55
|
-
* Requires authentication - call setAccessToken() before connecting.
|
|
56
|
-
*
|
|
57
|
-
* @param market - Trading pair symbol (e.g., "BTC/USDC")
|
|
58
|
-
* @param tradingMode - Trading mode (TradingMode.SPOT or TradingMode.MARGIN)
|
|
59
|
-
* @param callback - Function to handle incoming order events
|
|
60
|
-
*
|
|
61
|
-
* @example
|
|
62
|
-
* ```typescript
|
|
63
|
-
* // Set authentication token first
|
|
64
|
-
* ordersWS.setAccessToken(authState.accessToken);
|
|
65
|
-
* await ordersWS.connect();
|
|
66
|
-
*
|
|
67
|
-
* ordersWS.subscribeToOrderEvents("BTC/USDC", TradingMode.SPOT, (event) => {
|
|
68
|
-
* console.log("Personal order event:", event.eventType);
|
|
69
|
-
* });
|
|
70
|
-
* ```
|
|
71
|
-
*/
|
|
72
|
-
subscribeToOrderEvents(market, tradingMode, callback) {
|
|
73
|
-
const channel = `orders:${market}:${tradingMode}`;
|
|
74
|
-
const subscriptionKey = `${market.toUpperCase()}-${tradingMode.toUpperCase()}`;
|
|
75
|
-
this.orderHandlers.set(subscriptionKey, callback);
|
|
76
|
-
// Send subscription message using backend's channel format
|
|
77
|
-
this.send({
|
|
78
|
-
type: "Subscribe",
|
|
79
|
-
channels: [channel],
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Unsubscribe from order events for a specific market and trading mode.
|
|
84
|
-
*
|
|
85
|
-
* @param market - Trading pair symbol (e.g., "BTC/USDC")
|
|
86
|
-
* @param tradingMode - Trading mode (TradingMode.SPOT or TradingMode.MARGIN)
|
|
87
|
-
*
|
|
88
|
-
* @example
|
|
89
|
-
* ```typescript
|
|
90
|
-
* ordersWS.unsubscribeFromOrderEvents("BTC/USDC", TradingMode.SPOT);
|
|
91
|
-
* ```
|
|
92
|
-
*/
|
|
93
|
-
unsubscribeFromOrderEvents(market, tradingMode) {
|
|
94
|
-
const channel = `orders:${market}:${tradingMode}`;
|
|
95
|
-
const subscriptionKey = `${market.toUpperCase()}-${tradingMode.toUpperCase()}`;
|
|
96
|
-
this.orderHandlers.delete(subscriptionKey);
|
|
97
|
-
// Send unsubscription message
|
|
98
|
-
this.send({
|
|
99
|
-
type: "Unsubscribe",
|
|
100
|
-
channels: [channel],
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
/** Override message handling to process order-specific events */
|
|
104
|
-
handleMessage(message) {
|
|
105
|
-
super.handleMessage(message);
|
|
106
|
-
// Handle order-specific Event messages
|
|
107
|
-
if (this.isOrderEvent(message)) {
|
|
108
|
-
this.handleOrderEvent(message);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
/** Check if message is an order event from the backend */
|
|
112
|
-
isOrderEvent(message) {
|
|
113
|
-
return this.isEventMessage(message, WebSocketChannel.Orders);
|
|
114
|
-
}
|
|
115
|
-
/** Handle order-specific events from the backend */
|
|
116
|
-
handleOrderEvent(event) {
|
|
117
|
-
try {
|
|
118
|
-
const snakeCaseEventData = event.data;
|
|
119
|
-
const snakeCaseOrderEventData = snakeCaseEventData?.data;
|
|
120
|
-
const tradingPair = snakeCaseOrderEventData?.trading_pair;
|
|
121
|
-
const tradingMode = snakeCaseOrderEventData?.trading_mode;
|
|
122
|
-
if (!tradingPair || !tradingMode) {
|
|
123
|
-
console.warn("Missing required order event data (trading_pair or trading_mode):", event);
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
const subscriptionKey = `${tradingPair.toUpperCase()}-${tradingMode.toUpperCase()}`;
|
|
127
|
-
const handler = this.orderHandlers.get(subscriptionKey);
|
|
128
|
-
if (handler) {
|
|
129
|
-
const camelCaseOrderEvent = {
|
|
130
|
-
orderId: snakeCaseEventData.order_id,
|
|
131
|
-
eventType: snakeCaseEventData.event_type,
|
|
132
|
-
timestamp: snakeCaseEventData.timestamp,
|
|
133
|
-
data: keysToCamelCase(snakeCaseOrderEventData),
|
|
134
|
-
};
|
|
135
|
-
handler(camelCaseOrderEvent);
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
console.warn(`No handler found for order event: ${subscriptionKey}`, event);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
catch (error) {
|
|
142
|
-
console.error("Error handling order event:", error, event);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
/** Clean up resources when disconnecting */
|
|
146
|
-
cleanup() {
|
|
147
|
-
this.orderHandlers.clear();
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
//# sourceMappingURL=orders-ws-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orders-ws-client.js","sourceRoot":"","sources":["../../../../src/api/websocket/clients/orders-ws-client.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Monaco SDK Error Types
|
|
3
|
-
*
|
|
4
|
-
* Standardized error classes for SDK operations.
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Monaco Core SDK error codes.
|
|
8
|
-
* Categorized by error type for better error handling and debugging.
|
|
9
|
-
*
|
|
10
|
-
* Initialization Errors:
|
|
11
|
-
* - INITIALIZATION_ERROR: General initialization failure
|
|
12
|
-
* - INVALID_CONFIG: Invalid SDK configuration
|
|
13
|
-
* - INVALID_STATE: Invalid SDK state
|
|
14
|
-
* - UNSUPPORTED_NETWORK: Network not supported by SDK
|
|
15
|
-
*
|
|
16
|
-
* API Errors:
|
|
17
|
-
* - API_ERROR: General API operation failure
|
|
18
|
-
* - CONTRACT_ERROR: Smart contract interaction failure
|
|
19
|
-
* - TRANSACTION_ERROR: Blockchain transaction failure
|
|
20
|
-
*
|
|
21
|
-
* Order Errors:
|
|
22
|
-
* - ORDER_ERROR: General order operation failure
|
|
23
|
-
* - INVALID_ORDER: Order validation failure
|
|
24
|
-
* - ORDER_NOT_FOUND: Order does not exist
|
|
25
|
-
* - INSUFFICIENT_BALANCE: Insufficient token balance
|
|
26
|
-
*
|
|
27
|
-
* Event Errors:
|
|
28
|
-
* - EVENT_ERROR: General event handling failure
|
|
29
|
-
* - SUBSCRIPTION_ERROR: Event subscription failure
|
|
30
|
-
*/
|
|
31
|
-
export declare const ERROR_CODES: {
|
|
32
|
-
/** Initialization errors */
|
|
33
|
-
readonly INITIALIZATION_ERROR: "INITIALIZATION_ERROR";
|
|
34
|
-
readonly INVALID_CONFIG: "INVALID_CONFIG";
|
|
35
|
-
readonly INVALID_STATE: "INVALID_STATE";
|
|
36
|
-
readonly UNSUPPORTED_NETWORK: "UNSUPPORTED_NETWORK";
|
|
37
|
-
/** API errors */
|
|
38
|
-
readonly API_ERROR: "API_ERROR";
|
|
39
|
-
readonly CONTRACT_ERROR: "CONTRACT_ERROR";
|
|
40
|
-
readonly TRANSACTION_ERROR: "TRANSACTION_ERROR";
|
|
41
|
-
/** Order errors */
|
|
42
|
-
readonly ORDER_ERROR: "ORDER_ERROR";
|
|
43
|
-
readonly INVALID_ORDER: "INVALID_ORDER";
|
|
44
|
-
readonly ORDER_NOT_FOUND: "ORDER_NOT_FOUND";
|
|
45
|
-
readonly INSUFFICIENT_BALANCE: "INSUFFICIENT_BALANCE";
|
|
46
|
-
/** Event errors */
|
|
47
|
-
readonly EVENT_ERROR: "EVENT_ERROR";
|
|
48
|
-
readonly SUBSCRIPTION_ERROR: "SUBSCRIPTION_ERROR";
|
|
49
|
-
};
|
|
50
|
-
/**
|
|
51
|
-
* Type representing all possible Monaco Core SDK error codes.
|
|
52
|
-
* Derived from the ERROR_CODES constant for type safety.
|
|
53
|
-
*/
|
|
54
|
-
export type MonacoErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];
|
|
55
|
-
export declare abstract class MonacoCoreError extends Error {
|
|
56
|
-
abstract code: MonacoErrorCode;
|
|
57
|
-
cause?: unknown;
|
|
58
|
-
protected constructor(message: string, options?: {
|
|
59
|
-
cause?: unknown;
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
export declare class InvalidConfigError extends MonacoCoreError {
|
|
63
|
-
code: "INVALID_CONFIG";
|
|
64
|
-
field?: string;
|
|
65
|
-
value?: unknown;
|
|
66
|
-
constructor(message: string, field?: string, value?: unknown, cause?: Error);
|
|
67
|
-
}
|
|
68
|
-
export declare class InvalidStateError extends MonacoCoreError {
|
|
69
|
-
code: "INVALID_STATE";
|
|
70
|
-
currentState?: string;
|
|
71
|
-
expectedState?: string;
|
|
72
|
-
constructor(message: string, currentState?: string, expectedState?: string, cause?: Error);
|
|
73
|
-
}
|
|
74
|
-
export declare class APIError extends MonacoCoreError {
|
|
75
|
-
code: "API_ERROR";
|
|
76
|
-
endpoint?: string;
|
|
77
|
-
statusCode?: number;
|
|
78
|
-
responseBody?: unknown;
|
|
79
|
-
constructor(message: string, endpoint?: string, statusCode?: number, responseBody?: unknown, cause?: Error);
|
|
80
|
-
}
|
|
81
|
-
export declare class ContractError extends MonacoCoreError {
|
|
82
|
-
code: "CONTRACT_ERROR";
|
|
83
|
-
revertReason?: string;
|
|
84
|
-
transactionHash?: string;
|
|
85
|
-
constructor(message: string, revertReason?: string, transactionHash?: string, cause?: Error);
|
|
86
|
-
}
|
|
87
|
-
export declare class TransactionError extends MonacoCoreError {
|
|
88
|
-
code: "TRANSACTION_ERROR";
|
|
89
|
-
transactionHash?: string;
|
|
90
|
-
gasUsed?: bigint;
|
|
91
|
-
constructor(message: string, transactionHash?: string, gasUsed?: bigint, cause?: Error);
|
|
92
|
-
}
|
|
93
|
-
export declare class OrderError extends MonacoCoreError {
|
|
94
|
-
code: "ORDER_ERROR";
|
|
95
|
-
orderId?: string;
|
|
96
|
-
market?: string;
|
|
97
|
-
constructor(message: string, options?: {
|
|
98
|
-
orderId?: string;
|
|
99
|
-
market?: string;
|
|
100
|
-
cause?: Error;
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,WAAW;IACtB,4BAA4B;;;;;IAM5B,iBAAiB;;;;IAKjB,mBAAmB;;;;;IAMnB,mBAAmB;;;CAGX,CAAC;AAEX;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC;AAE7E,8BAAsB,eAAgB,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,SAAS,aAAa,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAQrE;AAED,qBAAa,kBAAmB,SAAQ,eAAe;IACrD,IAAI,EAAE,gBAAgB,CAAoB;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEJ,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK;CAK5E;AAED,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,IAAI,EAAE,eAAe,CAAmB;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAK1F;AAED,qBAAa,QAAS,SAAQ,eAAe;IAC3C,IAAI,EAAE,WAAW,CAAe;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;gBAEX,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3G;AAED,qBAAa,aAAc,SAAQ,eAAe;IAChD,IAAI,EAAE,gBAAgB,CAAoB;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAK5F;AAED,qBAAa,gBAAiB,SAAQ,eAAe;IACnD,IAAI,EAAE,mBAAmB,CAAuB;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;gBAEL,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAKvF;AAED,qBAAa,UAAW,SAAQ,eAAe;IAC7C,IAAI,EAAE,aAAa,CAAiB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEJ,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CAK5F"}
|