@lynx-crypto/kraken-api 0.1.1

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/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Lynx Laboratory
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,343 @@
1
+ # @lynx-crypto/kraken-api
2
+
3
+ ![Build](https://github.com/lynx-laboratory/kraken-api/actions/workflows/ci.yml/badge.svg)
4
+ ![Coverage](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/lynx-laboratory/kraken-api/master/badges/coverage.json)
5
+ ![npm](https://img.shields.io/npm/v/@lynx-crypto/kraken-api)
6
+ ![minzipped size](https://img.shields.io/bundlephobia/minzip/@lynx-crypto/kraken-api)
7
+ ![downloads](https://img.shields.io/npm/dm/@lynx-crypto/kraken-api)
8
+ ![last commit](https://img.shields.io/github/last-commit/lynx-laboratory/kraken-api)
9
+ ![license](https://img.shields.io/npm/l/@lynx-crypto/kraken-api)
10
+
11
+ TypeScript client for **Kraken SPOT**:
12
+ - **REST API** (public + private endpoints)
13
+ - **WebSocket v2** (public market-data + authenticated user-data/trading)
14
+
15
+ See [Kraken Official Documentation](https://docs.kraken.com/api/docs/category/guides)
16
+
17
+ IMPORTANT
18
+
19
+ - This package is currently **SPOT only**. It does **not** implement Kraken Futures.
20
+ - Unofficial project. Not affiliated with Kraken.
21
+
22
+ ---
23
+
24
+ ## Install
25
+
26
+ NPM:
27
+ ```
28
+ npm i @lynx-crypto/kraken-api
29
+ ```
30
+
31
+ Yarn:
32
+ ```
33
+ yarn add @lynx-crypto/kraken-api
34
+ ```
35
+
36
+ pnpm:
37
+ ```
38
+ pnpm add @lynx-crypto/kraken-api
39
+ ```
40
+
41
+ Node support
42
+ - Node >= 18 recommended (uses built-in fetch / AbortController)
43
+
44
+ ---
45
+
46
+ ## Quick start
47
+
48
+ ESM:
49
+ ```
50
+ import { KrakenSpotRestClient, KrakenSpotWebsocketV2Client } from "@lynx-crypto/kraken-api";
51
+ ```
52
+
53
+ CJS:
54
+ ```
55
+ const { KrakenSpotRestClient, KrakenSpotWebsocketV2Client } = require("@lynx-crypto/kraken-api");
56
+ ```
57
+
58
+ ---
59
+
60
+ ## REST (Spot)
61
+
62
+ ### Create a REST client
63
+
64
+ ```ts
65
+ const kraken = new KrakenSpotRestClient({
66
+ // Optional:
67
+ // baseUrl: "https://api.kraken.com",
68
+ // timeoutMs: 10_000,
69
+ // userAgent: "my-app/1.0.0",
70
+
71
+ // Required for private endpoints:
72
+ apiKey: process.env.KRAKEN_API_KEY,
73
+ apiSecret: process.env.KRAKEN_API_SECRET,
74
+
75
+ // Optional logger:
76
+ // logger: console,
77
+ });
78
+ ```
79
+
80
+ ### Public endpoint example
81
+
82
+ (Your exact public endpoints depend on what you’ve implemented in src/spot/rest.)
83
+
84
+ Example shape:
85
+ ```ts
86
+ const serverTime = await kraken.public.getServerTime();
87
+ ```
88
+
89
+ ### Private endpoint example
90
+
91
+ (Your exact private endpoints depend on what you’ve implemented in src/spot/rest.)
92
+
93
+ Example shape:
94
+ const balances = await kraken.accountData.getAccountBalance();
95
+ console.log("USD:", balances["ZUSD"]);
96
+
97
+ ---
98
+
99
+ ## WebSocket v2 (Spot)
100
+
101
+ This package provides a top-level v2 WS client that creates:
102
+
103
+ - a **public connection** (market data + admin)
104
+ - a **private/auth connection** (user-data + user-trading)
105
+
106
+ ### Create a WS v2 client
107
+
108
+ ```ts
109
+ const ws = new KrakenSpotWebsocketV2Client({
110
+ // Optional override URLs:
111
+ // publicUrl: "wss://ws.kraken.com/v2",
112
+ // privateUrl: "wss://ws-auth.kraken.com/v2",
113
+
114
+ // IMPORTANT: private WS requires a session token
115
+ authToken: process.env.KRAKEN_WS_AUTH_TOKEN,
116
+
117
+ // Optional connection tuning:
118
+ // autoReconnect: true,
119
+ // reconnectDelayMs: 1_000,
120
+ // requestTimeoutMs: 10_000,
121
+
122
+ // Optional logger:
123
+ // logger: console,
124
+
125
+ // Optional WS implementation:
126
+ // - In Node, ws is used by default.
127
+ // - In browsers, pass the browser WebSocket if needed.
128
+ // WebSocketImpl: WebSocket,
129
+
130
+ });
131
+ ```
132
+ Available sub-APIs:
133
+ - `ws.admin` (public connection)
134
+ - `ws.marketData` (public connection)
135
+ - `ws.userData` (private connection)
136
+ - `ws.userTrading` (private connection)
137
+
138
+ ### Connect
139
+
140
+ You can connect explicitly:
141
+ ```ts
142
+ await ws.publicConnection.connect();
143
+ await ws.privateConnection.connect();
144
+ ```
145
+
146
+ Or let calls auto-connect (methods like `request()/sendRaw()` will connect if needed).
147
+
148
+ ---
149
+
150
+ ## WS routing: receiving streaming messages
151
+
152
+ The underlying `KrakenWebsocketBase` supports message fan-out:
153
+
154
+ ```ts
155
+ const unsubscribe = ws.publicConnection.addMessageHandler((msg) => {
156
+ // msg is already JSON-parsed when possible
157
+ // route based on msg.channel / msg.type, etc.
158
+ // console.log(msg);
159
+ });
160
+
161
+ // later:
162
+ unsubscribe();
163
+ ```
164
+
165
+ ---
166
+
167
+ ## WS v2: Admin
168
+
169
+ Admin utilities exist on the public connection (ex: ping/status/heartbeat).
170
+
171
+ Example:
172
+ ```ts
173
+ const pong = await ws.admin.ping({ reqId: 123 });
174
+ if (!pong.success) console.error("ping failed:", pong.error);
175
+ ```
176
+
177
+ ---
178
+
179
+ ## WS v2: Market Data (public)
180
+
181
+ Market data subscriptions live on ws.marketData (public connection).
182
+ (Exact channel helpers depend on your implemented market-data modules.)
183
+
184
+ Typical pattern:
185
+ 1. call subscribe helper (await ack)
186
+ 2. listen via `addMessageHandler` and route messages by channel/type
187
+
188
+ ---
189
+
190
+ ## WS v2: User Data (authenticated)
191
+
192
+ User-data streams live on `ws.userData` (private connection).
193
+
194
+ Implemented channels:
195
+
196
+ - executions (order lifecycle + fills)
197
+ - balances (balance snapshots + ledger-derived updates)
198
+
199
+ Example (executions):
200
+ ```
201
+ const ack = await ws.userData.subscribeExecutions({
202
+ snap_trades: true,
203
+ snap_orders: true,
204
+ order_status: true,
205
+ });
206
+
207
+ if (!ack.success) console.error("executions subscribe error:", ack.error);
208
+ ```
209
+
210
+ Then route messages:
211
+ ```
212
+ ws.privateConnection.addMessageHandler((msg: any) => {
213
+ if (msg?.channel === "executions" && (msg.type === "snapshot" || msg.type === "update")) {
214
+ for (const report of msg.data ?? []) {
215
+ console.log("[exec]", report.exec_type, report.order_id, report.order_status);
216
+ }
217
+ }
218
+ });
219
+ ```
220
+
221
+ Example (balances):
222
+ ```ts
223
+ const ack2 = await ws.userData.subscribeBalances({ snapshot: true });
224
+ if (!ack2.success) console.error("balances subscribe error:", ack2.error);
225
+
226
+ ws.privateConnection.addMessageHandler((msg: any) => {
227
+ if (msg?.channel === "balances" && msg.type === "snapshot") {
228
+ for (const asset of msg.data ?? []) {
229
+ console.log("[balances snapshot]", asset.asset, "total:", asset.balance);
230
+ }
231
+ }
232
+ if (msg?.channel === "balances" && msg.type === "update") {
233
+ for (const tx of msg.data ?? []) {
234
+ console.log("[balances update]", tx.asset, tx.type, "delta:", tx.amount, "new:", tx.balance);
235
+ }
236
+ }
237
+ });
238
+
239
+ ---
240
+
241
+ ## WS v2: User Trading (authenticated RPC)
242
+
243
+ User-trading methods live on `ws.userTrading` (private connection).
244
+
245
+ Implemented RPCs:
246
+
247
+ - `add_order`
248
+ - `amend_order`
249
+ - `edit_order` (legacy)
250
+ - `cancel_order`
251
+ - `cancel_all`
252
+ - `cancel_all_orders_after` (Dead Man’s Switch)
253
+ - `batch_add`
254
+ - `batch_cancel`
255
+
256
+ Add order:
257
+ ```ts
258
+ const res = await ws.userTrading.addOrder({
259
+ order_type: "limit",
260
+ side: "buy",
261
+ symbol: "BTC/USD",
262
+ order_qty: 0.01,
263
+ limit_price: 30000,
264
+ time_in_force: "gtc",
265
+ cl_ord_id: "demo-0001",
266
+ });
267
+
268
+
269
+ if (res.success) console.log("order_id:", res.result?.order_id);
270
+ else console.error("add_order error:", res.error);
271
+ ```
272
+
273
+ Dead Man’s Switch:
274
+ ```
275
+ // recommended: refresh every 15–30s with timeout=60
276
+ await ws.userTrading.cancelAllOrdersAfter({ timeout: 60 });
277
+ ```
278
+
279
+ ---
280
+
281
+ ## Options reference
282
+
283
+ ### `KrakenSpotRestClient` options
284
+
285
+ - `baseUrl?: string`
286
+ Default: https://api.kraken.com
287
+ - `timeoutMs?: number`
288
+ Default: 10_000
289
+ - `userAgent?: string`
290
+ - `apiKey?: string`
291
+ Required for private endpoints
292
+ - `apiSecret?: string` (base64)
293
+ Required for private endpoints
294
+ - `logger?: KrakenLogger`
295
+ debug/info/warn/error(msg, meta?)
296
+
297
+ ### KrakenSpotWebsocketV2Client options
298
+
299
+ - `publicUrl?: string`
300
+ Default: wss://ws.kraken.com/v2
301
+ - `privateUrl?: string`
302
+ Default: wss://ws-auth.kraken.com/v2
303
+ - `authToken?: string`
304
+ Required for authenticated/private connection features
305
+ - `WebSocketImpl?: constructor`
306
+ Optional override (browser / custom WS)
307
+ - `autoReconnect?: boolean`
308
+ Default: true
309
+ - `reconnectDelayMs?: number`
310
+ Default: 1000
311
+ - `requestTimeoutMs?: number`
312
+ Default: 10_000
313
+ - `logger?: KrakenWebsocketLogger`
314
+ debug/info/warn/error(msg, meta?)
315
+
316
+ ---
317
+
318
+ ## Development
319
+
320
+ Install:
321
+ `yarn`
322
+
323
+ Test:
324
+ `yarn test`
325
+
326
+ Coverage:
327
+ `yarn test:coverage`
328
+
329
+ Build:
330
+ `yarn build`
331
+
332
+ ---
333
+
334
+ ## Security notes
335
+
336
+ - Keep API keys/secrets out of source control.
337
+ - Use least-privilege API key permissions.
338
+
339
+ ---
340
+
341
+ ## License
342
+
343
+ MIT (see LICENSE)
package/dist/index.cjs ADDED
@@ -0,0 +1,3 @@
1
+ 'use strict';var crypto=require('crypto'),ws=require('ws');var m=class extends Error{name="KrakenApiError";endpoint;httpStatus;httpStatusText;krakenErrorCodes;rawBody;constructor(e,r={}){super(e),Object.setPrototypeOf(this,new.target.prototype),this.endpoint=r.endpoint,this.httpStatus=r.httpStatus,this.httpStatusText=r.httpStatusText,this.krakenErrorCodes=r.krakenErrorCodes,this.rawBody=r.rawBody;}};var y=class{baseUrl;timeoutMs;userAgent;apiKey;apiSecret;logger;lastNonce;lastMs=0;constructor(e={}){this.baseUrl=e.baseUrl??"https://api.kraken.com",this.timeoutMs=e.timeoutMs??1e4,this.userAgent=e.userAgent,this.apiKey=e.apiKey,this.apiSecret=e.apiSecret,this.logger=e.logger;}createNonce(){let e=Date.now();return this.lastNonce===void 0?(this.lastNonce=BigInt(e)*1000n,this.lastMs=e,this.lastNonce.toString()):(e>this.lastMs?(this.lastNonce=BigInt(e)*1000n,this.lastMs=e):this.lastNonce=this.lastNonce+1n,this.lastNonce.toString())}async publicGet(e,r){let n=new URL(e,this.baseUrl);if(r)for(let[a,o]of Object.entries(r))n.searchParams.set(a,String(o));this.logger?.debug?.("Kraken REST public GET request",{endpoint:e,url:n.toString(),query:r});let s=new AbortController,i=setTimeout(()=>s.abort(),this.timeoutMs);try{let a=await fetch(n,{method:"GET",signal:s.signal,headers:this.userAgent?{"User-Agent":this.userAgent}:void 0});if(!a.ok)throw this.logger?.error?.("Kraken REST HTTP error",{endpoint:e,status:a.status,statusText:a.statusText}),new m(`HTTP error from Kraken: ${a.status} ${a.statusText}`,{endpoint:e,httpStatus:a.status,httpStatusText:a.statusText});let o;try{o=await a.json();}catch(c){throw this.logger?.error?.("Kraken REST JSON parse error",{endpoint:e,error:c}),new m("Failed to parse Kraken response JSON",{endpoint:e,httpStatus:a.status})}if(o.error?.length)throw this.logger?.warn?.("Kraken REST API error",{endpoint:e,krakenErrors:o.error}),new m(`Kraken API error: ${o.error.join(", ")}`,{endpoint:e,httpStatus:a.status,krakenErrorCodes:o.error,rawBody:o});return this.logger?.debug?.("Kraken REST public GET success",{endpoint:e}),o.result}finally{clearTimeout(i);}}async privatePost(e,r){if(!this.apiKey||!this.apiSecret)throw new m("Missing apiKey or apiSecret for Kraken private API call",{endpoint:e});let n=new URL(e,this.baseUrl),s=this.createNonce(),i=new URLSearchParams;if(i.set("nonce",s),r)for(let[p,K]of Object.entries(r))K!==void 0&&i.set(p,String(K));let a=i.toString(),o=e,c=crypto.createHash("sha256").update(s+a).digest(),d=Buffer.from(this.apiSecret,"base64"),u=crypto.createHmac("sha512",d).update(o+c).digest("base64");this.logger?.debug?.("Kraken REST private POST request",{endpoint:e,url:n.toString(),hasParams:!!r});let b=new AbortController,k=setTimeout(()=>b.abort(),this.timeoutMs);try{let p=await fetch(n,{method:"POST",signal:b.signal,headers:{"Content-Type":"application/x-www-form-urlencoded","API-Key":this.apiKey,"API-Sign":u,...this.userAgent?{"User-Agent":this.userAgent}:{}},body:a});if(!p.ok)throw this.logger?.error?.("Kraken REST private HTTP error",{endpoint:e,status:p.status,statusText:p.statusText}),new m(`HTTP error from Kraken private API: ${p.status} ${p.statusText}`,{endpoint:e,httpStatus:p.status,httpStatusText:p.statusText});let K;try{K=await p.json();}catch(lr){throw this.logger?.error?.("Kraken REST private JSON parse error",{endpoint:e,error:lr}),new m("Failed to parse Kraken private API response JSON",{endpoint:e,httpStatus:p.status})}if(K.error?.length)throw this.logger?.warn?.("Kraken REST private API error",{endpoint:e,krakenErrors:K.error}),new m(`Kraken private API error: ${K.error.join(", ")}`,{endpoint:e,httpStatus:p.status,krakenErrorCodes:K.error,rawBody:K});return this.logger?.debug?.("Kraken REST private POST success",{endpoint:e}),K.result}finally{clearTimeout(k);}}async privatePostBinary(e,r){if(!this.apiKey||!this.apiSecret)throw new Error("KrakenRestBase: apiKey and apiSecret are required for private endpoints");let n=new URL(e,this.baseUrl),s=this.createNonce(),a=new URLSearchParams({nonce:s,...r??{}}).toString(),o=this.signPrivateRequest(e,s,a);this.logger?.debug?.("[KrakenRestBase] privatePostBinary request",{url:n.toString(),path:e,body:r});let c=await fetch(n.toString(),{method:"POST",headers:{"API-Key":this.apiKey,"API-Sign":o,"User-Agent":this.userAgent??"lynx-crypto-kraken-client/0.1.0","Content-Type":"application/x-www-form-urlencoded"},body:a});if(!c.ok){let u=await c.text().catch(()=>"");throw this.logger?.error?.("[KrakenRestBase] privatePostBinary HTTP error",{status:c.status,statusText:c.statusText,body:u}),new Error(`Kraken privatePostBinary failed: ${c.status} ${c.statusText} \u2013 ${u}`)}if((c.headers.get("content-type")??"").includes("application/json")){let u=await c.json().catch(()=>null);if(!u)throw new Error("Kraken privatePostBinary: expected JSON body for error response");let b=u.error??[];if(b.length>0){let k=`Kraken API error: ${b.join(", ")}`;this.logger?.error?.("[KrakenRestBase] Kraken API error (binary response)",{errors:b});let p=new Error(k);throw p.krakenErrors=b,p}throw new Error("Kraken privatePostBinary: expected binary data but got JSON without errors")}let l=await c.arrayBuffer();return this.logger?.debug?.("[KrakenRestBase] privatePostBinary success",{bytes:l.byteLength}),l}signPrivateRequest(e,r,n){if(!this.apiSecret)throw new Error("KrakenRestBase: apiSecret is required for private endpoints");let s=Buffer.from(this.apiSecret,"base64"),i=crypto.createHash("sha256").update(r+n).digest();return crypto.createHmac("sha512",s).update(e+i).digest("base64")}};function v(t){return t.publicGet("/0/public/Time")}function w(t){return t.publicGet("/0/public/SystemStatus")}function G(t,e){let r={};return e?.asset&&e.asset.length>0&&(r.asset=e.asset.join(",")),e?.aclass&&(r.aclass=e.aclass),t.publicGet("/0/public/Assets",r)}function M(t,e){let r={};return e?.pair?.length&&(r.pair=e.pair.join(",")),e?.aclass_base&&(r.aclass_base=e.aclass_base),e?.info&&(r.info=e.info),e?.country_code&&(r.country_code=e.country_code),t.publicGet("/0/public/AssetPairs",r)}function I(t,e){let r={};return e?.pair?.length&&(r.pair=e.pair.join(",")),e?.asset_class&&(r.asset_class=e.asset_class),t.publicGet("/0/public/Ticker",r)}async function C(t,e){let r={pair:e.pair};e.interval!==void 0&&(r.interval=String(e.interval)),e.since!==void 0&&(r.since=String(e.since)),e.asset_class&&(r.asset_class=e.asset_class);let n=await t.publicGet("/0/public/OHLC",r),{last:s,...i}=n,a={};for(let[o,c]of Object.entries(i))a[o]=c;return {last:s,ohlc:a}}function L(t,e){let r={pair:e.pair};return e.count!==void 0&&(r.count=String(e.count)),e.asset_class&&(r.asset_class=e.asset_class),t.publicGet("/0/public/Depth",r)}async function D(t,e){let r={pair:e.pair};e.since!==void 0&&(r.since=String(e.since)),e.count!==void 0&&(r.count=String(e.count)),e.asset_class&&(r.asset_class=e.asset_class);let n=await t.publicGet("/0/public/Trades",r),{last:s,...i}=n,a={};for(let[o,c]of Object.entries(i))a[o]=c;return {last:s,trades:a}}async function q(t,e){let r={pair:e.pair};e.since!==void 0&&(r.since=String(e.since)),e.asset_class&&(r.asset_class=e.asset_class);let n=await t.publicGet("/0/public/Spread",r),{last:s,...i}=n,a={};for(let[o,c]of Object.entries(i))a[o]=c;return {last:s,spreads:a}}var f=class{constructor(e){this.base=e;}getServerTime(){return v(this.base)}getSystemStatus(){return w(this.base)}getAssetInfo(e){return G(this.base,e)}getTradableAssetPairs(e){return M(this.base,e)}getTickerInformation(e){return I(this.base,e)}getOhlcData(e){return C(this.base,e)}getOrderBook(e){return L(this.base,e)}getRecentTrades(e){return D(this.base,e)}getRecentSpreads(e){return q(this.base,e)}};function U(t,e){let r={};return e?.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/Balance",r)}function F(t,e){let r={};return e?.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/BalanceEx",r)}function H(t,e){let r={};return e?.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/CreditLines",r)}function j(t,e){let r={};return e?.asset&&(r.asset=e.asset),e?.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/TradeBalance",r)}function Q(t,e){let r={};return e?.trades!==void 0&&(r.trades=e.trades?"true":"false"),e?.userref!==void 0&&(r.userref=String(e.userref)),e?.cl_ord_id&&(r.cl_ord_id=e.cl_ord_id),e?.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/OpenOrders",r)}function N(t,e){let r={};return e?.trades!==void 0&&(r.trades=e.trades?"true":"false"),e?.userref!==void 0&&(r.userref=String(e.userref)),e?.cl_ord_id&&(r.cl_ord_id=e.cl_ord_id),e?.start!==void 0&&(r.start=String(e.start)),e?.end!==void 0&&(r.end=String(e.end)),e?.ofs!==void 0&&(r.ofs=String(e.ofs)),e?.closetime&&(r.closetime=e.closetime),e?.consolidate_taker!==void 0&&(r.consolidate_taker=e.consolidate_taker?"true":"false"),e?.without_count!==void 0&&(r.without_count=e.without_count?"true":"false"),e?.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/ClosedOrders",r)}function V(t,e){let r={};return e.trades!==void 0&&(r.trades=e.trades?"true":"false"),e.userref!==void 0&&(r.userref=String(e.userref)),Array.isArray(e.txid)?r.txid=e.txid.join(","):r.txid=e.txid,e.consolidate_taker!==void 0&&(r.consolidate_taker=e.consolidate_taker?"true":"false"),e.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/QueryOrders",r)}function z(t,e){let r={order_id:e.order_id};return e.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/OrderAmends",r)}function $(t,e){let r={};return e?.type&&(r.type=e.type),e?.trades!==void 0&&(r.trades=e.trades?"true":"false"),e?.start!==void 0&&(r.start=String(e.start)),e?.end!==void 0&&(r.end=String(e.end)),e?.ofs!==void 0&&(r.ofs=String(e.ofs)),e?.consolidate_taker!==void 0&&(r.consolidate_taker=e.consolidate_taker?"true":"false"),e?.ledgers!==void 0&&(r.ledgers=e.ledgers?"true":"false"),e?.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/TradesHistory",r)}function J(t,e){let r={};return Array.isArray(e.txid)?r.txid=e.txid.join(","):r.txid=e.txid,e.trades!==void 0&&(r.trades=e.trades?"true":"false"),e.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/QueryTrades",r)}function Y(t,e){let r={};return e?.txid!==void 0&&(r.txid=Array.isArray(e.txid)?e.txid.join(","):e.txid),e?.docalcs!==void 0&&(r.docalcs=e.docalcs?"true":"false"),e?.consolidation&&(r.consolidation=e.consolidation),e?.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/OpenPositions",r)}function X(t,e){let r={};return e?.asset!==void 0&&(r.asset=Array.isArray(e.asset)?e.asset.join(","):e.asset),e?.aclass&&(r.aclass=e.aclass),e?.type&&(r.type=e.type),e?.start!==void 0&&(r.start=String(e.start)),e?.end!==void 0&&(r.end=String(e.end)),e?.ofs!==void 0&&(r.ofs=String(e.ofs)),e?.without_count!==void 0&&(r.without_count=e.without_count?"true":"false"),e?.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/Ledgers",r)}function Z(t,e){let r={};return Array.isArray(e.id)?r.id=e.id.join(","):r.id=e.id,e.trades!==void 0&&(r.trades=e.trades?"true":"false"),e.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/QueryLedgers",r)}function ee(t,e){let r={};return e?.pair!==void 0&&(r.pair=Array.isArray(e.pair)?e.pair.join(","):e.pair),e?.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/TradeVolume",r)}function re(t,e){let r={report:e.report,description:e.description};return e.format&&(r.format=e.format),e.fields&&(r.fields=e.fields),e.starttm!==void 0&&(r.starttm=String(e.starttm)),e.endtm!==void 0&&(r.endtm=String(e.endtm)),t.privatePost("/0/private/AddExport",r)}function te(t,e){let r={report:e.report};return t.privatePost("/0/private/ExportStatus",r)}function ne(t,e){let r={id:e.id};return t.privatePostBinary("/0/private/RetrieveExport",r)}function se(t,e){let r={id:e.id,type:e.type};return t.privatePost("/0/private/RemoveExport",r)}var h=class{constructor(e){this.base=e;}getAccountBalance(e){return U(this.base,e)}getExtendedBalance(e){return F(this.base,e)}getCreditLines(e){return H(this.base,e)}getTradeBalance(e){return j(this.base,e)}getOpenOrders(e){return Q(this.base,e)}getClosedOrders(e){return N(this.base,e)}queryOrdersInfo(e){return V(this.base,e)}getOrderAmends(e){return z(this.base,e)}getTradesHistory(e){return $(this.base,e)}queryTradesInfo(e){return J(this.base,e)}getOpenPositions(e){return Y(this.base,e)}getLedgersInfo(e){return X(this.base,e)}queryLedgers(e){return Z(this.base,e)}getTradeVolume(e){return ee(this.base,e)}requestExportReport(e){return re(this.base,e)}getExportReportStatus(e){return te(this.base,e)}retrieveExportReport(e){return ne(this.base,e)}deleteExportReport(e){return se(this.base,e)}};function ae(t,e){if(e.userref!==void 0&&e.cl_ord_id)throw new Error("KrakenAddOrderParams: userref and cl_ord_id are mutually exclusive");let r={ordertype:e.ordertype,type:e.type,volume:e.volume,pair:e.pair};return e.userref!==void 0&&(r.userref=String(e.userref)),e.cl_ord_id&&(r.cl_ord_id=e.cl_ord_id),e.displayvol&&(r.displayvol=e.displayvol),e.asset_class&&(r.asset_class=e.asset_class),e.price!==void 0&&(r.price=e.price),e.price2!==void 0&&(r.price2=e.price2),e.trigger&&(r.trigger=e.trigger),e.leverage!==void 0&&(r.leverage=e.leverage),e.reduce_only!==void 0&&(r.reduce_only=e.reduce_only?"true":"false"),e.stptype&&(r.stptype=e.stptype),e.oflags&&(r.oflags=e.oflags),e.timeinforce&&(r.timeinforce=e.timeinforce),e.starttm!==void 0&&(r.starttm=e.starttm),e.expiretm!==void 0&&(r.expiretm=e.expiretm),e.deadline!==void 0&&(r.deadline=e.deadline),e.validate!==void 0&&(r.validate=e.validate?"true":"false"),e.close&&(r["close[ordertype]"]=e.close.ordertype,e.close.price!==void 0&&(r["close[price]"]=e.close.price),e.close.price2!==void 0&&(r["close[price2]"]=e.close.price2)),t.privatePost("/0/private/AddOrder",r)}function oe(t,e){if(!e.txid&&!e.cl_ord_id)throw new Error("KrakenAmendOrderParams: either txid or cl_ord_id must be provided");let r={};return e.txid&&(r.txid=e.txid),e.cl_ord_id&&(r.cl_ord_id=e.cl_ord_id),e.order_qty!==void 0&&(r.order_qty=e.order_qty),e.display_qty!==void 0&&(r.display_qty=e.display_qty),e.limit_price!==void 0&&(r.limit_price=e.limit_price),e.trigger_price!==void 0&&(r.trigger_price=e.trigger_price),e.pair!==void 0&&(r.pair=e.pair),e.post_only!==void 0&&(r.post_only=e.post_only?"true":"false"),e.deadline!==void 0&&(r.deadline=e.deadline),t.privatePost("/0/private/AmendOrder",r)}function ie(t,e){let{txid:r,userref:n,cl_ord_id:s}=e,i=(r!==void 0?1:0)+(n!==void 0?1:0)+(s!==void 0?1:0);if(i===0)throw new Error("KrakenCancelOrderParams: one of txid, userref, or cl_ord_id must be provided");if(i>1)throw new Error("KrakenCancelOrderParams: txid, userref, and cl_ord_id are mutually exclusive; provide exactly one");let a={};return n!==void 0?a.txid=String(n):s!==void 0?a.cl_ord_id=Array.isArray(s)?s.join(","):s:r!==void 0&&(a.txid=Array.isArray(r)?r.join(","):r),t.privatePost("/0/private/CancelOrder",a)}function de(t){return t.privatePost("/0/private/CancelAll",{})}function ce(t,e){let r={timeout:String(e.timeout)};return t.privatePost("/0/private/CancelAllOrdersAfter",r)}function le(t){return t.privatePost("/0/private/GetWebSocketsToken",{})}function pe(t,e){let{orders:r,pair:n,asset_class:s,deadline:i,validate:a}=e;if(!Array.isArray(r)||r.length<2||r.length>15)throw new Error(`KrakenAddOrderBatchParams: orders must contain between 2 and 15 items (got ${r.length})`);for(let[d,l]of r.entries())if(l.userref!==void 0&&l.cl_ord_id!==void 0)throw new Error(`KrakenAddOrderBatchParams: order[${d}] cannot have both userref and cl_ord_id`);let o={pair:n};s&&(o.asset_class=s),i!==void 0&&(o.deadline=i),a!==void 0&&(o.validate=a?"true":"false");let c=r.map(d=>{let l={ordertype:d.ordertype,type:d.type,volume:d.volume};return d.userref!==void 0&&(l.userref=String(d.userref)),d.cl_ord_id!==void 0&&(l.cl_ord_id=d.cl_ord_id),d.displayvol!==void 0&&(l.displayvol=d.displayvol),d.price!==void 0&&(l.price=d.price),d.price2!==void 0&&(l.price2=d.price2),d.trigger!==void 0&&(l.trigger=d.trigger),d.leverage!==void 0&&(l.leverage=d.leverage),d.reduce_only!==void 0&&(l.reduce_only=d.reduce_only?"true":"false"),d.stptype!==void 0&&(l.stptype=d.stptype),d.oflags!==void 0&&(l.oflags=d.oflags),d.timeinforce!==void 0&&(l.timeinforce=d.timeinforce),d.starttm!==void 0&&(l.starttm=d.starttm),d.expiretm!==void 0&&(l.expiretm=d.expiretm),l});return o.orders=JSON.stringify(c),t.privatePost("/0/private/AddOrderBatch",o)}function ue(t,e){let{orders:r,clOrdIds:n}=e,s=r?.length??0,i=n?.length??0,a=s+i;if(a===0)throw new Error("KrakenCancelOrderBatchParams: at least one txid/userref or cl_ord_id is required");if(a>50)throw new Error(`KrakenCancelOrderBatchParams: maximum 50 total ids/references allowed, got ${a}`);let o={};if(r&&r.length>0){let c=r.map(d=>({txid:String(d.txid)}));o.orders=JSON.stringify(c);}if(n&&n.length>0){let c=n.map(d=>({cl_ord_id:d}));o.cl_ord_ids=JSON.stringify(c);}return t.privatePost("/0/private/CancelOrderBatch",o)}function ke(t,e){let r={txid:String(e.txid),pair:e.pair};return e.userref!==void 0&&(r.userref=String(e.userref)),e.volume!==void 0&&(r.volume=e.volume),e.displayvol!==void 0&&(r.displayvol=e.displayvol),e.asset_class!==void 0&&(r.asset_class=e.asset_class),e.price!==void 0&&(r.price=e.price),e.price2!==void 0&&(r.price2=e.price2),e.oflags!==void 0&&(r.oflags=e.oflags),e.deadline!==void 0&&(r.deadline=e.deadline),e.cancel_response!==void 0&&(r.cancel_response=e.cancel_response?"true":"false"),e.validate!==void 0&&(r.validate=e.validate?"true":"false"),t.privatePost("/0/private/EditOrder",r)}var x=class{constructor(e){this.base=e;}addOrder(e){return ae(this.base,e)}amendOrder(e){return oe(this.base,e)}cancelOrder(e){return ie(this.base,e)}cancelAllOrders(){return de(this.base)}cancelAllOrdersAfter(e){return ce(this.base,e)}getWebSocketsToken(){return le(this.base)}addOrderBatch(e){return pe(this.base,e)}cancelOrderBatch(e){return ue(this.base,e)}editOrder(e){return ke(this.base,e)}};function Ke(t,e){let r={asset:e.asset};return e.aclass!==void 0&&(r.aclass=e.aclass),e.rebase_multiplier!==void 0&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/DepositMethods",r)}function me(t,e){let r={asset:e.asset,method:e.method};return e.aclass!==void 0&&(r.aclass=e.aclass),e.new!==void 0&&(r.new=e.new?"true":"false"),e.amount!==void 0&&(r.amount=String(e.amount)),t.privatePost("/0/private/DepositAddresses",r)}function be(t,e={}){let r={};return e.asset&&(r.asset=e.asset),e.aclass&&(r.aclass=e.aclass),e.method&&(r.method=e.method),e.start!==void 0&&(r.start=String(e.start)),e.end!==void 0&&(r.end=String(e.end)),e.cursor&&(r.cursor=e.cursor),e.limit!==void 0&&(r.limit=String(e.limit)),e.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/DepositStatus",r)}function ge(t,e){let r={asset:e.asset};return e.aclass&&(r.aclass=e.aclass),e.network&&(r.network=e.network),e.rebase_multiplier&&(r.rebase_multiplier=e.rebase_multiplier),t.privatePost("/0/private/WithdrawMethods",r)}function ye(t,e){let r={asset:e.asset};return e.aclass&&(r.aclass=e.aclass),e.method&&(r.method=e.method),e.key&&(r.key=e.key),e.verified!==void 0&&(r.verified=e.verified?"true":"false"),t.privatePost("/0/private/WithdrawAddresses",r)}function fe(t,e){let r={asset:e.asset,key:e.key,amount:String(e.amount)};return t.privatePost("/0/private/WithdrawInfo",r)}function he(t,e){let{asset:r,aclass:n,key:s,address:i,amount:a,max_fee:o,rebase_multiplier:c}=e,d={asset:r,key:s,amount:String(a)};return n&&(d.aclass=n),i&&(d.address=i),o!==void 0&&(d.max_fee=String(o)),c&&(d.rebase_multiplier=c),t.privatePost("/0/private/Withdraw",d)}async function xe(t,e={}){let{asset:r,aclass:n,method:s,start:i,end:a,cursor:o,limit:c,rebase_multiplier:d}=e,l={};return r&&(l.asset=r),n&&(l.aclass=n),s&&(l.method=s),i!==void 0&&(l.start=i),a!==void 0&&(l.end=a),o!==void 0&&(l.cursor=o),c!==void 0&&(l.limit=c),d&&(l.rebase_multiplier=d),t.privatePost("/0/private/WithdrawStatus",l)}function We(t,e){let{asset:r,refid:n}=e,s={asset:r,refid:n};return t.privatePost("/0/private/WithdrawCancel",s)}function Oe(t,e){let{asset:r,from:n,to:s,amount:i}=e,a={asset:r,from:n,to:s,amount:String(i)};return t.privatePost("/0/private/WalletTransfer",a)}var W=class{constructor(e){this.base=e;}getDepositMethods(e){return Ke(this.base,e)}getDepositAddresses(e){return me(this.base,e)}getDepositStatus(e={}){return be(this.base,e)}getWithdrawMethods(e){return ge(this.base,e)}getWithdrawAddresses(e){return ye(this.base,e)}getWithdrawInfo(e){return fe(this.base,e)}withdrawFunds(e){return he(this.base,e)}getWithdrawStatus(e={}){return xe(this.base,e)}withdrawCancel(e){return We(this.base,e)}walletTransfer(e){return Oe(this.base,e)}};async function Re(t,e){let{username:r,email:n}=e,s={username:r,email:n};return t.privatePost("/0/private/CreateSubaccount",s)}async function Ae(t,e){let{asset:r,asset_class:n,amount:s,from:i,to:a}=e,o={asset:r,amount:String(s),from:i,to:a};return n&&(o.asset_class=n),t.privatePost("/0/private/AccountTransfer",o)}var O=class{constructor(e){this.base=e;}createSubaccount(e){return Re(this.base,e)}accountTransfer(e){return Ae(this.base,e)}};async function Te(t,e){let{amount:r,strategy_id:n}=e,s={amount:String(r),strategy_id:n};return t.privatePost("/0/private/Earn/Allocate",s)}async function Pe(t,e){let{amount:r,strategy_id:n}=e,s={amount:String(r),strategy_id:n};return t.privatePost("/0/private/Earn/Deallocate",s)}async function Se(t,e){let{strategy_id:r}=e,n={strategy_id:r};return t.privatePost("/0/private/Earn/AllocateStatus",n)}async function Be(t,e){let{strategy_id:r}=e,n={strategy_id:r};return t.privatePost("/0/private/Earn/DeallocateStatus",n)}async function _e(t,e={}){let{ascending:r,asset:n,cursor:s,limit:i,lock_type:a}=e,o={};return r!=null&&(o.ascending=r),n!=null&&(o.asset=n),s!=null&&(o.cursor=s),i!=null&&(o.limit=i),a&&a.length>0&&(o.lock_type=JSON.stringify(a)),t.privatePost("/0/private/Earn/Strategies",o)}async function Ee(t,e={}){let{ascending:r,converted_asset:n,hide_zero_allocations:s}=e,i={};return r!=null&&(i.ascending=r),n!=null&&(i.converted_asset=n),s!=null&&(i.hide_zero_allocations=s),t.privatePost("/0/private/Earn/Allocations",i)}var R=class{constructor(e){this.base=e;}allocateFunds(e){return Te(this.base,e)}deallocateFunds(e){return Pe(this.base,e)}getAllocationStatus(e){return Se(this.base,e)}getDeallocationStatus(e){return Be(this.base,e)}listStrategies(e={}){return _e(this.base,e)}listAllocations(e={}){return Ee(this.base,e)}};async function ve(t,e){let{symbol:r}=e,s={symbol:typeof r=="string"?r:r.join(",")};return t.publicGet("/0/public/PreTrade",s)}async function we(t,e={}){let{symbol:r,from_ts:n,to_ts:s,count:i}=e,a={};return r&&(a.symbol=r),n&&(a.from_ts=n),s&&(a.to_ts=s),i!==void 0&&(a.count=i),t.publicGet("/0/public/PostTrade",a)}var A=class{constructor(e){this.base=e;}getPreTradeData(e){return ve(this.base,e)}getPostTradeData(e={}){return we(this.base,e)}};var Ge=class extends y{marketData;accountData;trading;funding;subaccounts;earn;transparency;constructor(e={}){super(e),this.marketData=new f(this),this.accountData=new h(this),this.trading=new x(this),this.funding=new W(this),this.subaccounts=new O(this),this.earn=new R(this),this.transparency=new A(this);}};var g=class{url;authToken;WebSocketImpl;logger;autoReconnect;reconnectDelayMs;requestTimeoutMs;ws=null;connectingPromise=null;manuallyClosed=false;nextReqId=1;pending=new Map;messageHandlers=new Set;constructor(e){if(this.url=e.url,this.authToken=e.authToken,this.WebSocketImpl=e.WebSocketImpl??(typeof ws.WebSocket<"u"?ws.WebSocket:void 0),this.logger=e.logger,this.autoReconnect=e.autoReconnect??true,this.reconnectDelayMs=e.reconnectDelayMs??1e3,this.requestTimeoutMs=e.requestTimeoutMs??1e4,!this.WebSocketImpl)throw new Error("No WebSocket implementation available. Pass `WebSocketImpl` in KrakenWebsocketConnectionOptions when using Node.js.")}get readyState(){return this.ws?.readyState??-1}async connect(){if(!(this.ws&&this.ws.readyState===1))return this.connectingPromise?this.connectingPromise:(this.manuallyClosed=false,this.connectingPromise=new Promise((e,r)=>{try{let n=this.WebSocketImpl,s=new n(this.url);this.ws=s,s.onopen=()=>{this.logger?.info?.("Kraken WS connected",{url:this.url}),this.connectingPromise=null,e();},s.onclose=i=>{this.logger?.info?.("Kraken WS closed",{url:this.url,event:i,manuallyClosed:this.manuallyClosed}),this.ws=null,this.connectingPromise=null;for(let[a,o]of this.pending)clearTimeout(o.timeoutId),o.reject(new Error(`WebSocket closed before response for req_id ${a}`));this.pending.clear(),!this.manuallyClosed&&this.autoReconnect&&setTimeout(()=>{this.logger?.info?.("Kraken WS reconnecting",{url:this.url}),this.connect().catch(a=>{this.logger?.error?.("Kraken WS reconnect failed",{url:this.url,error:a});});},this.reconnectDelayMs);},s.onerror=i=>{this.logger?.error?.("Kraken WS error",{url:this.url,event:i});},s.onmessage=i=>{let a=i.data;if(typeof i.data=="string")try{a=JSON.parse(i.data);}catch(o){this.logger?.warn?.("Failed to parse WS JSON message",{data:i.data,error:o});}if(a&&typeof a=="object"&&"req_id"in a&&typeof a.req_id=="number"){let o=a.req_id,c=this.pending.get(o);c&&(this.pending.delete(o),clearTimeout(c.timeoutId),c.resolve(a));}for(let o of this.messageHandlers)try{o(a);}catch(c){this.logger?.error?.("WS message handler threw",{error:c});}};}catch(n){this.connectingPromise=null,r(n);}}),this.connectingPromise)}close(e,r){this.manuallyClosed=true,this.ws&&this.ws.readyState===1&&this.ws.close(e,r);}addMessageHandler(e){return this.messageHandlers.add(e),()=>this.messageHandlers.delete(e)}async sendRaw(e){(!this.ws||this.ws.readyState!==1)&&await this.connect();let r=this.ws;if(!r||r.readyState!==1)throw new Error("WebSocket is not open");let n=typeof e=="string"?e:JSON.stringify(e);r.send(n);}async request(e,r,n){(!this.ws||this.ws.readyState!==1)&&await this.connect();let s=n?.reqId??this.nextReqId++,i=n?.timeoutMs??this.requestTimeoutMs,a=n?.attachAuthToken??true,o=r?{...r}:{};a&&this.authToken&&(o.token===void 0||o.token===null)&&(o.token=this.authToken);let c={method:e,params:Object.keys(o).length?o:void 0,req_id:s};return this.logger?.debug?.("Kraken WS request",{envelope:c}),await new Promise((d,l)=>{let u=setTimeout(()=>{this.pending.delete(s),l(new Error(`Kraken WS request timed out after ${i}ms (method=${e}, req_id=${s})`));},i),b={resolve:k=>d(k),reject:l,timeoutId:u};this.pending.set(s,b);try{let k=this.ws;if(!k||k.readyState!==1){clearTimeout(u),this.pending.delete(s),l(new Error(`WebSocket is not open (method=${e}, req_id=${s})`));return}k.send(JSON.stringify(c));}catch(k){clearTimeout(u),this.pending.delete(s),l(k);}})}};function Ie(t,e){return t.addMessageHandler(r=>{if(!r||typeof r!="object")return;let n=r;n.channel==="status"&&n.type==="update"&&Array.isArray(n.data)&&e(n);})}async function Ce(t,e={},r={}){return t.request("ping",e,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken})}function Le(t,e){return t.addMessageHandler(r=>{if(!r||typeof r!="object")return;let n=r;n.channel==="heartbeat"&&e(n);})}var T=class{constructor(e){this.ws=e;}ping(e={},r={}){return Ce(this.ws,e,r)}onStatus(e){return Ie(this.ws,e)}onHeartbeat(e){return Le(this.ws,e)}};async function De(t,e,r={}){let n={channel:"ticker",...e};return t.request("subscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??false})}async function qe(t,e,r={}){let n={channel:"ticker",...e};return t.request("unsubscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??false})}async function Ue(t,e,r={}){let n={channel:"book",...e};return t.request("subscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??false})}async function Fe(t,e,r={}){let n={channel:"book",...e};return t.request("unsubscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??false})}async function He(t,e,r={}){let n={channel:"level3",...e};return t.request("subscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??true})}async function je(t,e,r={}){let n={channel:"level3",...e};return t.request("unsubscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??true})}async function Qe(t,e,r={}){let n={channel:"ohlc",...e};return t.request("subscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??false})}async function Ne(t,e,r={}){let n={channel:"ohlc",...e};return t.request("unsubscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??false})}async function Ve(t,e,r={}){let n={channel:"trade",...e};return t.request("subscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??false})}async function ze(t,e,r={}){let n={channel:"trade",...e};return t.request("unsubscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??false})}async function $e(t,e={},r={}){let n={channel:"instrument",...e};return t.request("subscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??false})}async function Je(t,e={},r={}){let n={channel:"instrument",...e};return t.request("unsubscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??false})}var P=class{constructor(e){this.ws=e;}subscribeTicker(e,r={}){return De(this.ws,e,r)}unsubscribeTicker(e,r={}){return qe(this.ws,e,r)}subscribeBook(e,r={}){return Ue(this.ws,e,r)}unsubscribeBook(e,r={}){return Fe(this.ws,e,r)}subscribeLevel3(e,r={}){return He(this.ws,e,r)}unsubscribeLevel3(e,r={}){return je(this.ws,e,r)}subscribeOhlc(e,r={}){return Qe(this.ws,e,r)}unsubscribeOhlc(e,r={}){return Ne(this.ws,e,r)}subscribeTrade(e,r={}){return Ve(this.ws,e,r)}unsubscribeTrade(e,r={}){return ze(this.ws,e,r)}subscribeInstrument(e={},r={}){return $e(this.ws,e,r)}unsubscribeInstrument(e={},r={}){return Je(this.ws,e,r)}};async function Ye(t,e,r={}){let n={channel:"executions",...e};return t.request("subscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??true})}async function Xe(t,e={},r={}){let n={channel:"executions",...e};return t.request("unsubscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??true})}async function Ze(t,e={},r={}){let n={channel:"balances",...e};return t.request("subscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??true})}async function er(t,e={},r={}){let n={channel:"balances",...e};return t.request("unsubscribe",n,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken??true})}var S=class{constructor(e){this.ws=e;}subscribeExecutions(e,r){return Ye(this.ws,e,r)}unsubscribeExecutions(e,r){return Xe(this.ws,e??{},r)}subscribeBalances(e={},r){return Ze(this.ws,e,r)}unsubscribeBalances(e,r){return er(this.ws,e??{},r)}};async function rr(t,e,r={}){return t.request("add_order",e,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken})}async function tr(t,e,r={}){let n=!!e.order_id,s=!!e.cl_ord_id;if(n&&s||!n&&!s)throw new Error("Kraken WS amend_order: exactly one of `order_id` or `cl_ord_id` must be provided");return t.request("amend_order",e,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken})}async function nr(t,e,r={}){return t.request("edit_order",e,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken})}async function sr(t,e,r={}){let n=Array.isArray(e.order_id)&&e.order_id.length>0,s=Array.isArray(e.cl_ord_id)&&e.cl_ord_id.length>0,i=Array.isArray(e.order_userref)&&e.order_userref.length>0;if(!n&&!s&&!i)throw new Error("Kraken WS cancel_order: at least one of `order_id`, `cl_ord_id`, or `order_userref` must contain at least one entry");return t.request("cancel_order",e,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken})}async function ar(t,e={},r={}){return t.request("cancel_all",e,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken})}async function or(t,e,r={}){if(!Number.isFinite(e.timeout))throw new Error("Kraken WS cancel_all_orders_after: `timeout` must be a finite number (seconds)");if(e.timeout<0||e.timeout>=86400)throw new Error("Kraken WS cancel_all_orders_after: `timeout` must be >= 0 and < 86400 seconds");return t.request("cancel_all_orders_after",e,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken})}async function ir(t,e,r={}){if(!Array.isArray(e.orders)||e.orders.length<2)throw new Error("Kraken WS batch_add: `orders` must contain at least 2 entries");if(e.orders.length>15)throw new Error("Kraken WS batch_add: `orders` must not contain more than 15 entries");for(let[n,s]of e.orders.entries())if(s.cl_ord_id&&typeof s.order_userref=="number")throw new Error(`Kraken WS batch_add: order at index ${n} must not specify both cl_ord_id and order_userref`);return t.request("batch_add",e,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken})}async function dr(t,e,r={}){if(!Array.isArray(e.orders)||e.orders.length<2)throw new Error("Kraken WS batch_cancel: `orders` must contain at least 2 identifiers");if(e.orders.length>50)throw new Error("Kraken WS batch_cancel: `orders` must not contain more than 50 identifiers");return t.request("batch_cancel",e,{reqId:r.reqId,timeoutMs:r.timeoutMs,attachAuthToken:r.attachAuthToken})}var B=class{constructor(e){this.ws=e;}addOrder(e,r){return rr(this.ws,e,r)}amendOrder(e,r){return tr(this.ws,e,r)}editOrder(e,r){return nr(this.ws,e,r)}cancelOrder(e,r){return sr(this.ws,e,r)}cancelAll(e,r){return ar(this.ws,e??{},r)}cancelAllOrdersAfter(e,r){return or(this.ws,e,r)}batchAdd(e,r){return ir(this.ws,e,r)}batchCancel(e,r){return dr(this.ws,e,r)}};var cr=class{publicConnection;privateConnection;admin;marketData;userData;userTrading;constructor(e={}){let{publicUrl:r="wss://ws.kraken.com/v2",privateUrl:n="wss://ws-auth.kraken.com/v2",authToken:s,WebSocketImpl:i,autoReconnect:a,reconnectDelayMs:o,requestTimeoutMs:c,logger:d}=e,l={authToken:void 0,WebSocketImpl:i,autoReconnect:a,reconnectDelayMs:o,requestTimeoutMs:c,logger:d};this.publicConnection=new g({...l,url:r}),this.privateConnection=new g({...l,url:n,authToken:s}),this.admin=new T(this.publicConnection),this.marketData=new P(this.publicConnection),this.userData=new S(this.privateConnection),this.userTrading=new B(this.privateConnection);}};
2
+ exports.KrakenSpotRestClient=Ge;exports.KrakenSpotWebsocketV2Client=cr;//# sourceMappingURL=index.cjs.map
3
+ //# sourceMappingURL=index.cjs.map