@nuno1026/bithumb-cli 0.1.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/dist/account-QQC3UZDP.js +110 -0
- package/dist/account-QQC3UZDP.js.map +1 -0
- package/dist/chunk-6NIRYFQU.js +3482 -0
- package/dist/chunk-6NIRYFQU.js.map +1 -0
- package/dist/chunk-FYO6WLZI.js +72 -0
- package/dist/chunk-FYO6WLZI.js.map +1 -0
- package/dist/chunk-XOKGESZ3.js +139 -0
- package/dist/chunk-XOKGESZ3.js.map +1 -0
- package/dist/config-5T2Z7X5D.js +172 -0
- package/dist/config-5T2Z7X5D.js.map +1 -0
- package/dist/deposit-PBP2KDXP.js +169 -0
- package/dist/deposit-PBP2KDXP.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +455 -0
- package/dist/index.js.map +1 -0
- package/dist/market-B32IKWHH.js +304 -0
- package/dist/market-B32IKWHH.js.map +1 -0
- package/dist/trade-ZZU6PXJL.js +233 -0
- package/dist/trade-ZZU6PXJL.js.map +1 -0
- package/dist/twap-U3LDHACU.js +78 -0
- package/dist/twap-U3LDHACU.js.map +1 -0
- package/dist/withdraw-7C657PEC.js +161 -0
- package/dist/withdraw-7C657PEC.js.map +1 -0
- package/package.json +25 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
toNumber
|
|
4
|
+
} from "./chunk-XOKGESZ3.js";
|
|
5
|
+
import {
|
|
6
|
+
errorLine,
|
|
7
|
+
outputLine,
|
|
8
|
+
printJson,
|
|
9
|
+
printTable
|
|
10
|
+
} from "./chunk-FYO6WLZI.js";
|
|
11
|
+
|
|
12
|
+
// src/commands/market.ts
|
|
13
|
+
async function handleMarketCommand(run, action, rest, v, json) {
|
|
14
|
+
switch (action) {
|
|
15
|
+
case "markets":
|
|
16
|
+
return cmdMarkets(run, { isDetails: v.isDetails, json });
|
|
17
|
+
case "ticker":
|
|
18
|
+
return cmdTicker(run, rest[0] ?? v.market, json);
|
|
19
|
+
case "orderbook":
|
|
20
|
+
return cmdOrderbook(run, rest[0] ?? v.market, json);
|
|
21
|
+
case "trades":
|
|
22
|
+
return cmdTrades(run, rest[0] ?? v.market, {
|
|
23
|
+
count: toNumber(v.count),
|
|
24
|
+
to: v.to,
|
|
25
|
+
cursor: v.cursor,
|
|
26
|
+
daysAgo: toNumber(v.daysAgo),
|
|
27
|
+
json
|
|
28
|
+
});
|
|
29
|
+
case "candles-minutes":
|
|
30
|
+
return cmdCandlesMinutes(run, rest[0] ?? v.market, {
|
|
31
|
+
unit: toNumber(v.unit) ?? 1,
|
|
32
|
+
count: toNumber(v.count),
|
|
33
|
+
to: v.to,
|
|
34
|
+
json
|
|
35
|
+
});
|
|
36
|
+
case "candles-days":
|
|
37
|
+
return cmdCandlesDays(run, rest[0] ?? v.market, {
|
|
38
|
+
count: toNumber(v.count),
|
|
39
|
+
to: v.to,
|
|
40
|
+
convertingPriceUnit: v.convertingPriceUnit,
|
|
41
|
+
json
|
|
42
|
+
});
|
|
43
|
+
case "candles-weeks":
|
|
44
|
+
return cmdCandlesWeeks(run, rest[0] ?? v.market, {
|
|
45
|
+
count: toNumber(v.count),
|
|
46
|
+
to: v.to,
|
|
47
|
+
json
|
|
48
|
+
});
|
|
49
|
+
case "candles-months":
|
|
50
|
+
return cmdCandlesMonths(run, rest[0] ?? v.market, {
|
|
51
|
+
count: toNumber(v.count),
|
|
52
|
+
to: v.to,
|
|
53
|
+
json
|
|
54
|
+
});
|
|
55
|
+
case "warnings":
|
|
56
|
+
return cmdWarnings(run, json);
|
|
57
|
+
case "notices":
|
|
58
|
+
return cmdNotices(run, { count: toNumber(v.count), json });
|
|
59
|
+
case "fee-inout":
|
|
60
|
+
return cmdFeeInout(run, rest[0] ?? v.currency, json);
|
|
61
|
+
default:
|
|
62
|
+
errorLine(`Unknown market command: ${action}. Run 'bithumb-trade market --help' for usage.`);
|
|
63
|
+
process.exitCode = 1;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function cmdMarkets(run, opts) {
|
|
67
|
+
const result = await run("market_get_markets", {
|
|
68
|
+
...opts.isDetails !== void 0 && { isDetails: opts.isDetails }
|
|
69
|
+
});
|
|
70
|
+
const items = result.data;
|
|
71
|
+
if (opts.json) return printJson(items);
|
|
72
|
+
if (!items?.length) {
|
|
73
|
+
outputLine("No markets found");
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
printTable(items.map((m) => ({
|
|
77
|
+
market: m["market"],
|
|
78
|
+
korean_name: m["korean_name"],
|
|
79
|
+
english_name: m["english_name"],
|
|
80
|
+
...opts.isDetails ? { market_warning: m["market_warning"] ?? "" } : {}
|
|
81
|
+
})));
|
|
82
|
+
}
|
|
83
|
+
async function cmdTicker(run, markets, json) {
|
|
84
|
+
if (!markets) {
|
|
85
|
+
errorLine("Error: market argument required. Example: bithumb-trade market ticker KRW-BTC");
|
|
86
|
+
process.exitCode = 1;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const result = await run("market_get_ticker", { markets });
|
|
90
|
+
const items = result.data;
|
|
91
|
+
if (json) return printJson(items);
|
|
92
|
+
if (!items?.length) {
|
|
93
|
+
outputLine("No ticker data");
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
printTable(items.map((t) => ({
|
|
97
|
+
market: t["market"],
|
|
98
|
+
trade_price: t["trade_price"],
|
|
99
|
+
signed_change_rate: t["signed_change_rate"],
|
|
100
|
+
acc_trade_volume_24h: t["acc_trade_volume_24h"],
|
|
101
|
+
high_price: t["high_price"],
|
|
102
|
+
low_price: t["low_price"]
|
|
103
|
+
})));
|
|
104
|
+
}
|
|
105
|
+
async function cmdOrderbook(run, markets, json) {
|
|
106
|
+
if (!markets) {
|
|
107
|
+
errorLine("Error: market argument required. Example: bithumb-trade market orderbook KRW-BTC");
|
|
108
|
+
process.exitCode = 1;
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const result = await run("market_get_orderbook", { markets });
|
|
112
|
+
const items = result.data;
|
|
113
|
+
if (json) return printJson(items);
|
|
114
|
+
if (!items?.length) {
|
|
115
|
+
outputLine("No orderbook data");
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
for (const book of items) {
|
|
119
|
+
outputLine(`
|
|
120
|
+
--- ${book["market"]} ---`);
|
|
121
|
+
outputLine(`Total Ask Size: ${book["total_ask_size"]}`);
|
|
122
|
+
outputLine(`Total Bid Size: ${book["total_bid_size"]}`);
|
|
123
|
+
const units = book["orderbook_units"];
|
|
124
|
+
if (units?.length) {
|
|
125
|
+
printTable(units.slice(0, 10).map((u) => ({
|
|
126
|
+
ask_price: u["ask_price"],
|
|
127
|
+
ask_size: u["ask_size"],
|
|
128
|
+
bid_price: u["bid_price"],
|
|
129
|
+
bid_size: u["bid_size"]
|
|
130
|
+
})));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async function cmdTrades(run, market, opts) {
|
|
135
|
+
if (!market) {
|
|
136
|
+
errorLine("Error: market argument required. Example: bithumb-trade market trades KRW-BTC");
|
|
137
|
+
process.exitCode = 1;
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const args = { market };
|
|
141
|
+
if (opts.count !== void 0) args.count = opts.count;
|
|
142
|
+
if (opts.to !== void 0) args.to = opts.to;
|
|
143
|
+
if (opts.cursor !== void 0) args.cursor = opts.cursor;
|
|
144
|
+
if (opts.daysAgo !== void 0) args.daysAgo = opts.daysAgo;
|
|
145
|
+
const result = await run("market_get_trades", args);
|
|
146
|
+
const items = result.data;
|
|
147
|
+
if (opts.json) return printJson(items);
|
|
148
|
+
if (!items?.length) {
|
|
149
|
+
outputLine("No trades found");
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
printTable(items.map((t) => ({
|
|
153
|
+
trade_date_utc: t["trade_date_utc"],
|
|
154
|
+
trade_time_utc: t["trade_time_utc"],
|
|
155
|
+
trade_price: t["trade_price"],
|
|
156
|
+
trade_volume: t["trade_volume"],
|
|
157
|
+
ask_bid: t["ask_bid"]
|
|
158
|
+
})));
|
|
159
|
+
}
|
|
160
|
+
async function cmdCandlesMinutes(run, market, opts) {
|
|
161
|
+
if (!market) {
|
|
162
|
+
errorLine("Error: market argument required");
|
|
163
|
+
process.exitCode = 1;
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const args = { market, unit: opts.unit };
|
|
167
|
+
if (opts.count !== void 0) args.count = opts.count;
|
|
168
|
+
if (opts.to !== void 0) args.to = opts.to;
|
|
169
|
+
const result = await run("market_get_candles_minutes", args);
|
|
170
|
+
const items = result.data;
|
|
171
|
+
if (opts.json) return printJson(items);
|
|
172
|
+
if (!items?.length) {
|
|
173
|
+
outputLine("No candle data");
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
printTable(items.map((c) => ({
|
|
177
|
+
candle_date_time_kst: c["candle_date_time_kst"],
|
|
178
|
+
opening_price: c["opening_price"],
|
|
179
|
+
high_price: c["high_price"],
|
|
180
|
+
low_price: c["low_price"],
|
|
181
|
+
trade_price: c["trade_price"],
|
|
182
|
+
candle_acc_trade_volume: c["candle_acc_trade_volume"]
|
|
183
|
+
})));
|
|
184
|
+
}
|
|
185
|
+
async function cmdCandlesDays(run, market, opts) {
|
|
186
|
+
if (!market) {
|
|
187
|
+
errorLine("Error: market argument required");
|
|
188
|
+
process.exitCode = 1;
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const args = { market };
|
|
192
|
+
if (opts.count !== void 0) args.count = opts.count;
|
|
193
|
+
if (opts.to !== void 0) args.to = opts.to;
|
|
194
|
+
if (opts.convertingPriceUnit !== void 0) args.convertingPriceUnit = opts.convertingPriceUnit;
|
|
195
|
+
const result = await run("market_get_candles_days", args);
|
|
196
|
+
const items = result.data;
|
|
197
|
+
if (opts.json) return printJson(items);
|
|
198
|
+
if (!items?.length) {
|
|
199
|
+
outputLine("No candle data");
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
printTable(items.map((c) => ({
|
|
203
|
+
candle_date_time_kst: c["candle_date_time_kst"],
|
|
204
|
+
opening_price: c["opening_price"],
|
|
205
|
+
high_price: c["high_price"],
|
|
206
|
+
low_price: c["low_price"],
|
|
207
|
+
trade_price: c["trade_price"],
|
|
208
|
+
candle_acc_trade_volume: c["candle_acc_trade_volume"]
|
|
209
|
+
})));
|
|
210
|
+
}
|
|
211
|
+
async function cmdCandlesWeeks(run, market, opts) {
|
|
212
|
+
if (!market) {
|
|
213
|
+
errorLine("Error: market argument required");
|
|
214
|
+
process.exitCode = 1;
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const args = { market };
|
|
218
|
+
if (opts.count !== void 0) args.count = opts.count;
|
|
219
|
+
if (opts.to !== void 0) args.to = opts.to;
|
|
220
|
+
const result = await run("market_get_candles_weeks", args);
|
|
221
|
+
const items = result.data;
|
|
222
|
+
if (opts.json) return printJson(items);
|
|
223
|
+
if (!items?.length) {
|
|
224
|
+
outputLine("No candle data");
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
printTable(items.map((c) => ({
|
|
228
|
+
candle_date_time_kst: c["candle_date_time_kst"],
|
|
229
|
+
opening_price: c["opening_price"],
|
|
230
|
+
high_price: c["high_price"],
|
|
231
|
+
low_price: c["low_price"],
|
|
232
|
+
trade_price: c["trade_price"],
|
|
233
|
+
candle_acc_trade_volume: c["candle_acc_trade_volume"]
|
|
234
|
+
})));
|
|
235
|
+
}
|
|
236
|
+
async function cmdCandlesMonths(run, market, opts) {
|
|
237
|
+
if (!market) {
|
|
238
|
+
errorLine("Error: market argument required");
|
|
239
|
+
process.exitCode = 1;
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const args = { market };
|
|
243
|
+
if (opts.count !== void 0) args.count = opts.count;
|
|
244
|
+
if (opts.to !== void 0) args.to = opts.to;
|
|
245
|
+
const result = await run("market_get_candles_months", args);
|
|
246
|
+
const items = result.data;
|
|
247
|
+
if (opts.json) return printJson(items);
|
|
248
|
+
if (!items?.length) {
|
|
249
|
+
outputLine("No candle data");
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
printTable(items.map((c) => ({
|
|
253
|
+
candle_date_time_kst: c["candle_date_time_kst"],
|
|
254
|
+
opening_price: c["opening_price"],
|
|
255
|
+
high_price: c["high_price"],
|
|
256
|
+
low_price: c["low_price"],
|
|
257
|
+
trade_price: c["trade_price"],
|
|
258
|
+
candle_acc_trade_volume: c["candle_acc_trade_volume"]
|
|
259
|
+
})));
|
|
260
|
+
}
|
|
261
|
+
async function cmdWarnings(run, json) {
|
|
262
|
+
const result = await run("market_get_warnings", {});
|
|
263
|
+
const data = result.data;
|
|
264
|
+
if (json) return printJson(data);
|
|
265
|
+
const items = data;
|
|
266
|
+
if (!items?.length) {
|
|
267
|
+
outputLine("No warnings found");
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
printTable(items);
|
|
271
|
+
}
|
|
272
|
+
async function cmdNotices(run, opts) {
|
|
273
|
+
const args = {};
|
|
274
|
+
if (opts.count !== void 0) args.count = opts.count;
|
|
275
|
+
const result = await run("market_get_notices", args);
|
|
276
|
+
const data = result.data;
|
|
277
|
+
if (opts.json) return printJson(data);
|
|
278
|
+
const items = data;
|
|
279
|
+
if (!items?.length) {
|
|
280
|
+
outputLine("No notices found");
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
printTable(items);
|
|
284
|
+
}
|
|
285
|
+
async function cmdFeeInout(run, currency, json) {
|
|
286
|
+
if (!currency) {
|
|
287
|
+
errorLine("Error: currency argument required. Example: bithumb-trade market fee-inout BTC");
|
|
288
|
+
process.exitCode = 1;
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
const result = await run("market_get_fee_inout", { currency });
|
|
292
|
+
const data = result.data;
|
|
293
|
+
if (json) return printJson(data);
|
|
294
|
+
const items = data;
|
|
295
|
+
if (Array.isArray(items) && items.length) {
|
|
296
|
+
printTable(items);
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
printJson(data);
|
|
300
|
+
}
|
|
301
|
+
export {
|
|
302
|
+
handleMarketCommand
|
|
303
|
+
};
|
|
304
|
+
//# sourceMappingURL=market-B32IKWHH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/market.ts"],"sourcesContent":["import type { ToolRunner } from \"@bithumb-tradekit/core\";\nimport type { CliValues } from \"../parser.js\";\nimport { toNumber } from \"../parser.js\";\nimport { outputLine, errorLine, printJson, printTable, printKv } from \"../formatter.js\";\n\nexport async function handleMarketCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean,\n): Promise<void> {\n switch (action) {\n case \"markets\":\n return cmdMarkets(run, { isDetails: v.isDetails, json });\n case \"ticker\":\n return cmdTicker(run, rest[0] ?? v.market, json);\n case \"orderbook\":\n return cmdOrderbook(run, rest[0] ?? v.market, json);\n case \"trades\":\n return cmdTrades(run, rest[0] ?? v.market, {\n count: toNumber(v.count),\n to: v.to,\n cursor: v.cursor,\n daysAgo: toNumber(v.daysAgo),\n json,\n });\n case \"candles-minutes\":\n return cmdCandlesMinutes(run, rest[0] ?? v.market, {\n unit: toNumber(v.unit) ?? 1,\n count: toNumber(v.count),\n to: v.to,\n json,\n });\n case \"candles-days\":\n return cmdCandlesDays(run, rest[0] ?? v.market, {\n count: toNumber(v.count),\n to: v.to,\n convertingPriceUnit: v.convertingPriceUnit,\n json,\n });\n case \"candles-weeks\":\n return cmdCandlesWeeks(run, rest[0] ?? v.market, {\n count: toNumber(v.count),\n to: v.to,\n json,\n });\n case \"candles-months\":\n return cmdCandlesMonths(run, rest[0] ?? v.market, {\n count: toNumber(v.count),\n to: v.to,\n json,\n });\n case \"warnings\":\n return cmdWarnings(run, json);\n case \"notices\":\n return cmdNotices(run, { count: toNumber(v.count), json });\n case \"fee-inout\":\n return cmdFeeInout(run, rest[0] ?? v.currency, json);\n default:\n errorLine(`Unknown market command: ${action}. Run 'bithumb-trade market --help' for usage.`);\n process.exitCode = 1;\n }\n}\n\nasync function cmdMarkets(\n run: ToolRunner,\n opts: { isDetails?: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_markets\", {\n ...(opts.isDetails !== undefined && { isDetails: opts.isDetails }),\n });\n const items = result.data as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n if (!items?.length) { outputLine(\"No markets found\"); return; }\n printTable(items.map((m) => ({\n market: m[\"market\"],\n korean_name: m[\"korean_name\"],\n english_name: m[\"english_name\"],\n ...(opts.isDetails ? { market_warning: m[\"market_warning\"] ?? \"\" } : {}),\n })));\n}\n\nasync function cmdTicker(run: ToolRunner, markets: string | undefined, json: boolean): Promise<void> {\n if (!markets) { errorLine(\"Error: market argument required. Example: bithumb-trade market ticker KRW-BTC\"); process.exitCode = 1; return; }\n const result = await run(\"market_get_ticker\", { markets });\n const items = result.data as Record<string, unknown>[];\n if (json) return printJson(items);\n if (!items?.length) { outputLine(\"No ticker data\"); return; }\n printTable(items.map((t) => ({\n market: t[\"market\"],\n trade_price: t[\"trade_price\"],\n signed_change_rate: t[\"signed_change_rate\"],\n acc_trade_volume_24h: t[\"acc_trade_volume_24h\"],\n high_price: t[\"high_price\"],\n low_price: t[\"low_price\"],\n })));\n}\n\nasync function cmdOrderbook(run: ToolRunner, markets: string | undefined, json: boolean): Promise<void> {\n if (!markets) { errorLine(\"Error: market argument required. Example: bithumb-trade market orderbook KRW-BTC\"); process.exitCode = 1; return; }\n const result = await run(\"market_get_orderbook\", { markets });\n const items = result.data as Record<string, unknown>[];\n if (json) return printJson(items);\n if (!items?.length) { outputLine(\"No orderbook data\"); return; }\n for (const book of items) {\n outputLine(`\\n--- ${book[\"market\"]} ---`);\n outputLine(`Total Ask Size: ${book[\"total_ask_size\"]}`);\n outputLine(`Total Bid Size: ${book[\"total_bid_size\"]}`);\n const units = book[\"orderbook_units\"] as Record<string, unknown>[];\n if (units?.length) {\n printTable(units.slice(0, 10).map((u) => ({\n ask_price: u[\"ask_price\"],\n ask_size: u[\"ask_size\"],\n bid_price: u[\"bid_price\"],\n bid_size: u[\"bid_size\"],\n })));\n }\n }\n}\n\nasync function cmdTrades(\n run: ToolRunner,\n market: string | undefined,\n opts: { count?: number; to?: string; cursor?: string; daysAgo?: number; json: boolean },\n): Promise<void> {\n if (!market) { errorLine(\"Error: market argument required. Example: bithumb-trade market trades KRW-BTC\"); process.exitCode = 1; return; }\n const args: Record<string, unknown> = { market };\n if (opts.count !== undefined) args.count = opts.count;\n if (opts.to !== undefined) args.to = opts.to;\n if (opts.cursor !== undefined) args.cursor = opts.cursor;\n if (opts.daysAgo !== undefined) args.daysAgo = opts.daysAgo;\n const result = await run(\"market_get_trades\", args);\n const items = result.data as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n if (!items?.length) { outputLine(\"No trades found\"); return; }\n printTable(items.map((t) => ({\n trade_date_utc: t[\"trade_date_utc\"],\n trade_time_utc: t[\"trade_time_utc\"],\n trade_price: t[\"trade_price\"],\n trade_volume: t[\"trade_volume\"],\n ask_bid: t[\"ask_bid\"],\n })));\n}\n\nasync function cmdCandlesMinutes(\n run: ToolRunner,\n market: string | undefined,\n opts: { unit: number; count?: number; to?: string; json: boolean },\n): Promise<void> {\n if (!market) { errorLine(\"Error: market argument required\"); process.exitCode = 1; return; }\n const args: Record<string, unknown> = { market, unit: opts.unit };\n if (opts.count !== undefined) args.count = opts.count;\n if (opts.to !== undefined) args.to = opts.to;\n const result = await run(\"market_get_candles_minutes\", args);\n const items = result.data as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n if (!items?.length) { outputLine(\"No candle data\"); return; }\n printTable(items.map((c) => ({\n candle_date_time_kst: c[\"candle_date_time_kst\"],\n opening_price: c[\"opening_price\"],\n high_price: c[\"high_price\"],\n low_price: c[\"low_price\"],\n trade_price: c[\"trade_price\"],\n candle_acc_trade_volume: c[\"candle_acc_trade_volume\"],\n })));\n}\n\nasync function cmdCandlesDays(\n run: ToolRunner,\n market: string | undefined,\n opts: { count?: number; to?: string; convertingPriceUnit?: string; json: boolean },\n): Promise<void> {\n if (!market) { errorLine(\"Error: market argument required\"); process.exitCode = 1; return; }\n const args: Record<string, unknown> = { market };\n if (opts.count !== undefined) args.count = opts.count;\n if (opts.to !== undefined) args.to = opts.to;\n if (opts.convertingPriceUnit !== undefined) args.convertingPriceUnit = opts.convertingPriceUnit;\n const result = await run(\"market_get_candles_days\", args);\n const items = result.data as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n if (!items?.length) { outputLine(\"No candle data\"); return; }\n printTable(items.map((c) => ({\n candle_date_time_kst: c[\"candle_date_time_kst\"],\n opening_price: c[\"opening_price\"],\n high_price: c[\"high_price\"],\n low_price: c[\"low_price\"],\n trade_price: c[\"trade_price\"],\n candle_acc_trade_volume: c[\"candle_acc_trade_volume\"],\n })));\n}\n\nasync function cmdCandlesWeeks(\n run: ToolRunner,\n market: string | undefined,\n opts: { count?: number; to?: string; json: boolean },\n): Promise<void> {\n if (!market) { errorLine(\"Error: market argument required\"); process.exitCode = 1; return; }\n const args: Record<string, unknown> = { market };\n if (opts.count !== undefined) args.count = opts.count;\n if (opts.to !== undefined) args.to = opts.to;\n const result = await run(\"market_get_candles_weeks\", args);\n const items = result.data as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n if (!items?.length) { outputLine(\"No candle data\"); return; }\n printTable(items.map((c) => ({\n candle_date_time_kst: c[\"candle_date_time_kst\"],\n opening_price: c[\"opening_price\"],\n high_price: c[\"high_price\"],\n low_price: c[\"low_price\"],\n trade_price: c[\"trade_price\"],\n candle_acc_trade_volume: c[\"candle_acc_trade_volume\"],\n })));\n}\n\nasync function cmdCandlesMonths(\n run: ToolRunner,\n market: string | undefined,\n opts: { count?: number; to?: string; json: boolean },\n): Promise<void> {\n if (!market) { errorLine(\"Error: market argument required\"); process.exitCode = 1; return; }\n const args: Record<string, unknown> = { market };\n if (opts.count !== undefined) args.count = opts.count;\n if (opts.to !== undefined) args.to = opts.to;\n const result = await run(\"market_get_candles_months\", args);\n const items = result.data as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n if (!items?.length) { outputLine(\"No candle data\"); return; }\n printTable(items.map((c) => ({\n candle_date_time_kst: c[\"candle_date_time_kst\"],\n opening_price: c[\"opening_price\"],\n high_price: c[\"high_price\"],\n low_price: c[\"low_price\"],\n trade_price: c[\"trade_price\"],\n candle_acc_trade_volume: c[\"candle_acc_trade_volume\"],\n })));\n}\n\nasync function cmdWarnings(run: ToolRunner, json: boolean): Promise<void> {\n const result = await run(\"market_get_warnings\", {});\n const data = result.data;\n if (json) return printJson(data);\n const items = data as Record<string, unknown>[];\n if (!items?.length) { outputLine(\"No warnings found\"); return; }\n printTable(items);\n}\n\nasync function cmdNotices(run: ToolRunner, opts: { count?: number; json: boolean }): Promise<void> {\n const args: Record<string, unknown> = {};\n if (opts.count !== undefined) args.count = opts.count;\n const result = await run(\"market_get_notices\", args);\n const data = result.data;\n if (opts.json) return printJson(data);\n const items = data as Record<string, unknown>[];\n if (!items?.length) { outputLine(\"No notices found\"); return; }\n printTable(items);\n}\n\nasync function cmdFeeInout(run: ToolRunner, currency: string | undefined, json: boolean): Promise<void> {\n if (!currency) { errorLine(\"Error: currency argument required. Example: bithumb-trade market fee-inout BTC\"); process.exitCode = 1; return; }\n const result = await run(\"market_get_fee_inout\", { currency });\n const data = result.data;\n if (json) return printJson(data);\n const items = data as Record<string, unknown>[];\n if (Array.isArray(items) && items.length) { printTable(items); return; }\n printJson(data);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
toArray,
|
|
4
|
+
toNumber
|
|
5
|
+
} from "./chunk-XOKGESZ3.js";
|
|
6
|
+
import {
|
|
7
|
+
errorLine,
|
|
8
|
+
outputLine,
|
|
9
|
+
printJson,
|
|
10
|
+
printKv,
|
|
11
|
+
printTable
|
|
12
|
+
} from "./chunk-FYO6WLZI.js";
|
|
13
|
+
|
|
14
|
+
// src/commands/trade.ts
|
|
15
|
+
import { readFileSync } from "fs";
|
|
16
|
+
async function handleTradeCommand(run, action, v, json) {
|
|
17
|
+
switch (action) {
|
|
18
|
+
case "orders":
|
|
19
|
+
return cmdOrders(run, {
|
|
20
|
+
market: v.market,
|
|
21
|
+
state: v.state,
|
|
22
|
+
states: toArray(v.states),
|
|
23
|
+
uuids: toArray(v.uuids),
|
|
24
|
+
clientOrderIds: toArray(v.clientOrderIds),
|
|
25
|
+
orderBy: v.orderBy,
|
|
26
|
+
page: toNumber(v.page),
|
|
27
|
+
limit: toNumber(v.limit),
|
|
28
|
+
json
|
|
29
|
+
});
|
|
30
|
+
case "get":
|
|
31
|
+
return cmdGet(run, { uuid: v.uuid, clientOrderId: v.clientOrderId, json });
|
|
32
|
+
case "place":
|
|
33
|
+
if (v.ordTypeConflict) {
|
|
34
|
+
errorLine(
|
|
35
|
+
"Error: Both --order-type and --ord-type were provided. Use only --order-type (--ord-type is a deprecated alias)."
|
|
36
|
+
);
|
|
37
|
+
process.exitCode = 1;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (v.ordTypeFromDeprecatedAlias) {
|
|
41
|
+
errorLine("[deprecated] --ord-type is deprecated; use --order-type (same values).");
|
|
42
|
+
}
|
|
43
|
+
return cmdPlace(run, {
|
|
44
|
+
market: v.market,
|
|
45
|
+
side: v.side,
|
|
46
|
+
ordType: v.ordType,
|
|
47
|
+
price: v.price,
|
|
48
|
+
volume: v.volume,
|
|
49
|
+
clientOrderId: v.clientOrderId,
|
|
50
|
+
json
|
|
51
|
+
});
|
|
52
|
+
case "cancel":
|
|
53
|
+
return cmdCancel(run, { uuid: v.uuid, clientOrderId: v.clientOrderId, json });
|
|
54
|
+
case "batch-place":
|
|
55
|
+
return cmdBatchPlace(run, v, json);
|
|
56
|
+
case "batch-cancel":
|
|
57
|
+
return cmdBatchCancel(run, v, json);
|
|
58
|
+
default:
|
|
59
|
+
errorLine(`Unknown trade command: ${action}. Run 'bithumb-trade trade --help' for usage.`);
|
|
60
|
+
process.exitCode = 1;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function cmdOrders(run, opts) {
|
|
64
|
+
const args = {};
|
|
65
|
+
if (opts.market) args.market = opts.market;
|
|
66
|
+
if (opts.state) args.state = opts.state;
|
|
67
|
+
if (opts.states) args.states = opts.states;
|
|
68
|
+
if (opts.uuids) args.uuids = opts.uuids;
|
|
69
|
+
if (opts.clientOrderIds) args.client_order_ids = opts.clientOrderIds;
|
|
70
|
+
if (opts.orderBy) args.order_by = opts.orderBy;
|
|
71
|
+
if (opts.page !== void 0) args.page = opts.page;
|
|
72
|
+
if (opts.limit !== void 0) args.limit = opts.limit;
|
|
73
|
+
const result = await run("trade_get_orders", args);
|
|
74
|
+
const items = result.data;
|
|
75
|
+
if (opts.json) return printJson(items);
|
|
76
|
+
if (!items?.length) {
|
|
77
|
+
outputLine("No orders found");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
printTable(items.map((o) => ({
|
|
81
|
+
uuid: o["uuid"],
|
|
82
|
+
market: o["market"],
|
|
83
|
+
side: o["side"],
|
|
84
|
+
ord_type: o["ord_type"],
|
|
85
|
+
price: o["price"],
|
|
86
|
+
volume: o["volume"],
|
|
87
|
+
state: o["state"],
|
|
88
|
+
created_at: o["created_at"]
|
|
89
|
+
})));
|
|
90
|
+
}
|
|
91
|
+
async function cmdGet(run, opts) {
|
|
92
|
+
if (!opts.uuid && !opts.clientOrderId) {
|
|
93
|
+
errorLine("Error: --uuid or --client-order-id is required. Example: bithumb-trade trade get --uuid abc-123");
|
|
94
|
+
process.exitCode = 1;
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const args = {};
|
|
98
|
+
if (opts.uuid) args.uuid = opts.uuid;
|
|
99
|
+
if (opts.clientOrderId) args.client_order_id = opts.clientOrderId;
|
|
100
|
+
const result = await run("trade_get_order", args);
|
|
101
|
+
const data = result.data;
|
|
102
|
+
if (opts.json) return printJson(data);
|
|
103
|
+
printKv(data);
|
|
104
|
+
}
|
|
105
|
+
async function cmdPlace(run, opts) {
|
|
106
|
+
if (!opts.market || !opts.side || !opts.ordType) {
|
|
107
|
+
errorLine("Error: --market, --side, and --order-type are required.");
|
|
108
|
+
errorLine("Example: bithumb-trade trade place --market KRW-BTC --side bid --order-type limit --price 50000000 --volume 0.01");
|
|
109
|
+
errorLine("Note: --ord-type is accepted as a deprecated alias of --order-type.");
|
|
110
|
+
process.exitCode = 1;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const args = {
|
|
114
|
+
market: opts.market,
|
|
115
|
+
side: opts.side,
|
|
116
|
+
order_type: opts.ordType
|
|
117
|
+
};
|
|
118
|
+
if (opts.price) args.price = opts.price;
|
|
119
|
+
if (opts.volume) args.volume = opts.volume;
|
|
120
|
+
if (opts.clientOrderId) args.client_order_id = opts.clientOrderId;
|
|
121
|
+
const result = await run("trade_place_order", args);
|
|
122
|
+
const data = result.data;
|
|
123
|
+
if (opts.json) return printJson(data);
|
|
124
|
+
outputLine(`Order placed: ${data["uuid"]}`);
|
|
125
|
+
printKv(data);
|
|
126
|
+
}
|
|
127
|
+
async function cmdCancel(run, opts) {
|
|
128
|
+
if (!opts.uuid && !opts.clientOrderId) {
|
|
129
|
+
errorLine("Error: --uuid or --client-order-id is required. Example: bithumb-trade trade cancel --uuid abc-123");
|
|
130
|
+
process.exitCode = 1;
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const args = {};
|
|
134
|
+
if (opts.uuid) args.order_id = opts.uuid;
|
|
135
|
+
if (opts.clientOrderId) args.client_order_id = opts.clientOrderId;
|
|
136
|
+
const result = await run("trade_cancel_order", args);
|
|
137
|
+
const data = result.data;
|
|
138
|
+
if (opts.json) return printJson(data);
|
|
139
|
+
outputLine(`Order cancelled: ${data["uuid"] ?? opts.uuid ?? opts.clientOrderId}`);
|
|
140
|
+
printKv(data);
|
|
141
|
+
}
|
|
142
|
+
async function cmdBatchPlace(run, v, json) {
|
|
143
|
+
if (!v.file) {
|
|
144
|
+
errorLine("Error: --file is required. Provide a JSON file with batch orders.");
|
|
145
|
+
errorLine("Example: bithumb-trade trade batch-place --file orders.json");
|
|
146
|
+
errorLine('File format: [{"market":"KRW-BTC","side":"bid","order_type":"limit","price":"50000000","volume":"0.01"}]');
|
|
147
|
+
process.exitCode = 1;
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
let raw;
|
|
151
|
+
try {
|
|
152
|
+
raw = readFileSync(v.file, "utf-8");
|
|
153
|
+
} catch {
|
|
154
|
+
errorLine(`Error: File not found: ${v.file}`);
|
|
155
|
+
process.exitCode = 1;
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
let parsed;
|
|
159
|
+
try {
|
|
160
|
+
parsed = JSON.parse(raw);
|
|
161
|
+
} catch {
|
|
162
|
+
errorLine(`Error: Invalid JSON in file: ${v.file}`);
|
|
163
|
+
process.exitCode = 1;
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const rawBatch = Array.isArray(parsed) ? parsed : parsed?.batch_orders;
|
|
167
|
+
if (!Array.isArray(rawBatch)) {
|
|
168
|
+
errorLine(
|
|
169
|
+
"Error: batch file must be a JSON array, or an object with 'batch_orders' that is an array."
|
|
170
|
+
);
|
|
171
|
+
errorLine(
|
|
172
|
+
'Example: [{"market":"KRW-BTC","side":"bid","order_type":"limit","price":"50000000","volume":"0.01"}]'
|
|
173
|
+
);
|
|
174
|
+
process.exitCode = 1;
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
let normalizedAny = false;
|
|
178
|
+
const batchOrders = [];
|
|
179
|
+
for (let i = 0; i < rawBatch.length; i++) {
|
|
180
|
+
const o = rawBatch[i];
|
|
181
|
+
if (o && typeof o === "object" && !Array.isArray(o)) {
|
|
182
|
+
const obj = o;
|
|
183
|
+
const hasCanonical = "order_type" in obj;
|
|
184
|
+
const hasDeprecated = "ord_type" in obj;
|
|
185
|
+
if (hasCanonical && hasDeprecated) {
|
|
186
|
+
errorLine(
|
|
187
|
+
`Error: batch order at index ${i} has both 'order_type' and 'ord_type'. Use only 'order_type' ('ord_type' is a deprecated alias).`
|
|
188
|
+
);
|
|
189
|
+
process.exitCode = 1;
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (!hasCanonical && hasDeprecated) {
|
|
193
|
+
normalizedAny = true;
|
|
194
|
+
const { ord_type, ...rest } = obj;
|
|
195
|
+
batchOrders.push({ ...rest, order_type: ord_type });
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
batchOrders.push(o);
|
|
200
|
+
}
|
|
201
|
+
if (normalizedAny) {
|
|
202
|
+
errorLine(
|
|
203
|
+
"[notice] batch JSON used 'ord_type'; normalized to canonical 'order_type'. Update your file to use 'order_type'."
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
const result = await run("trade_batch_place", { batch_orders: batchOrders });
|
|
207
|
+
const data = result.data;
|
|
208
|
+
if (json) return printJson(data);
|
|
209
|
+
const items = data;
|
|
210
|
+
if (Array.isArray(items)) {
|
|
211
|
+
printTable(items);
|
|
212
|
+
} else {
|
|
213
|
+
printKv(data);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async function cmdBatchCancel(run, v, json) {
|
|
217
|
+
const args = {};
|
|
218
|
+
if (v.uuids) args.order_ids = toArray(v.uuids);
|
|
219
|
+
if (v.clientOrderIds) args.client_order_ids = toArray(v.clientOrderIds);
|
|
220
|
+
if (!args.order_ids && !args.client_order_ids) {
|
|
221
|
+
errorLine("Error: --uuids or --client-order-ids required. Example: bithumb-trade trade batch-cancel --uuids id1,id2");
|
|
222
|
+
process.exitCode = 1;
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const result = await run("trade_batch_cancel", args);
|
|
226
|
+
const data = result.data;
|
|
227
|
+
if (json) return printJson(data);
|
|
228
|
+
printKv(data);
|
|
229
|
+
}
|
|
230
|
+
export {
|
|
231
|
+
handleTradeCommand
|
|
232
|
+
};
|
|
233
|
+
//# sourceMappingURL=trade-ZZU6PXJL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/trade.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport type { ToolRunner } from \"@bithumb-tradekit/core\";\nimport type { CliValues } from \"../parser.js\";\nimport { toArray, toNumber } from \"../parser.js\";\nimport { outputLine, errorLine, printJson, printTable, printKv } from \"../formatter.js\";\n\nexport async function handleTradeCommand(\n run: ToolRunner,\n action: string,\n v: CliValues,\n json: boolean,\n): Promise<void> {\n switch (action) {\n case \"orders\":\n return cmdOrders(run, {\n market: v.market,\n state: v.state,\n states: toArray(v.states),\n uuids: toArray(v.uuids),\n clientOrderIds: toArray(v.clientOrderIds),\n orderBy: v.orderBy,\n page: toNumber(v.page),\n limit: toNumber(v.limit),\n json,\n });\n case \"get\":\n return cmdGet(run, { uuid: v.uuid, clientOrderId: v.clientOrderId, json });\n case \"place\":\n if (v.ordTypeConflict) {\n errorLine(\n \"Error: Both --order-type and --ord-type were provided. Use only --order-type (--ord-type is a deprecated alias).\",\n );\n process.exitCode = 1;\n return;\n }\n if (v.ordTypeFromDeprecatedAlias) {\n errorLine(\"[deprecated] --ord-type is deprecated; use --order-type (same values).\");\n }\n return cmdPlace(run, {\n market: v.market,\n side: v.side,\n ordType: v.ordType,\n price: v.price,\n volume: v.volume,\n clientOrderId: v.clientOrderId,\n json,\n });\n case \"cancel\":\n return cmdCancel(run, { uuid: v.uuid, clientOrderId: v.clientOrderId, json });\n case \"batch-place\":\n return cmdBatchPlace(run, v, json);\n case \"batch-cancel\":\n return cmdBatchCancel(run, v, json);\n default:\n errorLine(`Unknown trade command: ${action}. Run 'bithumb-trade trade --help' for usage.`);\n process.exitCode = 1;\n }\n}\n\nasync function cmdOrders(\n run: ToolRunner,\n opts: {\n market?: string;\n state?: string;\n states?: string[];\n uuids?: string[];\n clientOrderIds?: string[];\n orderBy?: string;\n page?: number;\n limit?: number;\n json: boolean;\n },\n): Promise<void> {\n const args: Record<string, unknown> = {};\n if (opts.market) args.market = opts.market;\n if (opts.state) args.state = opts.state;\n if (opts.states) args.states = opts.states;\n if (opts.uuids) args.uuids = opts.uuids;\n if (opts.clientOrderIds) args.client_order_ids = opts.clientOrderIds;\n if (opts.orderBy) args.order_by = opts.orderBy;\n if (opts.page !== undefined) args.page = opts.page;\n if (opts.limit !== undefined) args.limit = opts.limit;\n const result = await run(\"trade_get_orders\", args);\n const items = result.data as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n if (!items?.length) { outputLine(\"No orders found\"); return; }\n printTable(items.map((o) => ({\n uuid: o[\"uuid\"],\n market: o[\"market\"],\n side: o[\"side\"],\n ord_type: o[\"ord_type\"],\n price: o[\"price\"],\n volume: o[\"volume\"],\n state: o[\"state\"],\n created_at: o[\"created_at\"],\n })));\n}\n\nasync function cmdGet(\n run: ToolRunner,\n opts: { uuid?: string; clientOrderId?: string; json: boolean },\n): Promise<void> {\n if (!opts.uuid && !opts.clientOrderId) {\n errorLine(\"Error: --uuid or --client-order-id is required. Example: bithumb-trade trade get --uuid abc-123\");\n process.exitCode = 1;\n return;\n }\n const args: Record<string, unknown> = {};\n if (opts.uuid) args.uuid = opts.uuid;\n if (opts.clientOrderId) args.client_order_id = opts.clientOrderId;\n const result = await run(\"trade_get_order\", args);\n const data = result.data as Record<string, unknown>;\n if (opts.json) return printJson(data);\n printKv(data);\n}\n\nasync function cmdPlace(\n run: ToolRunner,\n opts: {\n market?: string;\n side?: string;\n ordType?: string;\n price?: string;\n volume?: string;\n clientOrderId?: string;\n json: boolean;\n },\n): Promise<void> {\n if (!opts.market || !opts.side || !opts.ordType) {\n errorLine(\"Error: --market, --side, and --order-type are required.\");\n errorLine(\"Example: bithumb-trade trade place --market KRW-BTC --side bid --order-type limit --price 50000000 --volume 0.01\");\n errorLine(\"Note: --ord-type is accepted as a deprecated alias of --order-type.\");\n process.exitCode = 1;\n return;\n }\n const args: Record<string, unknown> = {\n market: opts.market,\n side: opts.side,\n order_type: opts.ordType,\n };\n if (opts.price) args.price = opts.price;\n if (opts.volume) args.volume = opts.volume;\n if (opts.clientOrderId) args.client_order_id = opts.clientOrderId;\n const result = await run(\"trade_place_order\", args);\n const data = result.data as Record<string, unknown>;\n if (opts.json) return printJson(data);\n outputLine(`Order placed: ${data[\"uuid\"]}`);\n printKv(data);\n}\n\nasync function cmdCancel(\n run: ToolRunner,\n opts: { uuid?: string; clientOrderId?: string; json: boolean },\n): Promise<void> {\n if (!opts.uuid && !opts.clientOrderId) {\n errorLine(\"Error: --uuid or --client-order-id is required. Example: bithumb-trade trade cancel --uuid abc-123\");\n process.exitCode = 1;\n return;\n }\n const args: Record<string, unknown> = {};\n if (opts.uuid) args.order_id = opts.uuid;\n if (opts.clientOrderId) args.client_order_id = opts.clientOrderId;\n const result = await run(\"trade_cancel_order\", args);\n const data = result.data as Record<string, unknown>;\n if (opts.json) return printJson(data);\n outputLine(`Order cancelled: ${data[\"uuid\"] ?? opts.uuid ?? opts.clientOrderId}`);\n printKv(data);\n}\n\nasync function cmdBatchPlace(\n run: ToolRunner,\n v: CliValues,\n json: boolean,\n): Promise<void> {\n if (!v.file) {\n errorLine(\"Error: --file is required. Provide a JSON file with batch orders.\");\n errorLine(\"Example: bithumb-trade trade batch-place --file orders.json\");\n errorLine('File format: [{\"market\":\"KRW-BTC\",\"side\":\"bid\",\"order_type\":\"limit\",\"price\":\"50000000\",\"volume\":\"0.01\"}]');\n process.exitCode = 1;\n return;\n }\n\n let raw: string;\n try {\n raw = readFileSync(v.file, \"utf-8\");\n } catch {\n errorLine(`Error: File not found: ${v.file}`);\n process.exitCode = 1;\n return;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n errorLine(`Error: Invalid JSON in file: ${v.file}`);\n process.exitCode = 1;\n return;\n }\n\n const rawBatch = Array.isArray(parsed)\n ? parsed\n : (parsed as Record<string, unknown>)?.batch_orders;\n\n if (!Array.isArray(rawBatch)) {\n errorLine(\n \"Error: batch file must be a JSON array, or an object with 'batch_orders' that is an array.\",\n );\n errorLine(\n 'Example: [{\"market\":\"KRW-BTC\",\"side\":\"bid\",\"order_type\":\"limit\",\"price\":\"50000000\",\"volume\":\"0.01\"}]',\n );\n process.exitCode = 1;\n return;\n }\n\n // Normalize legacy `ord_type` field → canonical `order_type`.\n // Bithumb API expects `order_type`; some agents send `ord_type` (response-field name).\n // If both are present we refuse to guess which the user meant — silently dropping\n // one would risk an unintended order.\n let normalizedAny = false;\n const batchOrders: unknown[] = [];\n for (let i = 0; i < rawBatch.length; i++) {\n const o = rawBatch[i];\n if (o && typeof o === \"object\" && !Array.isArray(o)) {\n const obj = o as Record<string, unknown>;\n const hasCanonical = \"order_type\" in obj;\n const hasDeprecated = \"ord_type\" in obj;\n if (hasCanonical && hasDeprecated) {\n errorLine(\n `Error: batch order at index ${i} has both 'order_type' and 'ord_type'. Use only 'order_type' ('ord_type' is a deprecated alias).`,\n );\n process.exitCode = 1;\n return;\n }\n if (!hasCanonical && hasDeprecated) {\n normalizedAny = true;\n const { ord_type, ...rest } = obj;\n batchOrders.push({ ...rest, order_type: ord_type });\n continue;\n }\n }\n batchOrders.push(o);\n }\n\n if (normalizedAny) {\n errorLine(\n \"[notice] batch JSON used 'ord_type'; normalized to canonical 'order_type'. Update your file to use 'order_type'.\",\n );\n }\n\n const result = await run(\"trade_batch_place\", { batch_orders: batchOrders });\n const data = result.data;\n if (json) return printJson(data);\n const items = data as Record<string, unknown>[];\n if (Array.isArray(items)) {\n printTable(items);\n } else {\n printKv(data as Record<string, unknown>);\n }\n}\n\nasync function cmdBatchCancel(\n run: ToolRunner,\n v: CliValues,\n json: boolean,\n): Promise<void> {\n const args: Record<string, unknown> = {};\n if (v.uuids) args.order_ids = toArray(v.uuids);\n if (v.clientOrderIds) args.client_order_ids = toArray(v.clientOrderIds);\n if (!args.order_ids && !args.client_order_ids) {\n errorLine(\"Error: --uuids or --client-order-ids required. Example: bithumb-trade trade batch-cancel --uuids id1,id2\");\n process.exitCode = 1;\n return;\n }\n const result = await run(\"trade_batch_cancel\", args);\n const data = result.data as Record<string, unknown>;\n if (json) return printJson(data);\n printKv(data);\n}\n"],"mappings":"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","names":[]}
|