├── .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 | [![npm version](https://badge.fury.io/js/bitopro-api-node.svg)](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 | --------------------------------------------------------------------------------