├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── package-lock.json ├── package.json ├── src ├── config.ts ├── entities │ ├── Asset.ts │ ├── AssetPair.ts │ ├── Candle.ts │ ├── Money.ts │ └── OrderPrice.ts ├── index.ts └── utils.ts ├── test ├── assetData.ts ├── classes │ ├── Asset.spec.ts │ ├── AssetPair.spec.ts │ ├── Money.spec.ts │ └── OrderPrice.spec.ts └── tsconfig.json └── tsconfig.json /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: bug 6 | assignees: jahsus-waves 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. Debian/Ubuntu/iOS] 28 | - Browser/JVM [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Additional context** 32 | Add any other context about the problem here. 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: "[FEATURE]" 5 | labels: feature 6 | assignees: jahsus-waves 7 | 8 | --- 9 | 10 | **Аbstract** 11 | Is your feature request related to a problem? Please describe. 12 | 13 | **Motivation and Purposes** 14 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]. 15 | 16 | ** Specification** 17 | A clear and concise description of what you want to happen. Describe alternatives you've considered 18 | 19 | **Backwards Compatibility** 20 | Can your proposition affect any existing features? 21 | 22 | **Examples and Implementation** 23 | Examples of implementation in other projects? 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .vscode 3 | .history 4 | 5 | dist/ 6 | tmp/ 7 | 8 | yarn-error.log 9 | node_modules 10 | **/*.js 11 | **/*.js.map 12 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@waves/data-entities", 3 | "version": "2.0.7", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/chai": { 8 | "version": "4.1.7", 9 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", 10 | "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==", 11 | "dev": true 12 | }, 13 | "@types/mocha": { 14 | "version": "5.2.5", 15 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", 16 | "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", 17 | "dev": true 18 | }, 19 | "@waves/bignumber": { 20 | "version": "1.1.1", 21 | "resolved": "https://registry.npmjs.org/@waves/bignumber/-/bignumber-1.1.1.tgz", 22 | "integrity": "sha512-WUY0R0y0Rd92nbyQHbIFDXCWh2YMtf5FYtpoTv4yRomM75cRLJ0/NIQ828guUXLKeVytKzWgvDYj1CZfxatDkg==", 23 | "requires": { 24 | "bignumber.js": "^9.0.1" 25 | } 26 | }, 27 | "JSONStream": { 28 | "version": "1.3.5", 29 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", 30 | "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", 31 | "dev": true, 32 | "requires": { 33 | "jsonparse": "^1.2.0", 34 | "through": ">=2.2.7 <3" 35 | } 36 | }, 37 | "acorn": { 38 | "version": "6.4.1", 39 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", 40 | "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", 41 | "dev": true 42 | }, 43 | "acorn-dynamic-import": { 44 | "version": "4.0.0", 45 | "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", 46 | "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", 47 | "dev": true 48 | }, 49 | "acorn-node": { 50 | "version": "1.6.2", 51 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.2.tgz", 52 | "integrity": "sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==", 53 | "dev": true, 54 | "requires": { 55 | "acorn": "^6.0.2", 56 | "acorn-dynamic-import": "^4.0.0", 57 | "acorn-walk": "^6.1.0", 58 | "xtend": "^4.0.1" 59 | } 60 | }, 61 | "acorn-walk": { 62 | "version": "6.1.1", 63 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", 64 | "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", 65 | "dev": true 66 | }, 67 | "array-filter": { 68 | "version": "0.0.1", 69 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", 70 | "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", 71 | "dev": true 72 | }, 73 | "array-map": { 74 | "version": "0.0.0", 75 | "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", 76 | "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", 77 | "dev": true 78 | }, 79 | "array-reduce": { 80 | "version": "0.0.0", 81 | "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", 82 | "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", 83 | "dev": true 84 | }, 85 | "asn1.js": { 86 | "version": "4.10.1", 87 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", 88 | "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", 89 | "dev": true, 90 | "requires": { 91 | "bn.js": "^4.0.0", 92 | "inherits": "^2.0.1", 93 | "minimalistic-assert": "^1.0.0" 94 | } 95 | }, 96 | "assert": { 97 | "version": "1.4.1", 98 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", 99 | "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", 100 | "dev": true, 101 | "requires": { 102 | "util": "0.10.3" 103 | }, 104 | "dependencies": { 105 | "inherits": { 106 | "version": "2.0.1", 107 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 108 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 109 | "dev": true 110 | }, 111 | "util": { 112 | "version": "0.10.3", 113 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 114 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 115 | "dev": true, 116 | "requires": { 117 | "inherits": "2.0.1" 118 | } 119 | } 120 | } 121 | }, 122 | "assertion-error": { 123 | "version": "1.1.0", 124 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 125 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 126 | "dev": true 127 | }, 128 | "balanced-match": { 129 | "version": "1.0.0", 130 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 131 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 132 | "dev": true 133 | }, 134 | "base64-js": { 135 | "version": "1.3.0", 136 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", 137 | "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", 138 | "dev": true 139 | }, 140 | "bignumber.js": { 141 | "version": "9.0.1", 142 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", 143 | "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" 144 | }, 145 | "bn.js": { 146 | "version": "4.11.8", 147 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", 148 | "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", 149 | "dev": true 150 | }, 151 | "brace-expansion": { 152 | "version": "1.1.11", 153 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 154 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 155 | "dev": true, 156 | "requires": { 157 | "balanced-match": "^1.0.0", 158 | "concat-map": "0.0.1" 159 | } 160 | }, 161 | "brorand": { 162 | "version": "1.1.0", 163 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 164 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", 165 | "dev": true 166 | }, 167 | "browser-pack": { 168 | "version": "6.1.0", 169 | "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", 170 | "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", 171 | "dev": true, 172 | "requires": { 173 | "JSONStream": "^1.0.3", 174 | "combine-source-map": "~0.8.0", 175 | "defined": "^1.0.0", 176 | "safe-buffer": "^5.1.1", 177 | "through2": "^2.0.0", 178 | "umd": "^3.0.0" 179 | } 180 | }, 181 | "browser-resolve": { 182 | "version": "1.11.3", 183 | "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", 184 | "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", 185 | "dev": true, 186 | "requires": { 187 | "resolve": "1.1.7" 188 | }, 189 | "dependencies": { 190 | "resolve": { 191 | "version": "1.1.7", 192 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 193 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 194 | "dev": true 195 | } 196 | } 197 | }, 198 | "browser-stdout": { 199 | "version": "1.3.1", 200 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 201 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 202 | "dev": true 203 | }, 204 | "browserify": { 205 | "version": "16.2.3", 206 | "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", 207 | "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", 208 | "dev": true, 209 | "requires": { 210 | "JSONStream": "^1.0.3", 211 | "assert": "^1.4.0", 212 | "browser-pack": "^6.0.1", 213 | "browser-resolve": "^1.11.0", 214 | "browserify-zlib": "~0.2.0", 215 | "buffer": "^5.0.2", 216 | "cached-path-relative": "^1.0.0", 217 | "concat-stream": "^1.6.0", 218 | "console-browserify": "^1.1.0", 219 | "constants-browserify": "~1.0.0", 220 | "crypto-browserify": "^3.0.0", 221 | "defined": "^1.0.0", 222 | "deps-sort": "^2.0.0", 223 | "domain-browser": "^1.2.0", 224 | "duplexer2": "~0.1.2", 225 | "events": "^2.0.0", 226 | "glob": "^7.1.0", 227 | "has": "^1.0.0", 228 | "htmlescape": "^1.1.0", 229 | "https-browserify": "^1.0.0", 230 | "inherits": "~2.0.1", 231 | "insert-module-globals": "^7.0.0", 232 | "labeled-stream-splicer": "^2.0.0", 233 | "mkdirp": "^0.5.0", 234 | "module-deps": "^6.0.0", 235 | "os-browserify": "~0.3.0", 236 | "parents": "^1.0.1", 237 | "path-browserify": "~0.0.0", 238 | "process": "~0.11.0", 239 | "punycode": "^1.3.2", 240 | "querystring-es3": "~0.2.0", 241 | "read-only-stream": "^2.0.0", 242 | "readable-stream": "^2.0.2", 243 | "resolve": "^1.1.4", 244 | "shasum": "^1.0.0", 245 | "shell-quote": "^1.6.1", 246 | "stream-browserify": "^2.0.0", 247 | "stream-http": "^2.0.0", 248 | "string_decoder": "^1.1.1", 249 | "subarg": "^1.0.0", 250 | "syntax-error": "^1.1.1", 251 | "through2": "^2.0.0", 252 | "timers-browserify": "^1.0.1", 253 | "tty-browserify": "0.0.1", 254 | "url": "~0.11.0", 255 | "util": "~0.10.1", 256 | "vm-browserify": "^1.0.0", 257 | "xtend": "^4.0.0" 258 | } 259 | }, 260 | "browserify-aes": { 261 | "version": "1.2.0", 262 | "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 263 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 264 | "dev": true, 265 | "requires": { 266 | "buffer-xor": "^1.0.3", 267 | "cipher-base": "^1.0.0", 268 | "create-hash": "^1.1.0", 269 | "evp_bytestokey": "^1.0.3", 270 | "inherits": "^2.0.1", 271 | "safe-buffer": "^5.0.1" 272 | } 273 | }, 274 | "browserify-cipher": { 275 | "version": "1.0.1", 276 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 277 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 278 | "dev": true, 279 | "requires": { 280 | "browserify-aes": "^1.0.4", 281 | "browserify-des": "^1.0.0", 282 | "evp_bytestokey": "^1.0.0" 283 | } 284 | }, 285 | "browserify-des": { 286 | "version": "1.0.2", 287 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 288 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 289 | "dev": true, 290 | "requires": { 291 | "cipher-base": "^1.0.1", 292 | "des.js": "^1.0.0", 293 | "inherits": "^2.0.1", 294 | "safe-buffer": "^5.1.2" 295 | } 296 | }, 297 | "browserify-rsa": { 298 | "version": "4.0.1", 299 | "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", 300 | "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", 301 | "dev": true, 302 | "requires": { 303 | "bn.js": "^4.1.0", 304 | "randombytes": "^2.0.1" 305 | } 306 | }, 307 | "browserify-sign": { 308 | "version": "4.0.4", 309 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", 310 | "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", 311 | "dev": true, 312 | "requires": { 313 | "bn.js": "^4.1.1", 314 | "browserify-rsa": "^4.0.0", 315 | "create-hash": "^1.1.0", 316 | "create-hmac": "^1.1.2", 317 | "elliptic": "^6.0.0", 318 | "inherits": "^2.0.1", 319 | "parse-asn1": "^5.0.0" 320 | } 321 | }, 322 | "browserify-zlib": { 323 | "version": "0.2.0", 324 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", 325 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", 326 | "dev": true, 327 | "requires": { 328 | "pako": "~1.0.5" 329 | } 330 | }, 331 | "buffer": { 332 | "version": "5.2.1", 333 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", 334 | "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", 335 | "dev": true, 336 | "requires": { 337 | "base64-js": "^1.0.2", 338 | "ieee754": "^1.1.4" 339 | } 340 | }, 341 | "buffer-from": { 342 | "version": "1.1.1", 343 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 344 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 345 | "dev": true 346 | }, 347 | "buffer-xor": { 348 | "version": "1.0.3", 349 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 350 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", 351 | "dev": true 352 | }, 353 | "builtin-status-codes": { 354 | "version": "3.0.0", 355 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 356 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", 357 | "dev": true 358 | }, 359 | "cached-path-relative": { 360 | "version": "1.0.2", 361 | "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", 362 | "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", 363 | "dev": true 364 | }, 365 | "chai": { 366 | "version": "4.2.0", 367 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", 368 | "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", 369 | "dev": true, 370 | "requires": { 371 | "assertion-error": "^1.1.0", 372 | "check-error": "^1.0.2", 373 | "deep-eql": "^3.0.1", 374 | "get-func-name": "^2.0.0", 375 | "pathval": "^1.1.0", 376 | "type-detect": "^4.0.5" 377 | } 378 | }, 379 | "check-error": { 380 | "version": "1.0.2", 381 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 382 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 383 | "dev": true 384 | }, 385 | "cipher-base": { 386 | "version": "1.0.4", 387 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 388 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 389 | "dev": true, 390 | "requires": { 391 | "inherits": "^2.0.1", 392 | "safe-buffer": "^5.0.1" 393 | } 394 | }, 395 | "combine-source-map": { 396 | "version": "0.8.0", 397 | "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", 398 | "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", 399 | "dev": true, 400 | "requires": { 401 | "convert-source-map": "~1.1.0", 402 | "inline-source-map": "~0.6.0", 403 | "lodash.memoize": "~3.0.3", 404 | "source-map": "~0.5.3" 405 | } 406 | }, 407 | "commander": { 408 | "version": "2.15.1", 409 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", 410 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", 411 | "dev": true 412 | }, 413 | "concat-map": { 414 | "version": "0.0.1", 415 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 416 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 417 | "dev": true 418 | }, 419 | "concat-stream": { 420 | "version": "1.6.2", 421 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 422 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 423 | "dev": true, 424 | "requires": { 425 | "buffer-from": "^1.0.0", 426 | "inherits": "^2.0.3", 427 | "readable-stream": "^2.2.2", 428 | "typedarray": "^0.0.6" 429 | } 430 | }, 431 | "console-browserify": { 432 | "version": "1.1.0", 433 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", 434 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", 435 | "dev": true, 436 | "requires": { 437 | "date-now": "^0.1.4" 438 | } 439 | }, 440 | "constants-browserify": { 441 | "version": "1.0.0", 442 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 443 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", 444 | "dev": true 445 | }, 446 | "convert-source-map": { 447 | "version": "1.1.3", 448 | "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", 449 | "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", 450 | "dev": true 451 | }, 452 | "core-util-is": { 453 | "version": "1.0.2", 454 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 455 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 456 | "dev": true 457 | }, 458 | "create-ecdh": { 459 | "version": "4.0.3", 460 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", 461 | "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", 462 | "dev": true, 463 | "requires": { 464 | "bn.js": "^4.1.0", 465 | "elliptic": "^6.0.0" 466 | } 467 | }, 468 | "create-hash": { 469 | "version": "1.2.0", 470 | "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 471 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 472 | "dev": true, 473 | "requires": { 474 | "cipher-base": "^1.0.1", 475 | "inherits": "^2.0.1", 476 | "md5.js": "^1.3.4", 477 | "ripemd160": "^2.0.1", 478 | "sha.js": "^2.4.0" 479 | } 480 | }, 481 | "create-hmac": { 482 | "version": "1.1.7", 483 | "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 484 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 485 | "dev": true, 486 | "requires": { 487 | "cipher-base": "^1.0.3", 488 | "create-hash": "^1.1.0", 489 | "inherits": "^2.0.1", 490 | "ripemd160": "^2.0.0", 491 | "safe-buffer": "^5.0.1", 492 | "sha.js": "^2.4.8" 493 | } 494 | }, 495 | "crypto-browserify": { 496 | "version": "3.12.0", 497 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 498 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 499 | "dev": true, 500 | "requires": { 501 | "browserify-cipher": "^1.0.0", 502 | "browserify-sign": "^4.0.0", 503 | "create-ecdh": "^4.0.0", 504 | "create-hash": "^1.1.0", 505 | "create-hmac": "^1.1.0", 506 | "diffie-hellman": "^5.0.0", 507 | "inherits": "^2.0.1", 508 | "pbkdf2": "^3.0.3", 509 | "public-encrypt": "^4.0.0", 510 | "randombytes": "^2.0.0", 511 | "randomfill": "^1.0.3" 512 | } 513 | }, 514 | "date-now": { 515 | "version": "0.1.4", 516 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", 517 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", 518 | "dev": true 519 | }, 520 | "debug": { 521 | "version": "3.1.0", 522 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 523 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 524 | "dev": true, 525 | "requires": { 526 | "ms": "2.0.0" 527 | } 528 | }, 529 | "deep-eql": { 530 | "version": "3.0.1", 531 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 532 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 533 | "dev": true, 534 | "requires": { 535 | "type-detect": "^4.0.0" 536 | } 537 | }, 538 | "defined": { 539 | "version": "1.0.0", 540 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 541 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 542 | "dev": true 543 | }, 544 | "deps-sort": { 545 | "version": "2.0.0", 546 | "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", 547 | "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", 548 | "dev": true, 549 | "requires": { 550 | "JSONStream": "^1.0.3", 551 | "shasum": "^1.0.0", 552 | "subarg": "^1.0.0", 553 | "through2": "^2.0.0" 554 | } 555 | }, 556 | "des.js": { 557 | "version": "1.0.0", 558 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", 559 | "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", 560 | "dev": true, 561 | "requires": { 562 | "inherits": "^2.0.1", 563 | "minimalistic-assert": "^1.0.0" 564 | } 565 | }, 566 | "detective": { 567 | "version": "5.1.0", 568 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", 569 | "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", 570 | "dev": true, 571 | "requires": { 572 | "acorn-node": "^1.3.0", 573 | "defined": "^1.0.0", 574 | "minimist": "^1.1.1" 575 | } 576 | }, 577 | "diff": { 578 | "version": "3.5.0", 579 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 580 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 581 | "dev": true 582 | }, 583 | "diffie-hellman": { 584 | "version": "5.0.3", 585 | "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 586 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 587 | "dev": true, 588 | "requires": { 589 | "bn.js": "^4.1.0", 590 | "miller-rabin": "^4.0.0", 591 | "randombytes": "^2.0.0" 592 | } 593 | }, 594 | "domain-browser": { 595 | "version": "1.2.0", 596 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", 597 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", 598 | "dev": true 599 | }, 600 | "duplexer2": { 601 | "version": "0.1.4", 602 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 603 | "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", 604 | "dev": true, 605 | "requires": { 606 | "readable-stream": "^2.0.2" 607 | } 608 | }, 609 | "elliptic": { 610 | "version": "6.4.1", 611 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", 612 | "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", 613 | "dev": true, 614 | "requires": { 615 | "bn.js": "^4.4.0", 616 | "brorand": "^1.0.1", 617 | "hash.js": "^1.0.0", 618 | "hmac-drbg": "^1.0.0", 619 | "inherits": "^2.0.1", 620 | "minimalistic-assert": "^1.0.0", 621 | "minimalistic-crypto-utils": "^1.0.0" 622 | } 623 | }, 624 | "escape-string-regexp": { 625 | "version": "1.0.5", 626 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 627 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 628 | "dev": true 629 | }, 630 | "events": { 631 | "version": "2.1.0", 632 | "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", 633 | "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", 634 | "dev": true 635 | }, 636 | "evp_bytestokey": { 637 | "version": "1.0.3", 638 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 639 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 640 | "dev": true, 641 | "requires": { 642 | "md5.js": "^1.3.4", 643 | "safe-buffer": "^5.1.1" 644 | } 645 | }, 646 | "fs.realpath": { 647 | "version": "1.0.0", 648 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 649 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 650 | "dev": true 651 | }, 652 | "function-bind": { 653 | "version": "1.1.1", 654 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 655 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 656 | "dev": true 657 | }, 658 | "get-assigned-identifiers": { 659 | "version": "1.2.0", 660 | "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", 661 | "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", 662 | "dev": true 663 | }, 664 | "get-func-name": { 665 | "version": "2.0.0", 666 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 667 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 668 | "dev": true 669 | }, 670 | "glob": { 671 | "version": "7.1.3", 672 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 673 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 674 | "dev": true, 675 | "requires": { 676 | "fs.realpath": "^1.0.0", 677 | "inflight": "^1.0.4", 678 | "inherits": "2", 679 | "minimatch": "^3.0.4", 680 | "once": "^1.3.0", 681 | "path-is-absolute": "^1.0.0" 682 | } 683 | }, 684 | "growl": { 685 | "version": "1.10.5", 686 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 687 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 688 | "dev": true 689 | }, 690 | "has": { 691 | "version": "1.0.3", 692 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 693 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 694 | "dev": true, 695 | "requires": { 696 | "function-bind": "^1.1.1" 697 | } 698 | }, 699 | "has-flag": { 700 | "version": "3.0.0", 701 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 702 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 703 | "dev": true 704 | }, 705 | "hash-base": { 706 | "version": "3.0.4", 707 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", 708 | "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", 709 | "dev": true, 710 | "requires": { 711 | "inherits": "^2.0.1", 712 | "safe-buffer": "^5.0.1" 713 | } 714 | }, 715 | "hash.js": { 716 | "version": "1.1.5", 717 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", 718 | "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", 719 | "dev": true, 720 | "requires": { 721 | "inherits": "^2.0.3", 722 | "minimalistic-assert": "^1.0.1" 723 | } 724 | }, 725 | "he": { 726 | "version": "1.1.1", 727 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 728 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 729 | "dev": true 730 | }, 731 | "hmac-drbg": { 732 | "version": "1.0.1", 733 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 734 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 735 | "dev": true, 736 | "requires": { 737 | "hash.js": "^1.0.3", 738 | "minimalistic-assert": "^1.0.0", 739 | "minimalistic-crypto-utils": "^1.0.1" 740 | } 741 | }, 742 | "htmlescape": { 743 | "version": "1.1.1", 744 | "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", 745 | "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", 746 | "dev": true 747 | }, 748 | "https-browserify": { 749 | "version": "1.0.0", 750 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", 751 | "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", 752 | "dev": true 753 | }, 754 | "ieee754": { 755 | "version": "1.1.12", 756 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", 757 | "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", 758 | "dev": true 759 | }, 760 | "inflight": { 761 | "version": "1.0.6", 762 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 763 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 764 | "dev": true, 765 | "requires": { 766 | "once": "^1.3.0", 767 | "wrappy": "1" 768 | } 769 | }, 770 | "inherits": { 771 | "version": "2.0.3", 772 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 773 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 774 | "dev": true 775 | }, 776 | "inline-source-map": { 777 | "version": "0.6.2", 778 | "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", 779 | "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", 780 | "dev": true, 781 | "requires": { 782 | "source-map": "~0.5.3" 783 | } 784 | }, 785 | "insert-module-globals": { 786 | "version": "7.2.0", 787 | "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", 788 | "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", 789 | "dev": true, 790 | "requires": { 791 | "JSONStream": "^1.0.3", 792 | "acorn-node": "^1.5.2", 793 | "combine-source-map": "^0.8.0", 794 | "concat-stream": "^1.6.1", 795 | "is-buffer": "^1.1.0", 796 | "path-is-absolute": "^1.0.1", 797 | "process": "~0.11.0", 798 | "through2": "^2.0.0", 799 | "undeclared-identifiers": "^1.1.2", 800 | "xtend": "^4.0.0" 801 | } 802 | }, 803 | "is-buffer": { 804 | "version": "1.1.6", 805 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 806 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 807 | "dev": true 808 | }, 809 | "isarray": { 810 | "version": "1.0.0", 811 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 812 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 813 | "dev": true 814 | }, 815 | "json-stable-stringify": { 816 | "version": "0.0.1", 817 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", 818 | "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", 819 | "dev": true, 820 | "requires": { 821 | "jsonify": "~0.0.0" 822 | } 823 | }, 824 | "jsonify": { 825 | "version": "0.0.0", 826 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 827 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 828 | "dev": true 829 | }, 830 | "jsonparse": { 831 | "version": "1.3.1", 832 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 833 | "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", 834 | "dev": true 835 | }, 836 | "labeled-stream-splicer": { 837 | "version": "2.0.1", 838 | "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", 839 | "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", 840 | "dev": true, 841 | "requires": { 842 | "inherits": "^2.0.1", 843 | "isarray": "^2.0.4", 844 | "stream-splicer": "^2.0.0" 845 | }, 846 | "dependencies": { 847 | "isarray": { 848 | "version": "2.0.4", 849 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", 850 | "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==", 851 | "dev": true 852 | } 853 | } 854 | }, 855 | "lodash.memoize": { 856 | "version": "3.0.4", 857 | "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", 858 | "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", 859 | "dev": true 860 | }, 861 | "md5.js": { 862 | "version": "1.3.5", 863 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 864 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 865 | "dev": true, 866 | "requires": { 867 | "hash-base": "^3.0.0", 868 | "inherits": "^2.0.1", 869 | "safe-buffer": "^5.1.2" 870 | } 871 | }, 872 | "miller-rabin": { 873 | "version": "4.0.1", 874 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 875 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 876 | "dev": true, 877 | "requires": { 878 | "bn.js": "^4.0.0", 879 | "brorand": "^1.0.1" 880 | } 881 | }, 882 | "minimalistic-assert": { 883 | "version": "1.0.1", 884 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 885 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", 886 | "dev": true 887 | }, 888 | "minimalistic-crypto-utils": { 889 | "version": "1.0.1", 890 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 891 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", 892 | "dev": true 893 | }, 894 | "minimatch": { 895 | "version": "3.0.4", 896 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 897 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 898 | "dev": true, 899 | "requires": { 900 | "brace-expansion": "^1.1.7" 901 | } 902 | }, 903 | "minimist": { 904 | "version": "1.2.0", 905 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 906 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 907 | "dev": true 908 | }, 909 | "mkdirp": { 910 | "version": "0.5.1", 911 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 912 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 913 | "dev": true, 914 | "requires": { 915 | "minimist": "0.0.8" 916 | }, 917 | "dependencies": { 918 | "minimist": { 919 | "version": "0.0.8", 920 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 921 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 922 | "dev": true 923 | } 924 | } 925 | }, 926 | "mocha": { 927 | "version": "5.2.0", 928 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", 929 | "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", 930 | "dev": true, 931 | "requires": { 932 | "browser-stdout": "1.3.1", 933 | "commander": "2.15.1", 934 | "debug": "3.1.0", 935 | "diff": "3.5.0", 936 | "escape-string-regexp": "1.0.5", 937 | "glob": "7.1.2", 938 | "growl": "1.10.5", 939 | "he": "1.1.1", 940 | "minimatch": "3.0.4", 941 | "mkdirp": "0.5.1", 942 | "supports-color": "5.4.0" 943 | }, 944 | "dependencies": { 945 | "glob": { 946 | "version": "7.1.2", 947 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 948 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 949 | "dev": true, 950 | "requires": { 951 | "fs.realpath": "^1.0.0", 952 | "inflight": "^1.0.4", 953 | "inherits": "2", 954 | "minimatch": "^3.0.4", 955 | "once": "^1.3.0", 956 | "path-is-absolute": "^1.0.0" 957 | } 958 | } 959 | } 960 | }, 961 | "module-deps": { 962 | "version": "6.2.0", 963 | "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz", 964 | "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==", 965 | "dev": true, 966 | "requires": { 967 | "JSONStream": "^1.0.3", 968 | "browser-resolve": "^1.7.0", 969 | "cached-path-relative": "^1.0.0", 970 | "concat-stream": "~1.6.0", 971 | "defined": "^1.0.0", 972 | "detective": "^5.0.2", 973 | "duplexer2": "^0.1.2", 974 | "inherits": "^2.0.1", 975 | "parents": "^1.0.0", 976 | "readable-stream": "^2.0.2", 977 | "resolve": "^1.4.0", 978 | "stream-combiner2": "^1.1.1", 979 | "subarg": "^1.0.0", 980 | "through2": "^2.0.0", 981 | "xtend": "^4.0.0" 982 | } 983 | }, 984 | "ms": { 985 | "version": "2.0.0", 986 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 987 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 988 | "dev": true 989 | }, 990 | "once": { 991 | "version": "1.4.0", 992 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 993 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 994 | "dev": true, 995 | "requires": { 996 | "wrappy": "1" 997 | } 998 | }, 999 | "os-browserify": { 1000 | "version": "0.3.0", 1001 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", 1002 | "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", 1003 | "dev": true 1004 | }, 1005 | "pako": { 1006 | "version": "1.0.6", 1007 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", 1008 | "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", 1009 | "dev": true 1010 | }, 1011 | "parents": { 1012 | "version": "1.0.1", 1013 | "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", 1014 | "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", 1015 | "dev": true, 1016 | "requires": { 1017 | "path-platform": "~0.11.15" 1018 | } 1019 | }, 1020 | "parse-asn1": { 1021 | "version": "5.1.1", 1022 | "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", 1023 | "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", 1024 | "dev": true, 1025 | "requires": { 1026 | "asn1.js": "^4.0.0", 1027 | "browserify-aes": "^1.0.0", 1028 | "create-hash": "^1.1.0", 1029 | "evp_bytestokey": "^1.0.0", 1030 | "pbkdf2": "^3.0.3" 1031 | } 1032 | }, 1033 | "path-browserify": { 1034 | "version": "0.0.1", 1035 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", 1036 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", 1037 | "dev": true 1038 | }, 1039 | "path-is-absolute": { 1040 | "version": "1.0.1", 1041 | "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1042 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1043 | "dev": true 1044 | }, 1045 | "path-parse": { 1046 | "version": "1.0.6", 1047 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1048 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1049 | "dev": true 1050 | }, 1051 | "path-platform": { 1052 | "version": "0.11.15", 1053 | "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", 1054 | "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", 1055 | "dev": true 1056 | }, 1057 | "pathval": { 1058 | "version": "1.1.0", 1059 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 1060 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 1061 | "dev": true 1062 | }, 1063 | "pbkdf2": { 1064 | "version": "3.0.17", 1065 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", 1066 | "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", 1067 | "dev": true, 1068 | "requires": { 1069 | "create-hash": "^1.1.2", 1070 | "create-hmac": "^1.1.4", 1071 | "ripemd160": "^2.0.1", 1072 | "safe-buffer": "^5.0.1", 1073 | "sha.js": "^2.4.8" 1074 | } 1075 | }, 1076 | "process": { 1077 | "version": "0.11.10", 1078 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 1079 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 1080 | "dev": true 1081 | }, 1082 | "process-nextick-args": { 1083 | "version": "2.0.0", 1084 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1085 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 1086 | "dev": true 1087 | }, 1088 | "public-encrypt": { 1089 | "version": "4.0.3", 1090 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 1091 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 1092 | "dev": true, 1093 | "requires": { 1094 | "bn.js": "^4.1.0", 1095 | "browserify-rsa": "^4.0.0", 1096 | "create-hash": "^1.1.0", 1097 | "parse-asn1": "^5.0.0", 1098 | "randombytes": "^2.0.1", 1099 | "safe-buffer": "^5.1.2" 1100 | } 1101 | }, 1102 | "punycode": { 1103 | "version": "1.4.1", 1104 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1105 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 1106 | "dev": true 1107 | }, 1108 | "querystring": { 1109 | "version": "0.2.0", 1110 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 1111 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 1112 | "dev": true 1113 | }, 1114 | "querystring-es3": { 1115 | "version": "0.2.1", 1116 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 1117 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", 1118 | "dev": true 1119 | }, 1120 | "randombytes": { 1121 | "version": "2.0.6", 1122 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", 1123 | "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", 1124 | "dev": true, 1125 | "requires": { 1126 | "safe-buffer": "^5.1.0" 1127 | } 1128 | }, 1129 | "randomfill": { 1130 | "version": "1.0.4", 1131 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 1132 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 1133 | "dev": true, 1134 | "requires": { 1135 | "randombytes": "^2.0.5", 1136 | "safe-buffer": "^5.1.0" 1137 | } 1138 | }, 1139 | "read-only-stream": { 1140 | "version": "2.0.0", 1141 | "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", 1142 | "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", 1143 | "dev": true, 1144 | "requires": { 1145 | "readable-stream": "^2.0.2" 1146 | } 1147 | }, 1148 | "readable-stream": { 1149 | "version": "2.3.6", 1150 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1151 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1152 | "dev": true, 1153 | "requires": { 1154 | "core-util-is": "~1.0.0", 1155 | "inherits": "~2.0.3", 1156 | "isarray": "~1.0.0", 1157 | "process-nextick-args": "~2.0.0", 1158 | "safe-buffer": "~5.1.1", 1159 | "string_decoder": "~1.1.1", 1160 | "util-deprecate": "~1.0.1" 1161 | }, 1162 | "dependencies": { 1163 | "string_decoder": { 1164 | "version": "1.1.1", 1165 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1166 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1167 | "dev": true, 1168 | "requires": { 1169 | "safe-buffer": "~5.1.0" 1170 | } 1171 | } 1172 | } 1173 | }, 1174 | "resolve": { 1175 | "version": "1.8.1", 1176 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", 1177 | "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", 1178 | "dev": true, 1179 | "requires": { 1180 | "path-parse": "^1.0.5" 1181 | } 1182 | }, 1183 | "ripemd160": { 1184 | "version": "2.0.2", 1185 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 1186 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 1187 | "dev": true, 1188 | "requires": { 1189 | "hash-base": "^3.0.0", 1190 | "inherits": "^2.0.1" 1191 | } 1192 | }, 1193 | "safe-buffer": { 1194 | "version": "5.1.2", 1195 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1196 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1197 | "dev": true 1198 | }, 1199 | "sha.js": { 1200 | "version": "2.4.11", 1201 | "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 1202 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 1203 | "dev": true, 1204 | "requires": { 1205 | "inherits": "^2.0.1", 1206 | "safe-buffer": "^5.0.1" 1207 | } 1208 | }, 1209 | "shasum": { 1210 | "version": "1.0.2", 1211 | "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", 1212 | "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", 1213 | "dev": true, 1214 | "requires": { 1215 | "json-stable-stringify": "~0.0.0", 1216 | "sha.js": "~2.4.4" 1217 | } 1218 | }, 1219 | "shell-quote": { 1220 | "version": "1.6.1", 1221 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", 1222 | "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", 1223 | "dev": true, 1224 | "requires": { 1225 | "array-filter": "~0.0.0", 1226 | "array-map": "~0.0.0", 1227 | "array-reduce": "~0.0.0", 1228 | "jsonify": "~0.0.0" 1229 | } 1230 | }, 1231 | "simple-concat": { 1232 | "version": "1.0.0", 1233 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 1234 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", 1235 | "dev": true 1236 | }, 1237 | "source-map": { 1238 | "version": "0.5.7", 1239 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1240 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1241 | "dev": true 1242 | }, 1243 | "stream-browserify": { 1244 | "version": "2.0.1", 1245 | "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", 1246 | "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", 1247 | "dev": true, 1248 | "requires": { 1249 | "inherits": "~2.0.1", 1250 | "readable-stream": "^2.0.2" 1251 | } 1252 | }, 1253 | "stream-combiner2": { 1254 | "version": "1.1.1", 1255 | "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", 1256 | "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", 1257 | "dev": true, 1258 | "requires": { 1259 | "duplexer2": "~0.1.0", 1260 | "readable-stream": "^2.0.2" 1261 | } 1262 | }, 1263 | "stream-http": { 1264 | "version": "2.8.3", 1265 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", 1266 | "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", 1267 | "dev": true, 1268 | "requires": { 1269 | "builtin-status-codes": "^3.0.0", 1270 | "inherits": "^2.0.1", 1271 | "readable-stream": "^2.3.6", 1272 | "to-arraybuffer": "^1.0.0", 1273 | "xtend": "^4.0.0" 1274 | } 1275 | }, 1276 | "stream-splicer": { 1277 | "version": "2.0.0", 1278 | "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", 1279 | "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", 1280 | "dev": true, 1281 | "requires": { 1282 | "inherits": "^2.0.1", 1283 | "readable-stream": "^2.0.2" 1284 | } 1285 | }, 1286 | "string_decoder": { 1287 | "version": "1.2.0", 1288 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", 1289 | "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", 1290 | "dev": true, 1291 | "requires": { 1292 | "safe-buffer": "~5.1.0" 1293 | } 1294 | }, 1295 | "subarg": { 1296 | "version": "1.0.0", 1297 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", 1298 | "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", 1299 | "dev": true, 1300 | "requires": { 1301 | "minimist": "^1.1.0" 1302 | } 1303 | }, 1304 | "supports-color": { 1305 | "version": "5.4.0", 1306 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 1307 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 1308 | "dev": true, 1309 | "requires": { 1310 | "has-flag": "^3.0.0" 1311 | } 1312 | }, 1313 | "syntax-error": { 1314 | "version": "1.4.0", 1315 | "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", 1316 | "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", 1317 | "dev": true, 1318 | "requires": { 1319 | "acorn-node": "^1.2.0" 1320 | } 1321 | }, 1322 | "through": { 1323 | "version": "2.3.8", 1324 | "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", 1325 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1326 | "dev": true 1327 | }, 1328 | "through2": { 1329 | "version": "2.0.5", 1330 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 1331 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 1332 | "dev": true, 1333 | "requires": { 1334 | "readable-stream": "~2.3.6", 1335 | "xtend": "~4.0.1" 1336 | } 1337 | }, 1338 | "timers-browserify": { 1339 | "version": "1.4.2", 1340 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", 1341 | "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", 1342 | "dev": true, 1343 | "requires": { 1344 | "process": "~0.11.0" 1345 | } 1346 | }, 1347 | "to-arraybuffer": { 1348 | "version": "1.0.1", 1349 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 1350 | "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", 1351 | "dev": true 1352 | }, 1353 | "tty-browserify": { 1354 | "version": "0.0.1", 1355 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", 1356 | "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", 1357 | "dev": true 1358 | }, 1359 | "type-detect": { 1360 | "version": "4.0.8", 1361 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 1362 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 1363 | "dev": true 1364 | }, 1365 | "typedarray": { 1366 | "version": "0.0.6", 1367 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1368 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1369 | "dev": true 1370 | }, 1371 | "typescript": { 1372 | "version": "3.1.6", 1373 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz", 1374 | "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==", 1375 | "dev": true 1376 | }, 1377 | "uglify-js": { 1378 | "version": "3.4.9", 1379 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", 1380 | "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", 1381 | "dev": true, 1382 | "requires": { 1383 | "commander": "~2.17.1", 1384 | "source-map": "~0.6.1" 1385 | }, 1386 | "dependencies": { 1387 | "commander": { 1388 | "version": "2.17.1", 1389 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", 1390 | "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", 1391 | "dev": true 1392 | }, 1393 | "source-map": { 1394 | "version": "0.6.1", 1395 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1396 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1397 | "dev": true 1398 | } 1399 | } 1400 | }, 1401 | "umd": { 1402 | "version": "3.0.3", 1403 | "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", 1404 | "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", 1405 | "dev": true 1406 | }, 1407 | "undeclared-identifiers": { 1408 | "version": "1.1.2", 1409 | "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz", 1410 | "integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==", 1411 | "dev": true, 1412 | "requires": { 1413 | "acorn-node": "^1.3.0", 1414 | "get-assigned-identifiers": "^1.2.0", 1415 | "simple-concat": "^1.0.0", 1416 | "xtend": "^4.0.1" 1417 | } 1418 | }, 1419 | "url": { 1420 | "version": "0.11.0", 1421 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 1422 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 1423 | "dev": true, 1424 | "requires": { 1425 | "punycode": "1.3.2", 1426 | "querystring": "0.2.0" 1427 | }, 1428 | "dependencies": { 1429 | "punycode": { 1430 | "version": "1.3.2", 1431 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 1432 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 1433 | "dev": true 1434 | } 1435 | } 1436 | }, 1437 | "util": { 1438 | "version": "0.10.4", 1439 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", 1440 | "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", 1441 | "dev": true, 1442 | "requires": { 1443 | "inherits": "2.0.3" 1444 | } 1445 | }, 1446 | "util-deprecate": { 1447 | "version": "1.0.2", 1448 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1449 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1450 | "dev": true 1451 | }, 1452 | "vm-browserify": { 1453 | "version": "1.1.0", 1454 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", 1455 | "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", 1456 | "dev": true 1457 | }, 1458 | "wrappy": { 1459 | "version": "1.0.2", 1460 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1461 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1462 | "dev": true 1463 | }, 1464 | "xtend": { 1465 | "version": "4.0.1", 1466 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 1467 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 1468 | "dev": true 1469 | } 1470 | } 1471 | } 1472 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@waves/data-entities", 3 | "description": "Waves data types", 4 | "version": "2.0.7", 5 | "license": "Apache-2.0", 6 | "private": false, 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/wavesplatform/waves-data-entities.git" 10 | }, 11 | "types": "./dist/index.d.ts", 12 | "main": "./dist/index.js", 13 | "files": [ 14 | "dist" 15 | ], 16 | "scripts": { 17 | "prepare": "tsc --declaration && npm run build && npm run uglify", 18 | "uglify": "node_modules/.bin/uglifyjs ./dist/data-entities.js -o ./dist/data-entities.min.js", 19 | "build": "./node_modules/.bin/browserify ./dist/index.js --node -s data-entities -u @waves/bignumber -o ./dist/data-entities.js", 20 | "prepublish": "npm test", 21 | "postversion": "npm publish && git push", 22 | "test": "./node_modules/.bin/tsc -p ./test/tsconfig.json && ./node_modules/.bin/mocha $(find ./tmp -name '*.spec.js')" 23 | }, 24 | "dependencies": { 25 | "@waves/bignumber": "^1.1.1" 26 | }, 27 | "devDependencies": { 28 | "@types/chai": "^4.1.5", 29 | "@types/mocha": "^5.2.5", 30 | "browserify": "^16.2.3", 31 | "chai": "^4.1.2", 32 | "mocha": "^5.2.0", 33 | "typescript": "^3.0.3", 34 | "uglify-js": "^3.4.9" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | import { IAssetInfo } from './entities/Asset'; 2 | import { ICandleInfo } from './entities/Candle'; 3 | 4 | 5 | const storage: IConfig = { 6 | remapAsset: (data: IAssetInfo) => data, 7 | remapCandle: (data: ICandleInfo) => data 8 | }; 9 | 10 | export namespace config { 11 | 12 | export function get(key: K): IConfig[K] { 13 | return storage[key]; 14 | } 15 | 16 | export function set(key: K, value?: IConfig[K]): void; 17 | export function set(key: Partial): void; 18 | 19 | export function set(key: K | Partial, value?: IConfig[K]): void { 20 | if (typeof key === 'string') { 21 | storage[key] = value; 22 | } else { 23 | Object.keys(key).forEach((configKey: K) => set(configKey, key[configKey])); 24 | } 25 | } 26 | 27 | } 28 | 29 | export interface IConfig { 30 | remapAsset: (asset: IAssetInfo) => IAssetInfo; 31 | remapCandle: (candle: ICandleInfo) => ICandleInfo; 32 | } 33 | -------------------------------------------------------------------------------- /src/entities/Asset.ts: -------------------------------------------------------------------------------- 1 | import { BigNumber } from '@waves/bignumber'; 2 | import { config } from '../config'; 3 | import { toBigNumber } from '../utils'; 4 | 5 | export interface IAssetInfo { 6 | readonly ticker?: string; 7 | readonly id: string; 8 | readonly name: string; 9 | readonly precision: number; 10 | readonly description: string; 11 | readonly height: number; 12 | readonly timestamp: Date; 13 | readonly sender: string; 14 | readonly quantity: BigNumber | string | number; 15 | readonly reissuable: boolean; 16 | readonly hasScript?: boolean; 17 | readonly minSponsoredFee?: BigNumber | string | number; 18 | } 19 | 20 | export interface IAssetJSON extends IAssetInfo { 21 | readonly quantity: BigNumber; 22 | readonly minSponsoredFee?: BigNumber 23 | } 24 | 25 | export class Asset { 26 | public readonly ticker: string | null; 27 | 28 | public readonly id: string; 29 | public readonly name: string; 30 | public readonly precision: number; 31 | public readonly description: string; 32 | 33 | public readonly height: number; 34 | public readonly timestamp: Date; 35 | public readonly sender: string; 36 | public readonly quantity: BigNumber; 37 | public readonly reissuable: boolean; 38 | public readonly hasScript: boolean; 39 | public readonly minSponsoredFee: BigNumber | null; 40 | 41 | public readonly displayName: string; 42 | 43 | constructor(assetObject: IAssetInfo) { 44 | 45 | assetObject = config.get('remapAsset')(assetObject); 46 | 47 | this.quantity = toBigNumber(assetObject.quantity); 48 | this.minSponsoredFee = toBigNumber(assetObject.minSponsoredFee); 49 | 50 | this.ticker = assetObject.ticker || null; 51 | 52 | this.id = assetObject.id; 53 | this.name = assetObject.name; 54 | this.precision = assetObject.precision; 55 | this.description = assetObject.description; 56 | this.height = assetObject.height; 57 | this.timestamp = assetObject.timestamp; 58 | this.sender = assetObject.sender; 59 | this.reissuable = assetObject.reissuable; 60 | this.hasScript = assetObject.hasScript || false; 61 | this.displayName = assetObject.ticker || assetObject.name; 62 | } 63 | 64 | public toJSON(): IAssetJSON { 65 | return { 66 | ticker: this.ticker, 67 | id: this.id, 68 | name: this.name, 69 | precision: this.precision, 70 | description: this.description, 71 | height: this.height, 72 | timestamp: this.timestamp, 73 | sender: this.sender, 74 | quantity: this.quantity, 75 | reissuable: this.reissuable, 76 | hasScript: this.hasScript, 77 | minSponsoredFee: this.minSponsoredFee 78 | }; 79 | } 80 | 81 | public toString(): string { 82 | return this.id; 83 | } 84 | 85 | public static isAsset(object: object): object is Asset { 86 | return object instanceof Asset; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /src/entities/AssetPair.ts: -------------------------------------------------------------------------------- 1 | import { Asset } from './Asset'; 2 | 3 | export interface IAssetPairJSON { 4 | amountAsset: string; 5 | priceAsset: string; 6 | } 7 | 8 | export class AssetPair { 9 | public readonly amountAsset: Asset; 10 | public readonly priceAsset: Asset; 11 | public readonly precisionDifference: number; 12 | 13 | constructor(amountAsset: Asset, priceAsset: Asset) { 14 | this.amountAsset = amountAsset; 15 | this.priceAsset = priceAsset; 16 | this.precisionDifference = 17 | this.priceAsset.precision - this.amountAsset.precision; 18 | } 19 | 20 | public toJSON(): IAssetPairJSON { 21 | return { 22 | amountAsset: this.amountAsset.id, 23 | priceAsset: this.priceAsset.id, 24 | }; 25 | } 26 | 27 | public toString() { 28 | return `${this.amountAsset}/${this.priceAsset}`; 29 | } 30 | 31 | public static isAssetPair(object: object): object is AssetPair { 32 | return object instanceof AssetPair; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/entities/Candle.ts: -------------------------------------------------------------------------------- 1 | import { BigNumber } from '@waves/bignumber'; 2 | import { config } from '../config'; 3 | import { toBigNumber } from '../utils'; 4 | 5 | export interface ICandleInfo { 6 | readonly time: Date; 7 | readonly open: BigNumber | string | number; 8 | readonly close: BigNumber | string | number; 9 | readonly high: BigNumber | string | number; 10 | readonly low: BigNumber | string | number; 11 | readonly volume: BigNumber | string | number; 12 | readonly quoteVolume: BigNumber | string | number; 13 | readonly weightedAveragePrice: BigNumber | string | number; 14 | readonly maxHeight: number; 15 | readonly txsCount: number; 16 | } 17 | 18 | export interface ICandleJSON extends ICandleInfo { 19 | readonly open: BigNumber; 20 | readonly close: BigNumber; 21 | readonly high: BigNumber; 22 | readonly low: BigNumber; 23 | readonly volume: BigNumber; 24 | readonly quoteVolume: BigNumber; 25 | readonly weightedAveragePrice: BigNumber; 26 | } 27 | 28 | export class Candle { 29 | public readonly time: Date; 30 | public readonly open: BigNumber; 31 | public readonly close: BigNumber; 32 | public readonly high: BigNumber; 33 | public readonly low: BigNumber; 34 | public readonly volume: BigNumber; 35 | public readonly quoteVolume: BigNumber; 36 | public readonly weightedAveragePrice: BigNumber; 37 | public readonly maxHeight: number; 38 | public readonly txsCount: number; 39 | 40 | constructor(candleObject: ICandleInfo) { 41 | candleObject = config.get('remapCandle')(candleObject); 42 | 43 | const bigNumbers = [ 44 | 'open', 45 | 'close', 46 | 'high', 47 | 'low', 48 | 'volume', 49 | 'quoteVolume', 50 | 'weightedAveragePrice', 51 | ]; 52 | 53 | bigNumbers.forEach(key => (this[key] = toBigNumber(candleObject[key]))); 54 | 55 | this.time = candleObject.time; 56 | this.maxHeight = candleObject.maxHeight; 57 | this.txsCount = candleObject.txsCount; 58 | } 59 | 60 | public toJSON(): ICandleJSON { 61 | return { 62 | time: this.time, 63 | open: this.open, 64 | close: this.close, 65 | high: this.high, 66 | low: this.low, 67 | volume: this.volume, 68 | quoteVolume: this.quoteVolume, 69 | weightedAveragePrice: this.weightedAveragePrice, 70 | maxHeight: this.maxHeight, 71 | txsCount: this.txsCount, 72 | }; 73 | } 74 | 75 | public toString(): string { 76 | return '[object Candle]'; 77 | } 78 | 79 | public static isCandle(object: object): object is Candle { 80 | return object instanceof Candle; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/entities/Money.ts: -------------------------------------------------------------------------------- 1 | import { Asset } from './Asset'; 2 | import { BigNumber } from '@waves/bignumber'; 3 | import { toBigNumber } from '../utils'; 4 | 5 | 6 | export interface IMoneyJSON { 7 | assetId: string; 8 | tokens: string; 9 | } 10 | 11 | export type TMoneyInput = string | number | BigNumber; 12 | 13 | export class Money { 14 | public readonly asset: Asset; 15 | 16 | private _coins: BigNumber; 17 | private _tokens: BigNumber; 18 | 19 | // @todo refactor to accept full 'tokens' instead of 'coins' 20 | // to hide precision arithmetic implementation 21 | constructor(coins: TMoneyInput, asset: Asset) { 22 | const divider = Money._getDivider(asset.precision); 23 | this.asset = asset; 24 | this._coins = toBigNumber(coins).roundTo(0, BigNumber.ROUND_MODE.ROUND_FLOOR); 25 | this._tokens = this._coins.div(divider); 26 | } 27 | 28 | public getCoins(): BigNumber { 29 | return this._coins.add(0); 30 | } 31 | 32 | public getTokens(): BigNumber { 33 | return this._tokens.add(0); 34 | } 35 | 36 | public toCoins(): string { 37 | return this._coins.toFixed(0); 38 | } 39 | 40 | public toTokens(): string { 41 | return this._tokens.toFixed(this.asset.precision); 42 | } 43 | 44 | public toFormat(precision?: number): string { 45 | return this._tokens.toFormat(precision); 46 | } 47 | 48 | public add(money: Money): Money { 49 | this._matchAssets(money); 50 | const inputCoins = money.getCoins(); 51 | const result = this._coins.add(inputCoins); 52 | return new Money(result, this.asset); 53 | } 54 | 55 | public plus(money: Money): Money { 56 | return this.add(money); 57 | } 58 | 59 | public sub(money: Money): Money { 60 | this._matchAssets(money); 61 | const inputCoins = money.getCoins(); 62 | const result = this._coins.sub(inputCoins); 63 | return new Money(result, this.asset); 64 | } 65 | 66 | public minus(money: Money): Money { 67 | return this.sub(money); 68 | } 69 | 70 | public times(money: Money): Money { 71 | this._matchAssets(money); 72 | return new Money(this.getCoins().mul(money.getCoins()), this.asset); 73 | } 74 | 75 | public div(money: Money): Money { 76 | this._matchAssets(money); 77 | return new Money(this.getCoins().div(money.getCoins()), this.asset); 78 | } 79 | 80 | public eq(money: Money): boolean { 81 | this._matchAssets(money); 82 | return this._coins.eq(money.getCoins()); 83 | } 84 | 85 | public lt(money: Money): boolean { 86 | this._matchAssets(money); 87 | return this._coins.lt(money.getCoins()); 88 | } 89 | 90 | public lte(money: Money): boolean { 91 | this._matchAssets(money); 92 | return this._coins.lte(money.getCoins()); 93 | } 94 | 95 | public gt(money: Money): boolean { 96 | this._matchAssets(money); 97 | return this._coins.gt(money.getCoins()); 98 | } 99 | 100 | public gte(money: Money): boolean { 101 | this._matchAssets(money); 102 | return this._coins.gte(money.getCoins()); 103 | } 104 | 105 | public safeSub(money: Money): Money { 106 | if (this.asset.id === money.asset.id) { 107 | return this.sub(money); 108 | } 109 | return this; 110 | } 111 | 112 | public toNonNegative(): Money { 113 | if (this.getTokens().lt(0)) { 114 | return this.cloneWithTokens(0); 115 | } 116 | return this; 117 | } 118 | 119 | // @todo coins refactor 120 | public cloneWithCoins(coins: TMoneyInput): Money { 121 | return new Money(new BigNumber(coins), this.asset); 122 | } 123 | 124 | public cloneWithTokens(tokens: TMoneyInput): Money { 125 | const coins = Money._tokensToCoins(tokens, this.asset.precision); 126 | return new Money(coins, this.asset); 127 | } 128 | 129 | public convertTo(asset: Asset, exchangeRate: TMoneyInput): Money { 130 | return Money.convert(this, asset, toBigNumber(exchangeRate)); 131 | } 132 | 133 | public toJSON(): IMoneyJSON { 134 | return { 135 | assetId: this.asset.id, 136 | tokens: this.toTokens(), 137 | }; 138 | } 139 | 140 | public toString(): string { 141 | return `${this.toTokens()} ${this.asset.id}`; 142 | } 143 | 144 | private _matchAssets(money: Money): void { 145 | if (this.asset.id !== money.asset.id) { 146 | throw new Error( 147 | 'You cannot apply arithmetic operations to Money created with different assets' 148 | ); 149 | } 150 | } 151 | 152 | public static max(...moneyList: Array): Money { 153 | return moneyList.reduce((max, money) => max.gte(money) ? max : money); 154 | } 155 | 156 | public static min(...moneyList: Array): Money { 157 | return moneyList.reduce((min, money) => min.lte(money) ? min : money); 158 | } 159 | 160 | public static isMoney(object: object): object is Money { 161 | return object instanceof Money; 162 | } 163 | 164 | public static convert(money: Money, asset: Asset, exchangeRate: BigNumber | string): Money { 165 | if (money.asset === asset) { 166 | return money; 167 | } else { 168 | const difference = money.asset.precision - asset.precision; 169 | const divider = new BigNumber(10).pow(difference); 170 | const coins = money.getCoins(); 171 | const result = coins 172 | .mul(exchangeRate) 173 | .div(divider) 174 | .roundTo(0, BigNumber.ROUND_MODE.ROUND_DOWN) 175 | .toFixed(); 176 | return new Money(new BigNumber(result), asset); 177 | } 178 | } 179 | 180 | public static fromTokens(count: TMoneyInput, asset: Asset): Money { 181 | const tokens = toBigNumber(count); 182 | return new Money(tokens.mul(new BigNumber(10).pow(asset.precision)), asset); 183 | } 184 | 185 | public static fromCoins(count: TMoneyInput, asset: Asset): Money { 186 | return new Money(count, asset); 187 | } 188 | 189 | private static _tokensToCoins(tokens: TMoneyInput, precision: number): BigNumber { 190 | const divider = Money._getDivider(precision); 191 | tokens = new BigNumber(tokens).toFixed(precision); 192 | return new BigNumber(tokens).mul(divider); 193 | } 194 | 195 | private static _getDivider(precision: number): BigNumber { 196 | return new BigNumber(10).pow(precision); 197 | } 198 | } 199 | -------------------------------------------------------------------------------- /src/entities/OrderPrice.ts: -------------------------------------------------------------------------------- 1 | import { BigNumber } from '@waves/bignumber'; 2 | import { AssetPair } from './AssetPair'; 3 | import { toBigNumber } from '../utils'; 4 | 5 | export interface IOrderPriceJSON { 6 | amountAssetId: string; 7 | priceAssetId: string; 8 | priceTokens: string; 9 | } 10 | 11 | export class OrderPrice { 12 | public readonly pair: AssetPair; 13 | 14 | private _matcherCoins: BigNumber; 15 | private _tokens: BigNumber; 16 | 17 | private static _MATCHER_SCALE = new BigNumber(10).pow(8); 18 | 19 | // @todo refactor to accept Money instead of BigNumber 20 | constructor(coins: BigNumber, pair: AssetPair) { 21 | const divider = OrderPrice._getMatcherDivider(pair.precisionDifference); 22 | this.pair = pair; 23 | this._matcherCoins = coins; 24 | this._tokens = this._matcherCoins.div(divider); 25 | } 26 | 27 | public getMatcherCoins(): BigNumber { 28 | return this._matcherCoins.clone(); 29 | } 30 | 31 | public getTokens(): BigNumber { 32 | return this._tokens.clone(); 33 | } 34 | 35 | public toMatcherCoins(): string { 36 | return this._matcherCoins.toFixed(0); 37 | } 38 | 39 | public toTokens(): string { 40 | return this._tokens.toFixed(this.pair.priceAsset.precision); 41 | } 42 | 43 | public toFormat(): string { 44 | return this._tokens.toFormat(this.pair.priceAsset.precision); 45 | } 46 | 47 | public toJSON(): IOrderPriceJSON { 48 | return { 49 | amountAssetId: this.pair.amountAsset.id, 50 | priceAssetId: this.pair.priceAsset.id, 51 | priceTokens: this.toTokens(), 52 | }; 53 | } 54 | 55 | public toString(): string { 56 | return `${this.toTokens()} ${this.pair.amountAsset.id}/${ 57 | this.pair.priceAsset.id 58 | }`; 59 | } 60 | 61 | public static fromMatcherCoins(coins: string | number | BigNumber, pair: AssetPair): OrderPrice { 62 | OrderPrice._checkAmount(coins); 63 | return new OrderPrice(toBigNumber(coins), pair); 64 | } 65 | 66 | public static fromTokens(tokens: string | number | BigNumber, pair: AssetPair): OrderPrice { 67 | OrderPrice._checkAmount(tokens); 68 | tokens = toBigNumber(tokens).toFixed(pair.priceAsset.precision); 69 | const divider = OrderPrice._getMatcherDivider(pair.precisionDifference); 70 | const coins = new BigNumber(tokens).mul(divider); 71 | return new OrderPrice(coins, pair); 72 | } 73 | 74 | private static _getMatcherDivider(precision: number): BigNumber { 75 | return new BigNumber(10) 76 | .pow(precision) 77 | .mul(OrderPrice._MATCHER_SCALE); 78 | } 79 | 80 | public static isOrderPrice(object: object): object is OrderPrice { 81 | return object instanceof OrderPrice; 82 | } 83 | 84 | private static _checkAmount(amount) { 85 | if (!(['string', 'number'].includes(typeof amount) || amount instanceof BigNumber)) { 86 | throw new Error('Please use strings to create instances of OrderPrice'); 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { Asset, IAssetJSON } from './entities/Asset'; 2 | export { Candle, ICandleJSON } from './entities/Candle'; 3 | export { Money, IMoneyJSON } from './entities/Money'; 4 | export { OrderPrice, IOrderPriceJSON } from './entities/OrderPrice'; 5 | export { AssetPair, IAssetPairJSON } from './entities/AssetPair'; 6 | export { config } from './config'; 7 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import { BigNumber } from '@waves/bignumber'; 2 | 3 | 4 | export function toBigNumber(some: string | number | BigNumber): BigNumber { 5 | return some instanceof BigNumber ? some : new BigNumber(some); 6 | } 7 | -------------------------------------------------------------------------------- /test/assetData.ts: -------------------------------------------------------------------------------- 1 | const defaultData = { 2 | id: 'default-id', 3 | name: 'Default Name', 4 | precision: 8, 5 | description: 'Default description', 6 | height: 10, 7 | timestamp: new Date('2016-04-12'), 8 | sender: '3Pxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 9 | quantity: 1000, 10 | reissuable: false, 11 | hasScript: true, 12 | minSponsoredFee: 100000 13 | }; 14 | 15 | 16 | export function getAssetData(partialData = {}) { 17 | return Object.assign({}, defaultData, partialData); 18 | } 19 | -------------------------------------------------------------------------------- /test/classes/Asset.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { getAssetData } from '../assetData'; 3 | import { Asset } from '../../dist'; 4 | 5 | 6 | let defaultAssetInfo1; 7 | let defaultAssetInfo2; 8 | 9 | 10 | describe('Asset', () => { 11 | 12 | beforeEach(() => { 13 | 14 | defaultAssetInfo1 = getAssetData({ 15 | id: 'test1', 16 | name: 'Test No. 1', 17 | precision: 0, 18 | reissuable: false, 19 | hasScript: true, 20 | minSponsoredFee: 100000 21 | }); 22 | 23 | defaultAssetInfo2 = getAssetData({ 24 | ticker: 'TN2', 25 | id: 'test2', 26 | name: 'Test No. 2', 27 | precision: 8, 28 | reissuable: true, 29 | hasScript: false, 30 | minSponsoredFee: 1 31 | }); 32 | 33 | }); 34 | 35 | describe('creating instances', () => { 36 | 37 | it('should be an instance of Asset #1', () => { 38 | const asset = new Asset(defaultAssetInfo1); 39 | expect(Asset.isAsset(asset)).to.be.true; 40 | }); 41 | 42 | it('should be an instance of Asset #2', () => { 43 | const asset = new Asset(defaultAssetInfo2); 44 | expect(Asset.isAsset(asset)).to.be.true; 45 | }); 46 | }); 47 | 48 | describe('conversions', () => { 49 | 50 | // TODO : JSON 51 | 52 | it('should convert to a string #1', () => { 53 | const asset = new Asset(defaultAssetInfo1); 54 | expect(asset.toString()).to.equal(defaultAssetInfo1.id); 55 | }); 56 | 57 | it('should convert to a string #2', () => { 58 | const asset = new Asset(defaultAssetInfo2); 59 | expect(asset.toString()).to.equal(defaultAssetInfo2.id); 60 | }); 61 | 62 | }); 63 | 64 | }); 65 | -------------------------------------------------------------------------------- /test/classes/AssetPair.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { getAssetData } from '../assetData'; 3 | import { Asset, AssetPair } from '../../dist'; 4 | 5 | 6 | let asset1; 7 | let asset2; 8 | 9 | 10 | describe('AssetPair', () => { 11 | 12 | beforeEach(() => { 13 | 14 | asset1 = new Asset(getAssetData({ 15 | id: 'test1', 16 | name: 'Test No. 1', 17 | precision: 0, 18 | reissuable: false 19 | })); 20 | 21 | asset2 = new Asset(getAssetData({ 22 | ticker: 'TN2', 23 | id: 'test2', 24 | name: 'Test No. 2', 25 | precision: 4, 26 | reissuable: true 27 | })); 28 | 29 | }); 30 | 31 | describe('creating instances', () => { 32 | 33 | it('should be an instance of AssetPair', () => { 34 | const assetPair = new AssetPair(asset1, asset2); 35 | expect(AssetPair.isAssetPair(assetPair)).to.be.true; 36 | }); 37 | 38 | }); 39 | 40 | describe('conversions', () => { 41 | 42 | // TODO : JSON 43 | 44 | it('should convert to a string', () => { 45 | const assetPair = new AssetPair(asset1, asset2); 46 | expect(assetPair.toString()).to.equal(`${asset1.id}/${asset2.id}`); 47 | }); 48 | 49 | }); 50 | 51 | }); 52 | -------------------------------------------------------------------------------- /test/classes/Money.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { getAssetData } from '../assetData'; 3 | import { Asset, Money } from '../../dist'; 4 | 5 | 6 | let fakeEIGHT; 7 | let fakeFOUR; 8 | let fakeZERO; 9 | 10 | 11 | // TODO : add test for `.toFormat()` method 12 | 13 | describe('Money', () => { 14 | 15 | beforeEach(() => { 16 | 17 | fakeEIGHT = new Asset(getAssetData({ 18 | id: 'EIGHT', 19 | name: 'Eight Precision Token', 20 | precision: 8 21 | })); 22 | 23 | fakeFOUR = new Asset(getAssetData({ 24 | id: 'FOUR', 25 | name: 'Four Precision Token', 26 | precision: 4 27 | })); 28 | 29 | fakeZERO = new Asset(getAssetData({ 30 | id: 'ZERO', 31 | name: 'Zero Precision Token', 32 | precision: 0 33 | })); 34 | 35 | }); 36 | 37 | describe('creating instances', () => { 38 | 39 | it('should be an instance of Money', () => { 40 | const money = new Money(10, fakeEIGHT); 41 | expect(Money.isMoney(money)).to.be.true; 42 | expect(Asset.isAsset(money.asset)).to.be.true; 43 | }); 44 | 45 | it('round floor', () => { 46 | const money1 = new Money(19.9, fakeZERO); 47 | const money2 = Money.fromTokens(1.56, money1.asset); 48 | expect(money1.toCoins()).to.equal('19'); 49 | expect(money1.toTokens()).to.equal('19'); 50 | expect(money2.toCoins()).to.equal('1'); 51 | }); 52 | 53 | }); 54 | 55 | describe('core functionality', () => { 56 | 57 | it('should convert Money to tokens and to coins', () => { 58 | 59 | const money8 = new Money(100000000, fakeEIGHT); 60 | expect(money8.toTokens()).to.equal('1.00000000'); 61 | expect(money8.toCoins()).to.equal('100000000'); 62 | 63 | const money4 = new Money(10000, fakeFOUR); 64 | expect(money4.toTokens()).to.equal('1.0000'); 65 | expect(money4.toCoins()).to.equal('10000'); 66 | 67 | }); 68 | 69 | it('should drop insignificant digits', () => { 70 | 71 | const money0 = new Money('1.123', fakeZERO); 72 | expect(money0.toTokens()).to.equal('1'); 73 | expect(money0.toCoins()).to.equal('1'); 74 | 75 | const money8 = new Money('1.123', fakeZERO); 76 | expect(money8.toTokens()).to.equal('1'); 77 | expect(money8.toCoins()).to.equal('1'); 78 | expect(money8.toFormat()).to.equal('1'); 79 | 80 | }); 81 | 82 | it('toFormat', () => { 83 | const money8 = new Money('123', fakeZERO); 84 | expect(money8.toFormat()).to.equal('123'); 85 | expect(money8.toFormat(1)).to.equal('123.0'); 86 | }); 87 | 88 | it('safeSub', () => { 89 | const money0 = Money.fromTokens(10, fakeZERO); 90 | const money1 = Money.fromTokens(10, fakeZERO); 91 | const money2 = Money.fromTokens(10, fakeFOUR); 92 | 93 | expect(money0.safeSub(money2).toFormat()).to.equal('10'); 94 | expect(money0.safeSub(money1).toFormat()).to.equal('0'); 95 | }); 96 | 97 | it('times', () => { 98 | const money0 = Money.fromTokens(2, fakeZERO); 99 | const money1 = Money.fromTokens(4, fakeZERO); 100 | const money2 = Money.fromTokens(5, fakeZERO); 101 | 102 | expect(money0.times(money2).toFormat()).to.equal('10'); 103 | expect(money0.times(money1).toFormat()).to.equal('8'); 104 | }); 105 | 106 | it('div', () => { 107 | const money0 = Money.fromTokens(10, fakeZERO); 108 | const money1 = Money.fromTokens(5, fakeZERO); 109 | const money2 = Money.fromTokens(2, fakeZERO); 110 | 111 | expect(money0.div(money2).toFormat()).to.equal('5'); 112 | expect(money0.div(money1).toFormat()).to.equal('2'); 113 | }); 114 | 115 | it('toNonNegative', () => { 116 | const money0 = Money.fromTokens(5, fakeZERO); 117 | const money1 = Money.fromTokens(10, fakeZERO); 118 | 119 | expect(money0.sub(money1).toNonNegative().toFormat()).to.equal('0'); 120 | expect(money0.toNonNegative().toFormat()).to.equal('5'); 121 | }); 122 | 123 | }); 124 | 125 | describe('arithmetic operations', () => { 126 | 127 | // TODO 128 | 129 | }); 130 | 131 | describe('arithmetic comparisons', () => { 132 | 133 | // TODO 134 | 135 | }); 136 | 137 | }); 138 | -------------------------------------------------------------------------------- /test/classes/OrderPrice.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { getAssetData } from '../assetData'; 3 | import { BigNumber } from '@waves/bignumber'; 4 | import { Asset, AssetPair, OrderPrice } from '../../dist'; 5 | 6 | 7 | let fakeEIGHT; 8 | let fakeFOUR; 9 | let fakeZERO; 10 | let pairOne; 11 | let pairTwo; 12 | 13 | 14 | // TODO : add test for `.toFormat()` method 15 | 16 | describe('OrderPrice', () => { 17 | 18 | beforeEach(() => { 19 | 20 | fakeEIGHT = new Asset(getAssetData({ 21 | id: 'EIGHT', 22 | name: 'Eight Precision Token', 23 | precision: 8 24 | })); 25 | 26 | fakeFOUR = new Asset(getAssetData({ 27 | id: 'FOUR', 28 | name: 'Four Precision Token', 29 | precision: 4 30 | })); 31 | 32 | fakeZERO = new Asset(getAssetData({ 33 | id: 'ZERO', 34 | name: 'Zero Precision Token', 35 | precision: 0 36 | })); 37 | 38 | pairOne = new AssetPair(fakeEIGHT, fakeZERO); 39 | pairTwo = new AssetPair(fakeZERO, fakeFOUR); 40 | 41 | }); 42 | 43 | describe('creating instances', () => { 44 | 45 | it('should be an instance of OrderPrice', () => { 46 | const orderPrice = new OrderPrice(new BigNumber(10), pairOne); 47 | expect(OrderPrice.isOrderPrice(orderPrice)).to.be.true; 48 | }); 49 | 50 | }); 51 | 52 | describe('core functionality', () => { 53 | 54 | describe('tokens to matcher coins', () => { 55 | 56 | // TODO 57 | 58 | // it('should convert when assets precisions are the same [8, 8]', (done) => { 59 | // OrderPrice.fromTokens('1.47', fakeWAVES, fakeBTC).then((orderPrice) => { 60 | // expect(orderPrice.toMatcherCoins()).to.equal('147000000'); 61 | // }).then(() => done()); 62 | // }); 63 | // 64 | // it('should convert when assets precisions are the same [2, 2]', (done) => { 65 | // OrderPrice.fromTokens('0.01', fakeUSD, fakeEUR).then((orderPrice) => { 66 | // expect(orderPrice.toMatcherCoins()).to.equal('1000000'); 67 | // }).then(() => done()); 68 | // }); 69 | // 70 | // it('should convert when assets precisions are the same [0, 0]', (done) => { 71 | // OrderPrice.fromTokens('5', fakeZERO, fakeZERO).then((orderPrice) => { 72 | // expect(orderPrice.toMatcherCoins()).to.equal('500000000'); 73 | // }).then(() => done()); 74 | // }); 75 | // 76 | // it('should convert when assets precisions are different [8, 2]', (done) => { 77 | // OrderPrice.fromTokens('11.5', fakeWAVES, fakeUSD).then((orderPrice) => { 78 | // expect(orderPrice.toMatcherCoins()).to.equal('1150'); 79 | // }).then(() => done()); 80 | // }); 81 | // 82 | // it('should convert when assets precisions are different [8, 0]', (done) => { 83 | // OrderPrice.fromTokens('555', fakeBTC, fakeZERO).then((orderPrice) => { 84 | // expect(orderPrice.toMatcherCoins()).to.equal('555'); 85 | // }).then(() => done()); 86 | // }); 87 | // 88 | // it('should convert when assets precisions are different [2, 8]', (done) => { 89 | // OrderPrice.fromTokens('2.33445566', fakeEUR, fakeBTC).then((orderPrice) => { 90 | // expect(orderPrice.toMatcherCoins()).to.equal('233445566000000'); 91 | // }).then(() => done()); 92 | // }); 93 | // 94 | // it('should convert when assets precisions are different [0, 8]', (done) => { 95 | // OrderPrice.fromTokens('100.01020304', fakeZERO, fakeWAVES).then((orderPrice) => { 96 | // expect(orderPrice.toMatcherCoins()).to.equal('1000102030400000000'); 97 | // }).then(() => done()); 98 | // }); 99 | 100 | }); 101 | 102 | describe('tokens to matcher coins while dropping insignificant digits', () => { 103 | 104 | // TODO 105 | 106 | // it('should convert when assets precisions are the same [8, 8]', (done) => { 107 | // OrderPrice.fromTokens('11.509910102', fakeWAVES, fakeBTC).then((orderPrice) => { 108 | // expect(orderPrice.toMatcherCoins()).to.equal('1150991010'); 109 | // }).then(() => done()); 110 | // }); 111 | // 112 | // it('should convert when assets precisions are different [8, 2]', (done) => { 113 | // OrderPrice.fromTokens('11.5099', fakeWAVES, fakeUSD).then((orderPrice) => { 114 | // expect(orderPrice.toMatcherCoins()).to.equal('1150'); 115 | // }).then(() => done()); 116 | // }); 117 | // 118 | // it('should convert when assets precisions are different [8, 0]', (done) => { 119 | // OrderPrice.fromTokens('555.33', fakeBTC, fakeZERO).then((orderPrice) => { 120 | // expect(orderPrice.toMatcherCoins()).to.equal('555'); 121 | // }).then(() => done()); 122 | // }); 123 | // 124 | // it('should convert when assets precisions are different [2, 8]', (done) => { 125 | // OrderPrice.fromTokens('2.334455667788', fakeEUR, fakeBTC).then((orderPrice) => { 126 | // expect(orderPrice.toMatcherCoins()).to.equal('233445566000000'); 127 | // }).then(() => done()); 128 | // }); 129 | // 130 | // it('should convert when assets precisions are the same [0, 0]', (done) => { 131 | // OrderPrice.fromTokens('555.33', fakeZERO, fakeZERO).then((orderPrice) => { 132 | // expect(orderPrice.toMatcherCoins()).to.equal('55500000000'); 133 | // }).then(() => done()); 134 | // }); 135 | 136 | }); 137 | 138 | describe('matcher coins to tokens', () => { 139 | 140 | // TODO 141 | 142 | // it('should convert when assets precisions are the same [8, 8]', (done) => { 143 | // OrderPrice.fromMatcherCoins('147000000', fakeWAVES, fakeBTC).then((orderPrice) => { 144 | // expect(orderPrice.toTokens()).to.equal('1.47000000'); 145 | // }).then(() => done()); 146 | // }); 147 | // 148 | // it('should convert when assets precisions are the same [2, 2]', (done) => { 149 | // OrderPrice.fromMatcherCoins('1000000', fakeUSD, fakeEUR).then((orderPrice) => { 150 | // expect(orderPrice.toTokens()).to.equal('0.01'); 151 | // }).then(() => done()); 152 | // }); 153 | // 154 | // it('should convert when assets precisions are the same [0, 0]', (done) => { 155 | // OrderPrice.fromMatcherCoins('500000000', fakeZERO, fakeZERO).then((orderPrice) => { 156 | // expect(orderPrice.toTokens()).to.equal('5'); 157 | // }).then(() => done()); 158 | // }); 159 | // 160 | // it('should convert when assets precisions are different [8, 2]', (done) => { 161 | // OrderPrice.fromMatcherCoins('1150', fakeBTC, fakeEUR).then((orderPrice) => { 162 | // expect(orderPrice.toTokens()).to.equal('11.50'); 163 | // }).then(() => done()); 164 | // }); 165 | // 166 | // it('should convert when assets precisions are different [8, 0]', (done) => { 167 | // OrderPrice.fromMatcherCoins('555', fakeWAVES, fakeZERO).then((orderPrice) => { 168 | // expect(orderPrice.toTokens()).to.equal('555'); 169 | // }).then(() => done()); 170 | // }); 171 | // 172 | // it('should convert when assets precisions are different [2, 8]', (done) => { 173 | // OrderPrice.fromMatcherCoins('233445566000000', fakeUSD, fakeWAVES).then((orderPrice) => { 174 | // expect(orderPrice.toTokens()).to.equal('2.33445566'); 175 | // }).then(() => done()); 176 | // }); 177 | // 178 | // it('should convert when assets precisions are different [0, 8]', (done) => { 179 | // OrderPrice.fromMatcherCoins('1000102030400000000', fakeZERO, fakeBTC).then((orderPrice) => { 180 | // expect(orderPrice.toTokens()).to.equal('100.01020304'); 181 | // }).then(() => done()); 182 | // }); 183 | 184 | }); 185 | 186 | }); 187 | 188 | describe('conversions', () => { 189 | 190 | // TODO : JSON 191 | 192 | // TODO : string 193 | 194 | }); 195 | 196 | }); 197 | -------------------------------------------------------------------------------- /test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": true, 4 | "alwaysStrict": true, 5 | "lib": [ 6 | "es2015", 7 | "es5", 8 | "dom" 9 | ], 10 | "module": "commonjs", 11 | "outDir": "../tmp", 12 | "sourceMap": true, 13 | "target": "es2015", 14 | "typeRoots": [ 15 | "../node_modules/@types" 16 | ], 17 | "types": [ 18 | "chai", 19 | "mocha" 20 | ] 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "./src", 4 | "outDir": "./dist", 5 | "target": "es5", 6 | "module": "commonjs", 7 | "experimentalDecorators": true, 8 | "sourceMap": true, 9 | "lib": ["es2015", "es2016"] 10 | }, 11 | "include": [ 12 | "src" 13 | ] 14 | } 15 | --------------------------------------------------------------------------------