├── .eslintrc.js
├── .gitignore
├── README.md
├── package-lock.json
├── package.json
└── src
├── index.js
└── order_status
└── index.js
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | "env": {
3 | "browser": true,
4 | "commonjs": true,
5 | "es6": true,
6 | "node": true
7 | },
8 | "extends": "eslint:recommended",
9 | "globals": {
10 | "Atomics": "readonly",
11 | "SharedArrayBuffer": "readonly"
12 | },
13 | "parserOptions": {
14 | "ecmaVersion": 2018
15 | },
16 | "rules": {
17 | "indent": ["error", 2]
18 | }
19 | };
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | .vscode/
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # bitopro-api-node
2 |
3 | [](https://badge.fury.io/js/bitopro-api-node)
4 |
5 | SDK for the [BitoPro](https://www.bitopro.com/) API.
6 |
7 | [Bitopro official API document](https://developer.bitopro.com/docs)
8 |
9 | - [bitopro-api-node](#bitopro-api-node)
10 | - [Installation](#installation)
11 | - [Getting started](#getting-started)
12 | - [Limitations](#limitations)
13 | - [Rate Limit](#rate-limit)
14 | - [Precisions](#precisions)
15 | - [Minimum order amount](#minimum-order-amount)
16 | - [Public REST Endpoints](#public-rest-endpoints)
17 | - [getOrderBook](#getorderbook)
18 | - [getTickers](#gettickers)
19 | - [getTrades](#gettrades)
20 | - [Authenticated REST Endpoints](#authenticated-rest-endpoints)
21 | - [getAccountBalances](#getaccountbalances)
22 | - [getOrderHistory](#getorderhistory)
23 | - [getOrders](#getorders)
24 | - [createOrder](#createorder)
25 | - [cancelOrder](#cancelorder)
26 | - [getOrder](#getorder)
27 | - [Contributing](#contributing)
28 | - [License](#license)
29 |
30 | ### Installation
31 |
32 | npm install bitopro-api-node
33 |
34 | ### Getting started
35 |
36 | Create BitoPro client. Pass api keys only if
37 | you are going to do authenticated calls. You can create an api key
38 | [here](https://www.bitopro.com/api).
39 |
40 | ```js
41 | const BitoPro = require('bitopro-api-node')
42 | const bitopro = new BitoPro('your_api_key', 'your_api_secret', 'your_email')
43 | ```
44 |
45 | ### Limitations
46 |
47 | #### Rate Limit
48 |
49 | There is rate limits applied to each API, please check [API documentation](https://developer.bitopro.com/docs) for more detail.
50 |
51 | #### Precisions
52 |
53 | Both price and amount are subject to decimal restrictions, please check [official settings](https://www.bitopro.com/fees) for more detail.
54 |
55 | #### Minimum order amount
56 |
57 | Checkout the [official settings](https://www.bitopro.com/fees) of minimum amount.
58 |
59 |
60 | ### Public REST Endpoints
61 |
62 | #### getOrderBook
63 |
64 | ```js
65 | let getOrderBook = async () => {
66 | try {
67 | let book = await bitopro.getOrderBook('btc_twd')
68 | console.log(book)
69 | } catch (e) {
70 | console.log(e)
71 | }
72 | }
73 |
74 | getOrderBook()
75 | ```
76 |
77 |
78 | Output
79 |
80 | ```js
81 | {
82 | "bids": [
83 | {
84 | "price": "180500",
85 | "amount": "0.12817687",
86 | "count": 1,
87 | "total": "0.12817687"
88 | },
89 | {
90 | "price": "180010",
91 | "amount": "0.32292",
92 | "count": 2,
93 | "total": "0.45109687"
94 | },
95 | {
96 | "price": "180000",
97 | "amount": "0.24236",
98 | "count": 3,
99 | "total": "0.69345687"
100 | }
101 | ],
102 | "asks": [
103 | {
104 | "price": "180599",
105 | "amount": "0.00326056",
106 | "count": 1,
107 | "total": "0.00326056"
108 | },
109 | {
110 | "price": "180600",
111 | "amount": "0.04202575",
112 | "count": 1,
113 | "total": "0.04528631"
114 | }
115 | ]
116 | }
117 | ```
118 |
119 |
120 | #### getTickers
121 |
122 | ```js
123 | let getTickers = async () => {
124 | try {
125 | // all tickers
126 | let tickers = await bitopro.getTickers()
127 | console.log(tickers)
128 |
129 | // single ticker
130 | let ticker = await bitopro.getTickers('btc_twd')
131 | console.log(ticker)
132 | } catch (e) {
133 | console.log(e)
134 | }
135 | }
136 |
137 | getTickers()
138 | ```
139 |
140 |
141 | Output
142 |
143 | ```js
144 | // all tickers
145 | {
146 | "data": [
147 | {
148 | "pair": "xem_btc",
149 | "lastPrice": "0.00000098",
150 | "isBuyer": false,
151 | "priceChange24hr": "0",
152 | "volume24hr": "0.00000000",
153 | "high24hr": "0.00000098",
154 | "low24hr": "0.00000098"
155 | },
156 | {
157 | "pair": "bch_eth",
158 | "lastPrice": "0.60010000",
159 | "isBuyer": false,
160 | "priceChange24hr": "0",
161 | "volume24hr": "0.00000000",
162 | "high24hr": "0.60010000",
163 | "low24hr": "0.60010000"
164 | },
165 | {
166 | "pair": "eth_usdt",
167 | "lastPrice": "179.22000000",
168 | "isBuyer": true,
169 | "priceChange24hr": "10.85",
170 | "volume24hr": "925.14654180",
171 | "high24hr": "182.30000000",
172 | "low24hr": "159.94000000"
173 | }
174 | ]
175 | }
176 |
177 | // single ticker
178 | {
179 | "data": {
180 | "pair": "xem_eth",
181 | "lastPrice": "0.00010800",
182 | "isBuyer": false,
183 | "priceChange24hr": "0",
184 | "volume24hr": "0.00000000",
185 | "high24hr": "0.00010800",
186 | "low24hr": "0.00010800"
187 | }
188 | }
189 | ```
190 |
191 |
192 |
193 | #### getTrades
194 |
195 | ```js
196 | let getTrades = async () => {
197 | try {
198 | let trades = await bitopro.getTrades('btc_twd')
199 | console.log(trades)
200 | } catch (e) {
201 | console.log(e)
202 | }
203 | }
204 |
205 | getTrades()
206 | ```
207 |
208 |
209 | Output
210 |
211 | ```js
212 | {
213 | "data": [
214 | {
215 | "timestamp": 1557203407,
216 | "price": "180500.00000000",
217 | "amount": "0.07717687",
218 | "isBuyer": false
219 | },
220 | {
221 | "timestamp": 1557203187,
222 | "price": "180500.00000000",
223 | "amount": "0.05100000",
224 | "isBuyer": false
225 | },
226 | {
227 | "timestamp": 1557203053,
228 | "price": "180500.00000000",
229 | "amount": "0.01860000",
230 | "isBuyer": false
231 | },
232 | {
233 | "timestamp": 1557202804,
234 | "price": "180500.00000000",
235 | "amount": "0.04781533",
236 | "isBuyer": false
237 | },
238 | {
239 | "timestamp": 1557202804,
240 | "price": "180500.00000000",
241 | "amount": "0.06000000",
242 | "isBuyer": false
243 | }
244 | ]
245 | }
246 | ```
247 |
248 |
249 |
250 | ### Authenticated REST Endpoints
251 |
252 | #### getAccountBalances
253 |
254 | ```js
255 | let getAccountBalances = async () => {
256 | try {
257 | let balances = await bitopro.getAccountBalances()
258 | console.log(balances)
259 | } catch (e) {
260 | console.log(e)
261 | }
262 | }
263 |
264 | getAccountBalances()
265 | ```
266 |
267 |
268 | Output
269 |
270 | ```js
271 | {
272 | "data": [
273 | {
274 | "amount": "10001",
275 | "available": "1.0",
276 | "currency": "bito",
277 | "stake": "10000"
278 | },
279 | {
280 | "amount": "0.0",
281 | "available": "1.0",
282 | "currency": "btc",
283 | "stake": "0"
284 | },
285 | {
286 | "amount": "3.0",
287 | "available": "0.01",
288 | "currency": "eth",
289 | "stake": "0"
290 | },
291 | {
292 | "amount": "30000",
293 | "available": "2500",
294 | "currency": "twd",
295 | "stake": "0"
296 | }
297 | ]
298 | }
299 | ```
300 |
301 |
302 |
303 | #### getOrderHistory
304 |
305 | ```js
306 | let getOrderHistory = async () => {
307 | try {
308 | let history = await bitopro.getOrderHistory()
309 | console.log(history)
310 | } catch (e) {
311 | console.log(e)
312 | }
313 | }
314 |
315 | getOrderHistory()
316 | ```
317 |
318 |
319 | Output
320 |
321 | ```js
322 | {
323 | "data": [
324 | {
325 | "action": "buy",
326 | "avgExecutionPrice": "100000.00000000",
327 | "bitoFee": "0.00000000",
328 | "executedAmount": "1.00000000",
329 | "fee": "0.00100000",
330 | "feeSymbol": "BTC",
331 | "id": "123",
332 | "originalAmount": "1.00000000",
333 | "pair": "btc_twd",
334 | "price": "100000.00000000",
335 | "remainingAmount": "0.00000000",
336 | "status": 2,
337 | "timestamp": 1508753757000,
338 | "type": "limit"
339 | },
340 | {
341 | "action": "buy",
342 | "avgExecutionPrice": "100000.00000000",
343 | "bitoFee": "0.00000000",
344 | "executedAmount": "1.00000000",
345 | "fee": "0.00200000",
346 | "feeSymbol": "BTC",
347 | "id": "456",
348 | "originalAmount": "1.00000000",
349 | "pair": "btc_twd",
350 | "price": "100000.00000000",
351 | "remainingAmount": "0.00000000",
352 | "status": 2,
353 | "timestamp": 1508753787000,
354 | "type": "limit"
355 | }
356 | ]
357 | }
358 | ```
359 |
360 |
361 |
362 | #### getOrders
363 |
364 | ```js
365 | let getOrders = async () => {
366 | try {
367 | // only fetch active orders
368 | let orders = await bitopro.getOrders('bito_twd')
369 | console.log(orders)
370 |
371 | // include history orders
372 | orders = await bitopro.getOrders('bito_twd', false)
373 | console.log(orders)
374 |
375 | // with page parameter
376 | orders = await bitopro.getOrders('bito_twd', false, 1)
377 | console.log(orders)
378 | } catch (e) {
379 | console.log(e)
380 | }
381 | }
382 |
383 | getOrders()
384 | ```
385 |
386 |
387 | Output
388 |
389 | ```js
390 | {
391 | "data": [
392 | {
393 | "action": "buy",
394 | "avgExecutionPrice": "100000.00000000",
395 | "bitoFee": "0.00000000",
396 | "executedAmount": "1.00000000",
397 | "fee": "0.00100000",
398 | "feeSymbol": "BTC",
399 | "id": "123",
400 | "originalAmount": "1.00000000",
401 | "pair": "btc_twd",
402 | "price": "100000.00000000",
403 | "remainingAmount": "0.00000000",
404 | "status": 2,
405 | "timestamp": 1508753757000,
406 | "type": "limit"
407 | },
408 | {
409 | "action": "buy",
410 | "avgExecutionPrice": "100000.00000000",
411 | "bitoFee": "0.00000000",
412 | "executedAmount": "1.00000000",
413 | "fee": "0.00200000",
414 | "feeSymbol": "BTC",
415 | "id": "456",
416 | "originalAmount": "1.00000000",
417 | "pair": "btc_twd",
418 | "price": "100000.00000000",
419 | "remainingAmount": "0.00000000",
420 | "status": 2,
421 | "timestamp": 1508753787000,
422 | "type": "limit"
423 | }
424 | ],
425 | "page": 1,
426 | "totalPages": 10
427 | }
428 | ```
429 |
430 |
431 |
432 | #### createOrder
433 |
434 | ```js
435 | let createOrder = async () => {
436 | try {
437 | let order = {
438 | pair: 'btc_twd',
439 | action: 'buy',
440 | amount: '250',
441 | price: '0.000075', // no need for market orders
442 | timestamp: Date.now(),
443 | type: 'limit' // 'market' for market orders
444 | }
445 | let result = await bitopro.createOrder(order)
446 | console.log(result)
447 | } catch (e) {
448 | console.log(e)
449 | }
450 | }
451 |
452 | createOrder()
453 | ```
454 |
455 |
456 | Output
457 |
458 | ```js
459 | {
460 | "action": "buy",
461 | "amount": "0.235",
462 | "orderId": "11233456",
463 | "price": "1.0",
464 | "timestamp": 1504262258000
465 | }
466 | ```
467 |
468 |
469 |
470 | #### cancelOrder
471 |
472 | ```js
473 | let cancelOrder = async () => {
474 | try {
475 | let orderID = 123456
476 | let result = await bitopro.cancelOrder('btc_twd', orderID)
477 | console.log(result)
478 | } catch (e) {
479 | console.log(e)
480 | }
481 | }
482 |
483 | cancelOrder()
484 | ```
485 |
486 |
487 | Output
488 |
489 | ```js
490 | {
491 | "action": "buy",
492 | "amount": 2.3,
493 | "orderId": "12234566",
494 | "price": 1.2,
495 | "timestamp": 1504262258000
496 | }
497 | ```
498 |
499 |
500 |
501 | #### getOrder
502 |
503 | ```js
504 | let getOrder = async () => {
505 | try {
506 | let orderID = 123
507 | let result = await bitopro.getOrder('btc_twd', orderID)
508 | console.log(result)
509 | } catch (e) {
510 | console.log(e)
511 | }
512 | }
513 |
514 | getOrder()
515 | ```
516 |
517 |
518 | Output
519 |
520 | ```js
521 | {
522 | "action": "sell",
523 | "avgExecutionPrice": "112000.00000000",
524 | "bitoFee": "103.70370360",
525 | "executedAmount": "1.00000000",
526 | "fee": "0.00000000",
527 | "feeSymbol": "TWD",
528 | "id": "123",
529 | "originalAmount": "1.00000000",
530 | "pair": "btc_twd",
531 | "price": "112000.00000000",
532 | "remainingAmount": "0.00000000",
533 | "status": 2,
534 | "timestamp": 1508753757000,
535 | "type": "limit"
536 | }
537 | ```
538 |
539 |
540 |
541 | ## Contributing
542 |
543 | Bug reports and pull requests are welcome on GitHub at https://github.com/bitoex/bitopro-api-node and this project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
544 |
545 | 1. Fork it
546 | 2. Create your feature branch (```git checkout -b my-new-feature```).
547 | 3. Commit your changes (```git commit -am 'Added some feature'```)
548 | 4. Push to the branch (```git push origin my-new-feature```)
549 | 5. Create new Pull Request
550 |
551 | ## License
552 |
553 | The SDK is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "bitopro-api-node",
3 | "version": "3.1.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@babel/code-frame": {
8 | "version": "7.0.0",
9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
10 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
11 | "dev": true,
12 | "requires": {
13 | "@babel/highlight": "^7.0.0"
14 | }
15 | },
16 | "@babel/highlight": {
17 | "version": "7.0.0",
18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
19 | "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
20 | "dev": true,
21 | "requires": {
22 | "chalk": "^2.0.0",
23 | "esutils": "^2.0.2",
24 | "js-tokens": "^4.0.0"
25 | }
26 | },
27 | "acorn": {
28 | "version": "6.4.2",
29 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
30 | "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
31 | "dev": true
32 | },
33 | "acorn-jsx": {
34 | "version": "5.0.1",
35 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz",
36 | "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==",
37 | "dev": true
38 | },
39 | "ajv": {
40 | "version": "6.10.0",
41 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
42 | "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
43 | "dev": true,
44 | "requires": {
45 | "fast-deep-equal": "^2.0.1",
46 | "fast-json-stable-stringify": "^2.0.0",
47 | "json-schema-traverse": "^0.4.1",
48 | "uri-js": "^4.2.2"
49 | }
50 | },
51 | "ansi-escapes": {
52 | "version": "3.2.0",
53 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
54 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
55 | "dev": true
56 | },
57 | "ansi-regex": {
58 | "version": "3.0.0",
59 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
60 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
61 | "dev": true
62 | },
63 | "ansi-styles": {
64 | "version": "3.2.1",
65 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
66 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
67 | "dev": true,
68 | "requires": {
69 | "color-convert": "^1.9.0"
70 | }
71 | },
72 | "argparse": {
73 | "version": "1.0.10",
74 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
75 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
76 | "dev": true,
77 | "requires": {
78 | "sprintf-js": "~1.0.2"
79 | }
80 | },
81 | "astral-regex": {
82 | "version": "1.0.0",
83 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
84 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
85 | "dev": true
86 | },
87 | "axios": {
88 | "version": "0.21.1",
89 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
90 | "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
91 | "requires": {
92 | "follow-redirects": "^1.10.0"
93 | }
94 | },
95 | "balanced-match": {
96 | "version": "1.0.0",
97 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
98 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
99 | "dev": true
100 | },
101 | "brace-expansion": {
102 | "version": "1.1.11",
103 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
104 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
105 | "dev": true,
106 | "requires": {
107 | "balanced-match": "^1.0.0",
108 | "concat-map": "0.0.1"
109 | }
110 | },
111 | "callsites": {
112 | "version": "3.1.0",
113 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
114 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
115 | "dev": true
116 | },
117 | "chalk": {
118 | "version": "2.4.2",
119 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
120 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
121 | "dev": true,
122 | "requires": {
123 | "ansi-styles": "^3.2.1",
124 | "escape-string-regexp": "^1.0.5",
125 | "supports-color": "^5.3.0"
126 | }
127 | },
128 | "chardet": {
129 | "version": "0.7.0",
130 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
131 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
132 | "dev": true
133 | },
134 | "cli-cursor": {
135 | "version": "2.1.0",
136 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
137 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
138 | "dev": true,
139 | "requires": {
140 | "restore-cursor": "^2.0.0"
141 | }
142 | },
143 | "cli-width": {
144 | "version": "2.2.0",
145 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
146 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
147 | "dev": true
148 | },
149 | "color-convert": {
150 | "version": "1.9.3",
151 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
152 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
153 | "dev": true,
154 | "requires": {
155 | "color-name": "1.1.3"
156 | }
157 | },
158 | "color-name": {
159 | "version": "1.1.3",
160 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
161 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
162 | "dev": true
163 | },
164 | "concat-map": {
165 | "version": "0.0.1",
166 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
167 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
168 | "dev": true
169 | },
170 | "cross-spawn": {
171 | "version": "6.0.5",
172 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
173 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
174 | "dev": true,
175 | "requires": {
176 | "nice-try": "^1.0.4",
177 | "path-key": "^2.0.1",
178 | "semver": "^5.5.0",
179 | "shebang-command": "^1.2.0",
180 | "which": "^1.2.9"
181 | }
182 | },
183 | "deep-is": {
184 | "version": "0.1.3",
185 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
186 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
187 | "dev": true
188 | },
189 | "doctrine": {
190 | "version": "3.0.0",
191 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
192 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
193 | "dev": true,
194 | "requires": {
195 | "esutils": "^2.0.2"
196 | }
197 | },
198 | "emoji-regex": {
199 | "version": "7.0.3",
200 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
201 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
202 | "dev": true
203 | },
204 | "escape-string-regexp": {
205 | "version": "1.0.5",
206 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
207 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
208 | "dev": true
209 | },
210 | "eslint": {
211 | "version": "5.16.0",
212 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz",
213 | "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==",
214 | "dev": true,
215 | "requires": {
216 | "@babel/code-frame": "^7.0.0",
217 | "ajv": "^6.9.1",
218 | "chalk": "^2.1.0",
219 | "cross-spawn": "^6.0.5",
220 | "debug": "^4.0.1",
221 | "doctrine": "^3.0.0",
222 | "eslint-scope": "^4.0.3",
223 | "eslint-utils": "^1.3.1",
224 | "eslint-visitor-keys": "^1.0.0",
225 | "espree": "^5.0.1",
226 | "esquery": "^1.0.1",
227 | "esutils": "^2.0.2",
228 | "file-entry-cache": "^5.0.1",
229 | "functional-red-black-tree": "^1.0.1",
230 | "glob": "^7.1.2",
231 | "globals": "^11.7.0",
232 | "ignore": "^4.0.6",
233 | "import-fresh": "^3.0.0",
234 | "imurmurhash": "^0.1.4",
235 | "inquirer": "^6.2.2",
236 | "js-yaml": "^3.13.0",
237 | "json-stable-stringify-without-jsonify": "^1.0.1",
238 | "levn": "^0.3.0",
239 | "lodash": "^4.17.11",
240 | "minimatch": "^3.0.4",
241 | "mkdirp": "^0.5.1",
242 | "natural-compare": "^1.4.0",
243 | "optionator": "^0.8.2",
244 | "path-is-inside": "^1.0.2",
245 | "progress": "^2.0.0",
246 | "regexpp": "^2.0.1",
247 | "semver": "^5.5.1",
248 | "strip-ansi": "^4.0.0",
249 | "strip-json-comments": "^2.0.1",
250 | "table": "^5.2.3",
251 | "text-table": "^0.2.0"
252 | },
253 | "dependencies": {
254 | "debug": {
255 | "version": "4.1.1",
256 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
257 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
258 | "dev": true,
259 | "requires": {
260 | "ms": "^2.1.1"
261 | }
262 | }
263 | }
264 | },
265 | "eslint-scope": {
266 | "version": "4.0.3",
267 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
268 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
269 | "dev": true,
270 | "requires": {
271 | "esrecurse": "^4.1.0",
272 | "estraverse": "^4.1.1"
273 | }
274 | },
275 | "eslint-utils": {
276 | "version": "1.4.3",
277 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
278 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
279 | "dev": true,
280 | "requires": {
281 | "eslint-visitor-keys": "^1.1.0"
282 | },
283 | "dependencies": {
284 | "eslint-visitor-keys": {
285 | "version": "1.1.0",
286 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
287 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
288 | "dev": true
289 | }
290 | }
291 | },
292 | "eslint-visitor-keys": {
293 | "version": "1.0.0",
294 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
295 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
296 | "dev": true
297 | },
298 | "espree": {
299 | "version": "5.0.1",
300 | "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz",
301 | "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==",
302 | "dev": true,
303 | "requires": {
304 | "acorn": "^6.0.7",
305 | "acorn-jsx": "^5.0.0",
306 | "eslint-visitor-keys": "^1.0.0"
307 | }
308 | },
309 | "esprima": {
310 | "version": "4.0.1",
311 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
312 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
313 | "dev": true
314 | },
315 | "esquery": {
316 | "version": "1.0.1",
317 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
318 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
319 | "dev": true,
320 | "requires": {
321 | "estraverse": "^4.0.0"
322 | }
323 | },
324 | "esrecurse": {
325 | "version": "4.2.1",
326 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
327 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
328 | "dev": true,
329 | "requires": {
330 | "estraverse": "^4.1.0"
331 | }
332 | },
333 | "estraverse": {
334 | "version": "4.2.0",
335 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
336 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
337 | "dev": true
338 | },
339 | "esutils": {
340 | "version": "2.0.2",
341 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
342 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
343 | "dev": true
344 | },
345 | "external-editor": {
346 | "version": "3.0.3",
347 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
348 | "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
349 | "dev": true,
350 | "requires": {
351 | "chardet": "^0.7.0",
352 | "iconv-lite": "^0.4.24",
353 | "tmp": "^0.0.33"
354 | }
355 | },
356 | "fast-deep-equal": {
357 | "version": "2.0.1",
358 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
359 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
360 | "dev": true
361 | },
362 | "fast-json-stable-stringify": {
363 | "version": "2.0.0",
364 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
365 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
366 | "dev": true
367 | },
368 | "fast-levenshtein": {
369 | "version": "2.0.6",
370 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
371 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
372 | "dev": true
373 | },
374 | "figures": {
375 | "version": "2.0.0",
376 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
377 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
378 | "dev": true,
379 | "requires": {
380 | "escape-string-regexp": "^1.0.5"
381 | }
382 | },
383 | "file-entry-cache": {
384 | "version": "5.0.1",
385 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
386 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
387 | "dev": true,
388 | "requires": {
389 | "flat-cache": "^2.0.1"
390 | }
391 | },
392 | "flat-cache": {
393 | "version": "2.0.1",
394 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
395 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
396 | "dev": true,
397 | "requires": {
398 | "flatted": "^2.0.0",
399 | "rimraf": "2.6.3",
400 | "write": "1.0.3"
401 | }
402 | },
403 | "flatted": {
404 | "version": "2.0.0",
405 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz",
406 | "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==",
407 | "dev": true
408 | },
409 | "follow-redirects": {
410 | "version": "1.13.1",
411 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz",
412 | "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg=="
413 | },
414 | "fs.realpath": {
415 | "version": "1.0.0",
416 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
417 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
418 | "dev": true
419 | },
420 | "functional-red-black-tree": {
421 | "version": "1.0.1",
422 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
423 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
424 | "dev": true
425 | },
426 | "glob": {
427 | "version": "7.1.4",
428 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
429 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
430 | "dev": true,
431 | "requires": {
432 | "fs.realpath": "^1.0.0",
433 | "inflight": "^1.0.4",
434 | "inherits": "2",
435 | "minimatch": "^3.0.4",
436 | "once": "^1.3.0",
437 | "path-is-absolute": "^1.0.0"
438 | }
439 | },
440 | "globals": {
441 | "version": "11.12.0",
442 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
443 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
444 | "dev": true
445 | },
446 | "has-flag": {
447 | "version": "3.0.0",
448 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
449 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
450 | "dev": true
451 | },
452 | "iconv-lite": {
453 | "version": "0.4.24",
454 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
455 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
456 | "dev": true,
457 | "requires": {
458 | "safer-buffer": ">= 2.1.2 < 3"
459 | }
460 | },
461 | "ignore": {
462 | "version": "4.0.6",
463 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
464 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
465 | "dev": true
466 | },
467 | "import-fresh": {
468 | "version": "3.0.0",
469 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz",
470 | "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==",
471 | "dev": true,
472 | "requires": {
473 | "parent-module": "^1.0.0",
474 | "resolve-from": "^4.0.0"
475 | }
476 | },
477 | "imurmurhash": {
478 | "version": "0.1.4",
479 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
480 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
481 | "dev": true
482 | },
483 | "inflight": {
484 | "version": "1.0.6",
485 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
486 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
487 | "dev": true,
488 | "requires": {
489 | "once": "^1.3.0",
490 | "wrappy": "1"
491 | }
492 | },
493 | "inherits": {
494 | "version": "2.0.3",
495 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
496 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
497 | "dev": true
498 | },
499 | "inquirer": {
500 | "version": "6.3.1",
501 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz",
502 | "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==",
503 | "dev": true,
504 | "requires": {
505 | "ansi-escapes": "^3.2.0",
506 | "chalk": "^2.4.2",
507 | "cli-cursor": "^2.1.0",
508 | "cli-width": "^2.0.0",
509 | "external-editor": "^3.0.3",
510 | "figures": "^2.0.0",
511 | "lodash": "^4.17.11",
512 | "mute-stream": "0.0.7",
513 | "run-async": "^2.2.0",
514 | "rxjs": "^6.4.0",
515 | "string-width": "^2.1.0",
516 | "strip-ansi": "^5.1.0",
517 | "through": "^2.3.6"
518 | },
519 | "dependencies": {
520 | "ansi-regex": {
521 | "version": "4.1.0",
522 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
523 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
524 | "dev": true
525 | },
526 | "strip-ansi": {
527 | "version": "5.2.0",
528 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
529 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
530 | "dev": true,
531 | "requires": {
532 | "ansi-regex": "^4.1.0"
533 | }
534 | }
535 | }
536 | },
537 | "is-fullwidth-code-point": {
538 | "version": "2.0.0",
539 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
540 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
541 | "dev": true
542 | },
543 | "is-promise": {
544 | "version": "2.1.0",
545 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
546 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
547 | "dev": true
548 | },
549 | "isexe": {
550 | "version": "2.0.0",
551 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
552 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
553 | "dev": true
554 | },
555 | "js-tokens": {
556 | "version": "4.0.0",
557 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
558 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
559 | "dev": true
560 | },
561 | "js-yaml": {
562 | "version": "3.13.1",
563 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
564 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
565 | "dev": true,
566 | "requires": {
567 | "argparse": "^1.0.7",
568 | "esprima": "^4.0.0"
569 | }
570 | },
571 | "json-schema-traverse": {
572 | "version": "0.4.1",
573 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
574 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
575 | "dev": true
576 | },
577 | "json-stable-stringify-without-jsonify": {
578 | "version": "1.0.1",
579 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
580 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
581 | "dev": true
582 | },
583 | "levn": {
584 | "version": "0.3.0",
585 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
586 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
587 | "dev": true,
588 | "requires": {
589 | "prelude-ls": "~1.1.2",
590 | "type-check": "~0.3.2"
591 | }
592 | },
593 | "lodash": {
594 | "version": "4.17.21",
595 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
596 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
597 | "dev": true
598 | },
599 | "mimic-fn": {
600 | "version": "1.2.0",
601 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
602 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
603 | "dev": true
604 | },
605 | "minimatch": {
606 | "version": "3.0.4",
607 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
608 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
609 | "dev": true,
610 | "requires": {
611 | "brace-expansion": "^1.1.7"
612 | }
613 | },
614 | "minimist": {
615 | "version": "0.0.8",
616 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
617 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
618 | "dev": true
619 | },
620 | "mkdirp": {
621 | "version": "0.5.1",
622 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
623 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
624 | "dev": true,
625 | "requires": {
626 | "minimist": "0.0.8"
627 | }
628 | },
629 | "ms": {
630 | "version": "2.1.1",
631 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
632 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
633 | "dev": true
634 | },
635 | "mute-stream": {
636 | "version": "0.0.7",
637 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
638 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
639 | "dev": true
640 | },
641 | "natural-compare": {
642 | "version": "1.4.0",
643 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
644 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
645 | "dev": true
646 | },
647 | "nice-try": {
648 | "version": "1.0.5",
649 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
650 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
651 | "dev": true
652 | },
653 | "once": {
654 | "version": "1.4.0",
655 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
656 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
657 | "dev": true,
658 | "requires": {
659 | "wrappy": "1"
660 | }
661 | },
662 | "onetime": {
663 | "version": "2.0.1",
664 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
665 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
666 | "dev": true,
667 | "requires": {
668 | "mimic-fn": "^1.0.0"
669 | }
670 | },
671 | "optionator": {
672 | "version": "0.8.2",
673 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
674 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
675 | "dev": true,
676 | "requires": {
677 | "deep-is": "~0.1.3",
678 | "fast-levenshtein": "~2.0.4",
679 | "levn": "~0.3.0",
680 | "prelude-ls": "~1.1.2",
681 | "type-check": "~0.3.2",
682 | "wordwrap": "~1.0.0"
683 | }
684 | },
685 | "os-tmpdir": {
686 | "version": "1.0.2",
687 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
688 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
689 | "dev": true
690 | },
691 | "parent-module": {
692 | "version": "1.0.1",
693 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
694 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
695 | "dev": true,
696 | "requires": {
697 | "callsites": "^3.0.0"
698 | }
699 | },
700 | "path-is-absolute": {
701 | "version": "1.0.1",
702 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
703 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
704 | "dev": true
705 | },
706 | "path-is-inside": {
707 | "version": "1.0.2",
708 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
709 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
710 | "dev": true
711 | },
712 | "path-key": {
713 | "version": "2.0.1",
714 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
715 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
716 | "dev": true
717 | },
718 | "prelude-ls": {
719 | "version": "1.1.2",
720 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
721 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
722 | "dev": true
723 | },
724 | "progress": {
725 | "version": "2.0.3",
726 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
727 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
728 | "dev": true
729 | },
730 | "punycode": {
731 | "version": "2.1.1",
732 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
733 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
734 | "dev": true
735 | },
736 | "regexpp": {
737 | "version": "2.0.1",
738 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
739 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
740 | "dev": true
741 | },
742 | "resolve-from": {
743 | "version": "4.0.0",
744 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
745 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
746 | "dev": true
747 | },
748 | "restore-cursor": {
749 | "version": "2.0.0",
750 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
751 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
752 | "dev": true,
753 | "requires": {
754 | "onetime": "^2.0.0",
755 | "signal-exit": "^3.0.2"
756 | }
757 | },
758 | "rimraf": {
759 | "version": "2.6.3",
760 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
761 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
762 | "dev": true,
763 | "requires": {
764 | "glob": "^7.1.3"
765 | }
766 | },
767 | "run-async": {
768 | "version": "2.3.0",
769 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
770 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
771 | "dev": true,
772 | "requires": {
773 | "is-promise": "^2.1.0"
774 | }
775 | },
776 | "rxjs": {
777 | "version": "6.5.1",
778 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.1.tgz",
779 | "integrity": "sha512-y0j31WJc83wPu31vS1VlAFW5JGrnGC+j+TtGAa1fRQphy48+fDYiDmX8tjGloToEsMkxnouOg/1IzXGKkJnZMg==",
780 | "dev": true,
781 | "requires": {
782 | "tslib": "^1.9.0"
783 | }
784 | },
785 | "safer-buffer": {
786 | "version": "2.1.2",
787 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
788 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
789 | "dev": true
790 | },
791 | "semver": {
792 | "version": "5.7.0",
793 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
794 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
795 | "dev": true
796 | },
797 | "shebang-command": {
798 | "version": "1.2.0",
799 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
800 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
801 | "dev": true,
802 | "requires": {
803 | "shebang-regex": "^1.0.0"
804 | }
805 | },
806 | "shebang-regex": {
807 | "version": "1.0.0",
808 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
809 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
810 | "dev": true
811 | },
812 | "signal-exit": {
813 | "version": "3.0.2",
814 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
815 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
816 | "dev": true
817 | },
818 | "slice-ansi": {
819 | "version": "2.1.0",
820 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
821 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
822 | "dev": true,
823 | "requires": {
824 | "ansi-styles": "^3.2.0",
825 | "astral-regex": "^1.0.0",
826 | "is-fullwidth-code-point": "^2.0.0"
827 | }
828 | },
829 | "sprintf-js": {
830 | "version": "1.0.3",
831 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
832 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
833 | "dev": true
834 | },
835 | "string-width": {
836 | "version": "2.1.1",
837 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
838 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
839 | "dev": true,
840 | "requires": {
841 | "is-fullwidth-code-point": "^2.0.0",
842 | "strip-ansi": "^4.0.0"
843 | }
844 | },
845 | "strip-ansi": {
846 | "version": "4.0.0",
847 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
848 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
849 | "dev": true,
850 | "requires": {
851 | "ansi-regex": "^3.0.0"
852 | }
853 | },
854 | "strip-json-comments": {
855 | "version": "2.0.1",
856 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
857 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
858 | "dev": true
859 | },
860 | "supports-color": {
861 | "version": "5.5.0",
862 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
863 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
864 | "dev": true,
865 | "requires": {
866 | "has-flag": "^3.0.0"
867 | }
868 | },
869 | "table": {
870 | "version": "5.2.3",
871 | "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz",
872 | "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==",
873 | "dev": true,
874 | "requires": {
875 | "ajv": "^6.9.1",
876 | "lodash": "^4.17.11",
877 | "slice-ansi": "^2.1.0",
878 | "string-width": "^3.0.0"
879 | },
880 | "dependencies": {
881 | "ansi-regex": {
882 | "version": "4.1.0",
883 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
884 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
885 | "dev": true
886 | },
887 | "string-width": {
888 | "version": "3.1.0",
889 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
890 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
891 | "dev": true,
892 | "requires": {
893 | "emoji-regex": "^7.0.1",
894 | "is-fullwidth-code-point": "^2.0.0",
895 | "strip-ansi": "^5.1.0"
896 | }
897 | },
898 | "strip-ansi": {
899 | "version": "5.2.0",
900 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
901 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
902 | "dev": true,
903 | "requires": {
904 | "ansi-regex": "^4.1.0"
905 | }
906 | }
907 | }
908 | },
909 | "text-table": {
910 | "version": "0.2.0",
911 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
912 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
913 | "dev": true
914 | },
915 | "through": {
916 | "version": "2.3.8",
917 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
918 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
919 | "dev": true
920 | },
921 | "tmp": {
922 | "version": "0.0.33",
923 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
924 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
925 | "dev": true,
926 | "requires": {
927 | "os-tmpdir": "~1.0.2"
928 | }
929 | },
930 | "tslib": {
931 | "version": "1.9.3",
932 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
933 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
934 | "dev": true
935 | },
936 | "type-check": {
937 | "version": "0.3.2",
938 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
939 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
940 | "dev": true,
941 | "requires": {
942 | "prelude-ls": "~1.1.2"
943 | }
944 | },
945 | "uri-js": {
946 | "version": "4.2.2",
947 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
948 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
949 | "dev": true,
950 | "requires": {
951 | "punycode": "^2.1.0"
952 | }
953 | },
954 | "which": {
955 | "version": "1.3.1",
956 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
957 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
958 | "dev": true,
959 | "requires": {
960 | "isexe": "^2.0.0"
961 | }
962 | },
963 | "wordwrap": {
964 | "version": "1.0.0",
965 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
966 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
967 | "dev": true
968 | },
969 | "wrappy": {
970 | "version": "1.0.2",
971 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
972 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
973 | "dev": true
974 | },
975 | "write": {
976 | "version": "1.0.3",
977 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
978 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
979 | "dev": true,
980 | "requires": {
981 | "mkdirp": "^0.5.1"
982 | }
983 | }
984 | }
985 | }
986 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "bitopro-api-node",
3 | "version": "3.1.0",
4 | "description": "BitoPro node.js SDK.",
5 | "main": "src",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "git+https://github.com/bitoex/bitopro-api-node.git"
12 | },
13 | "keywords": [
14 | "nodejs",
15 | "bitopro",
16 | "SDK",
17 | "cryptocurrency",
18 | "exchange"
19 | ],
20 | "author": "coopermilk123@gmail.com",
21 | "license": "MIT",
22 | "bugs": {
23 | "url": "https://github.com/bitoex/bitopro-api-node/issues"
24 | },
25 | "homepage": "https://github.com/bitoex/bitopro-api-node#readme",
26 | "dependencies": {
27 | "axios": "^0.21.1"
28 | },
29 | "devDependencies": {
30 | "eslint": "^5.16.0"
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 | const crypto = require('crypto')
3 | const assert = require('assert')
4 |
5 | class BitoPro {
6 | constructor (apiKey, apiSecret, email) {
7 | this.apiKey = apiKey
8 | this.apiSecret = apiSecret
9 | this.email = email
10 | this.orderSides = ['sell', 'buy']
11 | this.orderTypes = ['market', 'limit']
12 | this.baseUrl = 'https://api.bitopro.com/v3'
13 | this.mobileBaseUrl = 'https://mobile-api.bitopro.com/v3'
14 | this.sdk = 'node'
15 | }
16 |
17 | async enableWatchingPrices () {
18 | let url = this.mobileBaseUrl + '/preference/watching/price/enable'
19 | const nonce = Date.now()
20 | const body = { identity: this.email, nonce }
21 | const payload = Buffer.from(JSON.stringify(body)).toString('base64')
22 |
23 | const signature = crypto
24 | .createHmac('sha384', this.apiSecret)
25 | .update(payload)
26 | .digest('hex')
27 |
28 | const options = {
29 | headers: {
30 | 'X-BITOPRO-APIKEY': this.apiKey,
31 | 'X-BITOPRO-PAYLOAD': payload,
32 | 'X-BITOPRO-SIGNATURE': signature,
33 | 'X-BITOPRO-API': this.sdk
34 | }
35 | }
36 |
37 | let res = await axios.patch(url, body, options)
38 | return res.data
39 | }
40 |
41 | async disableWatchingPrices () {
42 | let url = this.mobileBaseUrl + '/preference/watching/price/disable'
43 | const nonce = Date.now()
44 | const body = { identity: this.email, nonce }
45 | const payload = Buffer.from(JSON.stringify(body)).toString('base64')
46 |
47 | const signature = crypto
48 | .createHmac('sha384', this.apiSecret)
49 | .update(payload)
50 | .digest('hex')
51 |
52 | const options = {
53 | headers: {
54 | 'X-BITOPRO-APIKEY': this.apiKey,
55 | 'X-BITOPRO-PAYLOAD': payload,
56 | 'X-BITOPRO-SIGNATURE': signature,
57 | 'X-BITOPRO-API': this.sdk
58 | }
59 | }
60 |
61 | let res = await axios.patch(url, body, options)
62 | return res.data
63 | }
64 |
65 | async getWatchingPrices (pair = null) {
66 | let url = this.mobileBaseUrl + '/preference/watching/price/' + pair
67 | const nonce = Date.now()
68 | const body = { identity: this.email, nonce }
69 | const payload = Buffer.from(JSON.stringify(body)).toString('base64')
70 |
71 | const signature = crypto
72 | .createHmac('sha384', this.apiSecret)
73 | .update(payload)
74 | .digest('hex')
75 |
76 | const options = {
77 | headers: {
78 | 'X-BITOPRO-APIKEY': this.apiKey,
79 | 'X-BITOPRO-PAYLOAD': payload,
80 | 'X-BITOPRO-SIGNATURE': signature,
81 | 'X-BITOPRO-API': this.sdk
82 | }
83 | }
84 |
85 | let res = await axios.get(url, options)
86 | return res.data
87 | }
88 |
89 | async addWatchingPrice (pair = null, action = null, price = null) {
90 | assert(pair, 'Please provide pair')
91 | assert(action, `Action must be 'BUY' or 'SELL'`)
92 | assert(price, 'Please provide price in string format')
93 | let url = this.mobileBaseUrl + '/preference/watching/price/' + pair
94 | const nonce = Date.now()
95 | const body = {
96 | identity: this.email,
97 | nonce: nonce,
98 | action: action.toUpperCase(),
99 | price: price.toString()
100 | }
101 | const payload = Buffer.from(JSON.stringify(body)).toString('base64')
102 |
103 | const signature = crypto
104 | .createHmac('sha384', this.apiSecret)
105 | .update(payload)
106 | .digest('hex')
107 |
108 | const options = {
109 | headers: {
110 | 'X-BITOPRO-APIKEY': this.apiKey,
111 | 'X-BITOPRO-PAYLOAD': payload,
112 | 'X-BITOPRO-SIGNATURE': signature,
113 | 'X-BITOPRO-API': this.sdk
114 | }
115 | }
116 |
117 | let res = await axios.post(url, body, options)
118 | return res.data
119 | }
120 |
121 | async removeWatchingPrice (pair = null, action = null, price = null) {
122 | assert(pair, 'Please provide pair')
123 | assert(action, `Action must be 'BUY' or 'SELL'`)
124 | assert(price, 'Please provide price in string format')
125 | let url = this.mobileBaseUrl + `/preference/watching/price/${pair}/${action}/${price}`
126 | const nonce = Date.now()
127 | const body = {
128 | identity: this.email,
129 | nonce: nonce,
130 | action: action.toUpperCase(),
131 | price: price.toString()
132 | }
133 | const payload = Buffer.from(JSON.stringify(body)).toString('base64')
134 |
135 | const signature = crypto
136 | .createHmac('sha384', this.apiSecret)
137 | .update(payload)
138 | .digest('hex')
139 |
140 | const options = {
141 | headers: {
142 | 'X-BITOPRO-APIKEY': this.apiKey,
143 | 'X-BITOPRO-PAYLOAD': payload,
144 | 'X-BITOPRO-SIGNATURE': signature,
145 | 'X-BITOPRO-API': this.sdk
146 | }
147 | }
148 |
149 | let res = await axios.delete(url, options)
150 | return res.data
151 | }
152 |
153 | async getAccountBalances () {
154 | let url = this.baseUrl + '/accounts/balance'
155 | const nonce = Date.now()
156 | const body = { identity: this.email, nonce }
157 | const payload = Buffer.from(JSON.stringify(body)).toString('base64')
158 |
159 | const signature = crypto
160 | .createHmac('sha384', this.apiSecret)
161 | .update(payload)
162 | .digest('hex')
163 |
164 | const options = {
165 | headers: {
166 | 'X-BITOPRO-APIKEY': this.apiKey,
167 | 'X-BITOPRO-PAYLOAD': payload,
168 | 'X-BITOPRO-SIGNATURE': signature,
169 | 'X-BITOPRO-API': this.sdk
170 | }
171 | }
172 |
173 | let res = await axios.get(url, options)
174 | return res.data
175 | }
176 |
177 | async getOrderBook (pair, limit = 5) {
178 | assert(pair, 'Please provide pair')
179 | let url = `${this.baseUrl}/order-book/${pair}?limit=${limit}`
180 | const options = {
181 | headers: {
182 | 'X-BITOPRO-API': this.sdk
183 | }
184 | }
185 |
186 | let res = await axios.get(url, options)
187 | return res.data
188 | }
189 |
190 | async getTickers (pair = '') {
191 | let url = this.baseUrl + '/tickers/' + pair
192 | const options = {
193 | headers: {
194 | 'X-BITOPRO-API': this.sdk
195 | }
196 | }
197 |
198 | let res = await axios.get(url, options)
199 | return res.data
200 | }
201 |
202 | async getTrades (pair) {
203 | assert(pair, 'Please provide pair')
204 | let url = this.baseUrl + '/trades/' + pair
205 | const options = {
206 | headers: {
207 | 'X-BITOPRO-API': this.sdk
208 | }
209 | }
210 |
211 | let res = await axios.get(url, options)
212 | return res.data
213 | }
214 |
215 | async getOrderHistory () {
216 | assert(this.apiKey, 'Please provide api key')
217 | assert(this.apiSecret, 'Please provide api secret')
218 | let url = this.baseUrl + '/orders/history'
219 |
220 | const nonce = Date.now()
221 | const body = { identity: this.email, nonce }
222 | const payload = Buffer.from(JSON.stringify(body)).toString('base64')
223 |
224 | const signature = crypto
225 | .createHmac('sha384', this.apiSecret)
226 | .update(payload)
227 | .digest('hex')
228 |
229 | const options = {
230 | headers: {
231 | 'X-BITOPRO-APIKEY': this.apiKey,
232 | 'X-BITOPRO-PAYLOAD': payload,
233 | 'X-BITOPRO-SIGNATURE': signature,
234 | 'X-BITOPRO-API': this.sdk
235 | }
236 | }
237 |
238 | let res = await axios.get(url, options)
239 | return res.data
240 | }
241 |
242 | async getOrders (pair, active = true, page = 1) {
243 | assert(this.apiKey, 'Please provide api key')
244 | assert(this.apiSecret, 'Please provide api secret')
245 | assert(pair, 'Please provide pair')
246 |
247 | let url = this.baseUrl + '/orders/' + pair + '?active=' + active + '&page=' + page
248 | const nonce = Date.now()
249 | const body = { identity: this.email, nonce }
250 | const payload = Buffer.from(JSON.stringify(body)).toString('base64')
251 |
252 | const signature = crypto
253 | .createHmac('sha384', this.apiSecret)
254 | .update(payload)
255 | .digest('hex')
256 |
257 | const options = {
258 | headers: {
259 | 'X-BITOPRO-APIKEY': this.apiKey,
260 | 'X-BITOPRO-PAYLOAD': payload,
261 | 'X-BITOPRO-SIGNATURE': signature,
262 | 'X-BITOPRO-API': this.sdk
263 | }
264 | }
265 |
266 | let res = await axios.get(url, options)
267 | return res.data
268 | }
269 |
270 | async getOrder (pair, orderId) {
271 | assert(this.apiKey, 'Please provide api key')
272 | assert(this.apiSecret, 'Please provide api secret')
273 | assert(pair, 'Please provide pair')
274 | assert(orderId, 'Please provide order id')
275 | let url = this.baseUrl + `/orders/${pair}/${orderId}`
276 |
277 | const nonce = Date.now()
278 | const body = { identity: this.email, nonce }
279 | const payload = Buffer.from(JSON.stringify(body)).toString('base64')
280 |
281 | const signature = crypto
282 | .createHmac('sha384', this.apiSecret)
283 | .update(payload)
284 | .digest('hex')
285 |
286 | const options = {
287 | headers: {
288 | 'X-BITOPRO-APIKEY': this.apiKey,
289 | 'X-BITOPRO-PAYLOAD': payload,
290 | 'X-BITOPRO-SIGNATURE': signature,
291 | 'X-BITOPRO-API': this.sdk
292 | }
293 | }
294 |
295 | let res = await axios.get(url, options)
296 | return res.data
297 | }
298 |
299 | async createOrder (order) {
300 | assert(this.apiKey, 'Please provide api key')
301 | assert(this.apiSecret, 'Please provide api secret')
302 | assert(order.action, 'Please provide action field(side)')
303 | assert(order.amount, 'Please provide amount')
304 | assert(order.pair, 'Please provide pair')
305 | assert(order.price, 'Please provide price')
306 | assert(order.timestamp, 'Please provide timestamp')
307 | assert(this.orderSides.includes(order.action.toLowerCase()), 'Parameter `side` must be buy or sell')
308 | assert(order.type, 'Please provide type')
309 | assert(this.orderTypes.includes(order.type.toLowerCase()), 'Parameter `type` must be market or limit')
310 |
311 | let url = this.baseUrl + '/orders/' + order.pair
312 |
313 | const payload = Buffer.from(JSON.stringify(order)).toString('base64')
314 |
315 | const signature = crypto
316 | .createHmac('sha384', this.apiSecret)
317 | .update(payload)
318 | .digest('hex')
319 |
320 | const options = {
321 | headers: {
322 | 'X-BITOPRO-APIKEY': this.apiKey,
323 | 'X-BITOPRO-PAYLOAD': payload,
324 | 'X-BITOPRO-SIGNATURE': signature,
325 | 'X-BITOPRO-API': this.sdk
326 | }
327 | }
328 |
329 | let res = await axios.post(url, order, options)
330 | return res.data
331 | }
332 |
333 | async cancelOrder (pair, id) {
334 | assert(this.apiKey, 'Please provide api key')
335 | assert(this.apiSecret, 'Please provide api secret')
336 | assert(pair, 'Please provide pair')
337 | assert(id, 'Please provide order id')
338 |
339 | const nonce = Date.now()
340 | let url = this.baseUrl + '/orders/' + pair + '/' + id
341 | const body = { identity: this.email, nonce }
342 | const payload = Buffer.from(JSON.stringify(body)).toString('base64')
343 |
344 | const signature = crypto
345 | .createHmac('sha384', this.apiSecret)
346 | .update(payload)
347 | .digest('hex')
348 |
349 | const options = {
350 | headers: {
351 | 'X-BITOPRO-APIKEY': this.apiKey,
352 | 'X-BITOPRO-PAYLOAD': payload,
353 | 'X-BITOPRO-SIGNATURE': signature,
354 | 'X-BITOPRO-API': this.sdk
355 | },
356 | data: body
357 | }
358 | let res = await axios.delete(url, options)
359 | return res.data
360 | }
361 | }
362 |
363 | module.exports = BitoPro
364 |
--------------------------------------------------------------------------------
/src/order_status/index.js:
--------------------------------------------------------------------------------
1 | let ORDER_STATUS = {
2 | NEW: 0,
3 | WAIT: 1,
4 | COMPLETE: 2,
5 | PARTIAL: 3,
6 | CANCEL: 4
7 | }
8 |
9 | module.exports = ORDER_STATUS
10 |
--------------------------------------------------------------------------------