From edc85844b9c21b6af994ed828b9c2696fa8ac17a Mon Sep 17 00:00:00 2001 From: Brandon Date: Thu, 28 Jan 2021 02:57:10 -0500 Subject: [PATCH 01/11] Include Max Depth Sizes in Calculation --- src/main/ArbitrageExecution.js | 12 +++--- src/main/CalculationNode.js | 71 ++++++++++++++++++++++------------ 2 files changed, 52 insertions(+), 31 deletions(-) diff --git a/src/main/ArbitrageExecution.js b/src/main/ArbitrageExecution.js index 15dbeb9..269bed1 100644 --- a/src/main/ArbitrageExecution.js +++ b/src/main/ArbitrageExecution.js @@ -160,9 +160,9 @@ const ArbitrageExecution = { parallelExecutionStrategy(calculated) { return Promise.all([ - BinanceApi.marketBuyOrSell(calculated.trade.ab.method)(calculated.trade.ab.ticker, calculated.ab), - BinanceApi.marketBuyOrSell(calculated.trade.bc.method)(calculated.trade.bc.ticker, calculated.bc), - BinanceApi.marketBuyOrSell(calculated.trade.ca.method)(calculated.trade.ca.ticker, calculated.ca) + BinanceApi.marketBuyOrSell(calculated.trade.ab.method)(calculated.trade.ab.ticker, calculated.ab.quantity), + BinanceApi.marketBuyOrSell(calculated.trade.bc.method)(calculated.trade.bc.ticker, calculated.bc.quantity), + BinanceApi.marketBuyOrSell(calculated.trade.ca.method)(calculated.trade.ca.ticker, calculated.ca.quantity) ]) .then(([resultsAB, resultsBC, resultsCA]) => { let actual = { @@ -217,11 +217,11 @@ const ArbitrageExecution = { fees: 0 }; let recalculated = { - bc: calculated.bc, - ca: calculated.ca + bc: calculated.bc.quantity, + ca: calculated.ca.quantity }; - return BinanceApi.marketBuyOrSell(calculated.trade.ab.method)(calculated.trade.ab.ticker, calculated.ab) + return BinanceApi.marketBuyOrSell(calculated.trade.ab.method)(calculated.trade.ab.ticker, calculated.ab.quantity) .then((results) => { if (results.orderId) { [actual.a.spent, actual.b.earned, fees] = ArbitrageExecution.parseActualResults(calculated.trade.ab.method, results); diff --git a/src/main/CalculationNode.js b/src/main/CalculationNode.js index b8d0b58..1119430 100644 --- a/src/main/CalculationNode.js +++ b/src/main/CalculationNode.js @@ -43,10 +43,19 @@ const CalculationNode = { let calculated = { id: `${trade.symbol.a}-${trade.symbol.b}-${trade.symbol.c}`, trade: trade, - ab: 0, - bc: 0, - ca: 0, depth: depthSnapshot, + ab: { + quantity: 0, + depth: 0 + }, + bc: { + quantity: 0, + depth: 0 + }, + ca: { + quantity: 0, + depth: 0 + }, a: { spent: 0, earned: 0, @@ -66,35 +75,35 @@ const CalculationNode = { if (trade.ab.method === 'BUY') { // Buying BA - const dustedB = CalculationNode.orderBookConversion(investmentA, trade.symbol.a, trade.symbol.b, trade.ab.ticker, depthSnapshot.ab); - calculated.b.earned = calculated.ab = CalculationNode.calculateDustless(dustedB, trade.ab.dustDecimals); - calculated.a.spent = CalculationNode.orderBookReverseConversion(calculated.b.earned, trade.symbol.b, trade.symbol.a, trade.ab.ticker, depthSnapshot.ab); + const { value: dustedB } = CalculationNode.orderBookConversion(investmentA, trade.symbol.a, trade.symbol.b, trade.ab.ticker, depthSnapshot.ab); + calculated.b.earned = calculated.ab.quantity = CalculationNode.calculateDustless(dustedB, trade.ab.dustDecimals); + ({ value: calculated.a.spent, depth: calculated.ab.depth } = CalculationNode.orderBookReverseConversion(calculated.b.earned, trade.symbol.b, trade.symbol.a, trade.ab.ticker, depthSnapshot.ab)); } else { // Selling AB - calculated.a.spent = calculated.ab = CalculationNode.calculateDustless(investmentA, trade.ab.dustDecimals); - calculated.b.earned = CalculationNode.orderBookConversion(calculated.a.spent, trade.symbol.a, trade.symbol.b, trade.ab.ticker, depthSnapshot.ab); + calculated.a.spent = calculated.ab.quantity = CalculationNode.calculateDustless(investmentA, trade.ab.dustDecimals); + ({ value: calculated.b.earned, depth: calculated.ab.depth } = CalculationNode.orderBookConversion(calculated.a.spent, trade.symbol.a, trade.symbol.b, trade.ab.ticker, depthSnapshot.ab)); } if (trade.bc.method === 'BUY') { // Buying CB - const dustedC = CalculationNode.orderBookConversion(calculated.b.earned, trade.symbol.b, trade.symbol.c, trade.bc.ticker, depthSnapshot.bc); - calculated.c.earned = calculated.bc = CalculationNode.calculateDustless(dustedC, trade.bc.dustDecimals); - calculated.b.spent = CalculationNode.orderBookReverseConversion(calculated.c.earned, trade.symbol.c, trade.symbol.b, trade.bc.ticker, depthSnapshot.bc); + const { value: dustedC } = CalculationNode.orderBookConversion(calculated.b.earned, trade.symbol.b, trade.symbol.c, trade.bc.ticker, depthSnapshot.bc); + calculated.c.earned = calculated.bc.quantity = CalculationNode.calculateDustless(dustedC, trade.bc.dustDecimals); + ({ value: calculated.b.spent, depth: calculated.bc.depth } = CalculationNode.orderBookReverseConversion(calculated.c.earned, trade.symbol.c, trade.symbol.b, trade.bc.ticker, depthSnapshot.bc)); } else { // Selling BC - calculated.b.spent = calculated.bc = CalculationNode.calculateDustless(calculated.b.earned, trade.bc.dustDecimals); - calculated.c.earned = CalculationNode.orderBookConversion(calculated.b.spent, trade.symbol.b, trade.symbol.c, trade.bc.ticker, depthSnapshot.bc); + calculated.b.spent = calculated.bc.quantity = CalculationNode.calculateDustless(calculated.b.earned, trade.bc.dustDecimals); + ({ value: calculated.c.earned, depth: calculated.bc.depth } = CalculationNode.orderBookConversion(calculated.b.spent, trade.symbol.b, trade.symbol.c, trade.bc.ticker, depthSnapshot.bc)); } if (trade.ca.method === 'BUY') { // Buying AC - const dustedA = CalculationNode.orderBookConversion(calculated.c.earned, trade.symbol.c, trade.symbol.a, trade.ca.ticker, depthSnapshot.ca); - calculated.a.earned = calculated.ca = CalculationNode.calculateDustless(dustedA, trade.ca.dustDecimals); - calculated.c.spent = CalculationNode.orderBookReverseConversion(calculated.a.earned, trade.symbol.a, trade.symbol.c, trade.ca.ticker, depthSnapshot.ca); + const { value: dustedA } = CalculationNode.orderBookConversion(calculated.c.earned, trade.symbol.c, trade.symbol.a, trade.ca.ticker, depthSnapshot.ca); + calculated.a.earned = calculated.ca.quantity = CalculationNode.calculateDustless(dustedA, trade.ca.dustDecimals); + ({ value: calculated.c.spent, depth: calculated.ca.depth } = CalculationNode.orderBookReverseConversion(calculated.a.earned, trade.symbol.a, trade.symbol.c, trade.ca.ticker, depthSnapshot.ca)); } else { // Selling CA - calculated.c.spent = calculated.ca = CalculationNode.calculateDustless(calculated.c.earned, trade.ca.dustDecimals); - calculated.a.earned = CalculationNode.orderBookConversion(calculated.c.spent, trade.symbol.c, trade.symbol.a, trade.ca.ticker, depthSnapshot.ca); + calculated.c.spent = calculated.ca.quantity = CalculationNode.calculateDustless(calculated.c.earned, trade.ca.dustDecimals); + ({ value: calculated.a.earned, depth: calculated.ca.depth } = CalculationNode.orderBookConversion(calculated.c.spent, trade.symbol.c, trade.symbol.a, trade.ca.ticker, depthSnapshot.ca)); } // Calculate deltas @@ -110,7 +119,7 @@ const CalculationNode = { recalculateTradeLeg({ base, quote, method, ticker, dustDecimals }, quantityEarned, depthSnapshot) { if (method === 'BUY') { - const dustedQuantity = CalculationNode.orderBookConversion(quantityEarned, quote, base, ticker, depthSnapshot); + const { value: dustedQuantity } = CalculationNode.orderBookConversion(quantityEarned, quote, base, ticker, depthSnapshot); return CalculationNode.calculateDustless(dustedQuantity, dustDecimals); } else { return CalculationNode.calculateDustless(quantityEarned, dustDecimals); @@ -118,7 +127,7 @@ const CalculationNode = { }, orderBookConversion(amountFrom, symbolFrom, symbolTo, ticker, depthSnapshot) { - if (amountFrom === 0) return 0; + if (amountFrom === 0) return { value: 0, depth: 0 }; let amountTo = 0; @@ -133,7 +142,10 @@ const CalculationNode = { amountTo += exchangeableAmount; } else { // Last fill - return amountTo + (amountFrom * rate); + return { + value: amountTo + (amountFrom * rate), + depth: i+1 + }; } } throw new Error(`Bid depth (${bidRates.length}) too shallow to convert ${amountFrom} ${symbolFrom} to ${symbolTo} using ${ticker}`); @@ -148,7 +160,10 @@ const CalculationNode = { amountTo += quantity; } else { // Last fill - return amountTo + (amountFrom / rate); + return { + value: amountTo + (amountFrom / rate), + depth: i+1 + }; } } throw new Error(`Ask depth (${askRates.length}) too shallow to convert ${amountFrom} ${symbolFrom} to ${symbolTo} using ${ticker}`); @@ -156,7 +171,7 @@ const CalculationNode = { }, orderBookReverseConversion(amountFrom, symbolFrom, symbolTo, ticker, depthSnapshot) { - if (amountFrom === 0) return 0; + if (amountFrom === 0) return { value: 0, depth: 0 }; let amountTo = 0; @@ -171,7 +186,10 @@ const CalculationNode = { amountTo += exchangeableAmount; } else { // Last fill - return amountTo + (amountFrom * rate); + return { + value: amountTo + (amountFrom * rate), + depth: i+1 + }; } } throw new Error(`Ask depth (${askRates.length}) too shallow to reverse convert ${amountFrom} ${symbolFrom} to ${symbolTo} using ${ticker}`); @@ -186,7 +204,10 @@ const CalculationNode = { amountTo += quantity; } else { // Last fill - return amountTo + (amountFrom / rate); + return { + value: amountTo + (amountFrom / rate), + depth: i+1 + }; } } throw new Error(`Bid depth (${bidRates.length}) too shallow to reverse convert ${amountFrom} ${symbolFrom} to ${symbolTo} using ${ticker}`); From 74e482a9e9ff216d476aed42a7abc6894fa23c7a Mon Sep 17 00:00:00 2001 From: Brandon Date: Thu, 28 Jan 2021 02:57:45 -0500 Subject: [PATCH 02/11] Avoid calculating max depth twice --- src/main/ArbitrageExecution.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/ArbitrageExecution.js b/src/main/ArbitrageExecution.js index 269bed1..42b5e05 100644 --- a/src/main/ArbitrageExecution.js +++ b/src/main/ArbitrageExecution.js @@ -67,9 +67,9 @@ const ArbitrageExecution = { logger.execution.debug(`Price Change: ${((price.ca.actual - price.ca.expected) / price.ca.expected * 100).toFixed(8)}%`); const prunedDepthSnapshot = { - ab: Util.pruneSnapshot(calculated.depth.ab, CalculationNode.getOrderBookDepthRequirement(calculated.trade.ab.method, calculated.ab, calculated.depth.ab) + 2), - bc: Util.pruneSnapshot(calculated.depth.bc, CalculationNode.getOrderBookDepthRequirement(calculated.trade.bc.method, calculated.bc, calculated.depth.bc) + 2), - ca: Util.pruneSnapshot(calculated.depth.ca, CalculationNode.getOrderBookDepthRequirement(calculated.trade.ca.method, calculated.ca, calculated.depth.ca) + 2) + ab: Util.pruneSnapshot(calculated.depth.ab, calculated.ab.depth + 2), + bc: Util.pruneSnapshot(calculated.depth.bc, calculated.bc.depth + 2), + ca: Util.pruneSnapshot(calculated.depth.ca, calculated.ca.depth + 2) }; logger.execution.trace(`Pruned depth cache used for calculation:`); From e3f24748de1fde37bf9d0761b7cb289873ff1c31 Mon Sep 17 00:00:00 2001 From: Brandon Date: Mon, 15 Feb 2021 15:01:36 -0500 Subject: [PATCH 03/11] Display "age" in terms of milliseconds Consistency across the app --- README.md | 8 ++++---- src/main/HUD.js | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 50dd976..b2c1270 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,10 @@ arbitrage opportunities. To disable the HUD, set `HUD.ENABLED` to false. ### Reading the HUD * **Trade** - Three symbols related by exchange rates that are involved in the triangle arbitrage. * **Profit** - Percent profit or loss from executing the triangle arbitrage. This includes trading fees specified via `EXECUTION.FEE` config. -* **AB Age** - Time in seconds since the most recent update of the market ticker relating the first and second symbols in the arbitrage. -* **BC Age** - Time in seconds since the most recent update of the market ticker relating the second and third symbols in the arbitrage. -* **CA Age** - Time in seconds since the most recent update of the market ticker relating the third and first symbols in the arbitrage. -* **Age** - Time in seconds since the least recently updated market ticker involved in the triangle arbitrage. +* **AB Age** - Time in milliseconds since the most recent update of the market ticker relating the first and second symbols in the arbitrage. +* **BC Age** - Time in milliseconds since the most recent update of the market ticker relating the second and third symbols in the arbitrage. +* **CA Age** - Time in milliseconds since the most recent update of the market ticker relating the third and first symbols in the arbitrage. +* **Age** - Time in milliseconds since the least recently updated market ticker involved in the triangle arbitrage. ## Getting Started diff --git a/src/main/HUD.js b/src/main/HUD.js index 164c951..4e27ea0 100644 --- a/src/main/HUD.js +++ b/src/main/HUD.js @@ -44,14 +44,14 @@ const HUD = { .filter(({depth: {ab, bc, ca}}) => ab.eventTime && bc.eventTime && ca.eventTime) .sort((a, b) => a.percent > b.percent ? -1 : 1) .slice(0, rowCount) - .forEach(calculation => { + .forEach(({ trade, percent, depth }) => { tableData.push([ - `${calculation.trade.symbol.a}-${calculation.trade.symbol.b}-${calculation.trade.symbol.c}`, - `${calculation.percent.toFixed(4)}%`, - `${((now - calculation.depth.ab.eventTime)/1000).toFixed(2)}`, - `${((now - calculation.depth.bc.eventTime)/1000).toFixed(2)}`, - `${((now - calculation.depth.ca.eventTime)/1000).toFixed(2)}`, - `${((now - Math.min(calculation.depth.ab.eventTime, calculation.depth.bc.eventTime, calculation.depth.ca.eventTime))/1000).toFixed(2)}` + `${trade.symbol.a}-${trade.symbol.b}-${trade.symbol.c}`, + `${percent.toFixed(4)}%`, + `${now - depth.ab.eventTime}`, + `${now - depth.bc.eventTime}`, + `${now - depth.ca.eventTime}`, + `${now - Math.min(depth.ab.eventTime, depth.bc.eventTime, depth.ca.eventTime)}` ]); }); From 039177252d32d9fe12aa159ac670cd0d80e7a7fe Mon Sep 17 00:00:00 2001 From: Brandon Date: Tue, 16 Feb 2021 19:34:55 -0500 Subject: [PATCH 04/11] Update Dependencies & Remove si --- package-lock.json | 29 ++++++++++++----------------- package.json | 5 ++--- src/main/Main.js | 9 ++------- 3 files changed, 16 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4e7ab46..876b0de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -470,9 +470,9 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pino": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-6.10.0.tgz", - "integrity": "sha512-ZFGE/Wq930gFb1h0RI6S/QOfkyzNj94Xubwlyo4XpxNUgrG1C0iEqnlooG5Fymx6yrUUtEJ8j/u8NCGwgwTXaQ==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.11.1.tgz", + "integrity": "sha512-PoDR/4jCyaP1k2zhuQ4N0NuhaMtei+C9mUHBRRJQujexl/bq3JkeL2OC23ada6Np3zeUMHbO4TGzY2D/rwZX3w==", "requires": { "fast-redact": "^3.0.0", "fast-safe-stringify": "^2.0.7", @@ -483,9 +483,9 @@ } }, "pino-pretty": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-4.3.0.tgz", - "integrity": "sha512-uEc9SUCCGVEs0goZvyznKXBHtI1PNjGgqHviJHxOCEFEWZN6Z/IQKv5pO9gSdm/b+WfX+/dfheWhtZUyScqjlQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-4.5.0.tgz", + "integrity": "sha512-TtIzAq3JrPT4cYMZcXHypAXYV+MTE7ncAPUFoaz/1enVD2Loj+hV6RZsypYo85dm7SbBolW6fcIydOF28iGjsg==", "requires": { "@hapi/bourne": "^2.0.0", "args": "^5.0.1", @@ -501,9 +501,9 @@ } }, "pino-std-serializers": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.1.1.tgz", - "integrity": "sha512-Ud4+WzgEr/swOlfQdkxqKP2hlwuQlIqQ5YwYpo9MczNg2mpsKKyKgwQXW5KnP5tgH3/Cy9QRhAhLM8k1K+gfnA==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", + "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==" }, "psl": { "version": "1.8.0", @@ -620,9 +620,9 @@ } }, "sonic-boom": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.3.0.tgz", - "integrity": "sha512-4nX6OYvOYr6R76xfQKi6cZpTO3YSWe/vd+QdIfoH0lBy0MnPkeAbb2rRWgmgADkXUeCKPwO1FZAKlAVWAadELw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.3.2.tgz", + "integrity": "sha512-/B4tAuK2+hIlR94GhhWU1mJHWk5lt0CEuBvG0kvk1qIAzQc4iB1TieMio8DCZxY+Y7tsuzOxSUDOGmaUm3vXMg==", "requires": { "atomic-sleep": "^1.0.0", "flatstr": "^1.0.12" @@ -678,11 +678,6 @@ "has-flag": "^3.0.0" } }, - "systeminformation": { - "version": "4.34.7", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.34.7.tgz", - "integrity": "sha512-cS3FiSZasFgVNjO9CP3aZmTO2VHwXKG+JN6Z85nWRyOzxRMNbZe7Xzwrewp42hj+OPMC3hk7MrAFyu/qLM65Mw==" - }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", diff --git a/package.json b/package.json index 3bf590e..4d91bbf 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,8 @@ "dependencies": { "blessed": "^0.1.81", "node-binance-api": "^0.11.11", - "pino": "^6.10.0", - "pino-pretty": "^4.3.0", - "systeminformation": "^4.34.7" + "pino": "^6.11.1", + "pino-pretty": "^4.5.0" }, "license": "MIT" } diff --git a/src/main/Main.js b/src/main/Main.js index eae8b6e..9459e19 100644 --- a/src/main/Main.js +++ b/src/main/Main.js @@ -1,7 +1,6 @@ const CONFIG = require('../../config/config'); const logger = require('./Loggers'); const Util = require('./Util'); -const si = require('systeminformation'); const BinanceApi = require('./BinanceApi'); const MarketCache = require('./MarketCache'); const HUD = require('./HUD'); @@ -110,12 +109,8 @@ function displayStatusUpdate() { statusUpdate.cycleTimes = []; - Promise.all([ - si.currentLoad(), - SpeedTest.ping() - ]) - .then(([load, latency]) => { - logger.performance.debug(`CPU Load: ${(load.avgload * 100).toFixed(0)}% [${load.cpus.map(cpu => cpu.load.toFixed(0) + '%')}]`); + SpeedTest.ping() + .then((latency) => { logger.performance.debug(`API Latency: ${latency} ms`); }) .catch(err => logger.performance.warn(err.message)); From 72090cd253962b7223c8dc1b90a54aa1b8e52f6f Mon Sep 17 00:00:00 2001 From: Brandon Date: Tue, 16 Feb 2021 19:35:14 -0500 Subject: [PATCH 05/11] Update HUD Image --- README.md | 6 +++--- src/resources/mainDisplay.png | Bin 1782503 -> 24811 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b2c1270..95df3cf 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Binance Triangle Arbitrage -

- -

+
+ Main HUD display +
This app monitors the [Binance](https://www.binance.com) cryptocurrency exchange in search of triangle arbitrage opportunities. diff --git a/src/resources/mainDisplay.png b/src/resources/mainDisplay.png index 4c0d8f5fdb1c0adf426284018856a59b3e08606d..8c05a932e94a0927b36c9a27d2451021c2f1b06c 100644 GIT binary patch literal 24811 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 G?Ee6mjmWY9 literal 1782503 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%0D3JQs-Ok9${&C}GCd_o1|j59*x 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 From 687aa9987835936ff82e48ca102b8d6ae8bd4d02 Mon Sep 17 00:00:00 2001 From: Brandon Date: Sat, 27 Feb 2021 00:06:12 -0500 Subject: [PATCH 06/11] Warn about cpu calculation load --- src/main/Main.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/Main.js b/src/main/Main.js index 9459e19..ad9ef47 100644 --- a/src/main/Main.js +++ b/src/main/Main.js @@ -104,8 +104,15 @@ function displayStatusUpdate() { logger.performance.debug(`Tickers without recent depth cache update: [${tickersWithoutRecentDepthUpdate.sort()}]`); } - logger.performance.debug(`Cycles done per second: ${(statusUpdate.cycleTimes.length / (statusUpdateIntervalMS / 1000)).toFixed(2)}`); - logger.performance.debug(`Clock usage for cycles: ${(Util.sum(statusUpdate.cycleTimes) / statusUpdateIntervalMS * 100).toFixed(2)}%`); + const cyclesPerSecond = statusUpdate.cycleTimes.length / (statusUpdateIntervalMS / 1000); + logger.performance.debug(`Depth cache updates per second: ${cyclesPerSecond.toFixed(2)}`); + + const clockUsagePerCycle = Util.sum(statusUpdate.cycleTimes) / statusUpdateIntervalMS * 100; + if (clockUsagePerCycle > 50) { + logger.performance.warn(`CPU clock usage for calculations: ${clockUsagePerCycle.toFixed(2)}%`); + } else { + logger.performance.debug(`CPU clock usage for calculations: ${clockUsagePerCycle.toFixed(2)}%`); + } statusUpdate.cycleTimes = []; From 2e7a744d6e93507c841fe1213ddf5588ca7b19d0 Mon Sep 17 00:00:00 2001 From: Brandon Date: Sat, 27 Feb 2021 00:06:29 -0500 Subject: [PATCH 07/11] Remove unused code --- src/main/MarketCache.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/main/MarketCache.js b/src/main/MarketCache.js index c48c908..0a5b64f 100644 --- a/src/main/MarketCache.js +++ b/src/main/MarketCache.js @@ -59,13 +59,6 @@ const MarketCache = { }); }, - pruneDepthCacheAboveThreshold(depthCache, threshold) { - Object.values(depthCache).forEach(depth => { - depth.bids = Util.prune(depth.bids, threshold); - depth.asks = Util.prune(depth.asks, threshold); - }); - }, - getTickersWithoutDepthCacheUpdate(ms=Infinity) { return MarketCache.tickers.watching.filter(ticker => { const { eventTime } = BinanceApi.getDepthCacheUnsorted(ticker); From 15baccb9c3a7260630621aece37faf74ca4371e9 Mon Sep 17 00:00:00 2001 From: Brandon Date: Sat, 27 Feb 2021 02:03:17 -0500 Subject: [PATCH 08/11] Multiple Investment Bases --- config/README.md | 9 ++--- config/config.json.example | 9 ++--- src/main/CalculationNode.js | 2 +- src/main/Main.js | 22 ++++++------ src/main/MarketCache.js | 10 +++--- src/main/Validation.js | 71 +++++++++++++++++++++---------------- src/resources/docs/bases.md | 53 +++++++++++++++++++++++++++ 7 files changed, 123 insertions(+), 53 deletions(-) create mode 100644 src/resources/docs/bases.md diff --git a/config/README.md b/config/README.md index 5863f54..2b19576 100644 --- a/config/README.md +++ b/config/README.md @@ -25,19 +25,20 @@ Upon each version update you should copy the new syntax from `config.json.exampl ### `INVESTMENT` -#### `INVESTMENT.BASE` (String) +#### `INVESTMENT.[BASE]` ({}}) * Default: `"BTC"` * Description: Symbol which all triangle trades must start and end with +* [Extended Documentation](../src/resources/docs/bases.md) -#### `INVESTMENT.MIN` (Number) +#### `INVESTMENT.[BASE].MIN` (Number) * Default: `0.075` * Description: Minimum investment amount of the base currency to consider -#### `INVESTMENT.MAX` (Number) +#### `INVESTMENT.[BASE].MAX` (Number) * Default: `0.015` * Description: Maximum investment amount of the base currency to consider -#### `INVESTMENT.STEP` (Number) +#### `INVESTMENT.[BASE].STEP` (Number) * Default: `0.005` * Description: Increments at which investment amounts are considered between the min and max diff --git a/config/config.json.example b/config/config.json.example index 662d86a..b760264 100644 --- a/config/config.json.example +++ b/config/config.json.example @@ -6,10 +6,11 @@ }, "INVESTMENT": { - "BASE": "BTC", - "MIN": 0.010, - "MAX": 0.015, - "STEP": 0.005 + "BTC": { + "MIN": 0.010, + "MAX": 0.015, + "STEP": 0.005 + } }, "SCANNING": { diff --git a/src/main/CalculationNode.js b/src/main/CalculationNode.js index 1119430..ddc2995 100644 --- a/src/main/CalculationNode.js +++ b/src/main/CalculationNode.js @@ -29,7 +29,7 @@ const CalculationNode = { optimize(trade, depthSnapshot) { let bestCalculation = null; - for (let quantity = CONFIG.INVESTMENT.MIN; quantity <= CONFIG.INVESTMENT.MAX; quantity += CONFIG.INVESTMENT.STEP) { + for (let quantity = CONFIG.INVESTMENT[trade.symbol.a].MIN; quantity <= CONFIG.INVESTMENT[trade.symbol.a].MAX; quantity += CONFIG.INVESTMENT[trade.symbol.a].STEP) { const calculation = CalculationNode.calculate(quantity, trade, depthSnapshot); if (!bestCalculation || calculation.percent > bestCalculation.percent) { bestCalculation = calculation; diff --git a/src/main/Main.js b/src/main/Main.js index ad9ef47..d0fb48d 100644 --- a/src/main/Main.js +++ b/src/main/Main.js @@ -136,16 +136,18 @@ function checkBalances() { return BinanceApi.getBalances() .then(balances => { - if (balances[CONFIG.INVESTMENT.BASE].available < CONFIG.INVESTMENT.MIN) { - const msg = `Only detected ${balances[CONFIG.INVESTMENT.BASE].available} ${CONFIG.INVESTMENT.BASE}, but ${CONFIG.INVESTMENT.MIN} ${CONFIG.INVESTMENT.BASE} is required to satisfy your INVESTMENT.MIN configuration`; - logger.execution.error(msg); - throw new Error(msg); - } - if (balances[CONFIG.INVESTMENT.BASE].available < CONFIG.INVESTMENT.MAX) { - const msg = `Only detected ${balances[CONFIG.INVESTMENT.BASE].available} ${CONFIG.INVESTMENT.BASE}, but ${CONFIG.INVESTMENT.MAX} ${CONFIG.INVESTMENT.BASE} is required to satisfy your INVESTMENT.MAX configuration`; - logger.execution.error(msg); - throw new Error(msg); - } + Object.keys(CONFIG.INVESTMENT).forEach(BASE => { + if (balances[BASE].available < CONFIG.INVESTMENT[BASE].MIN) { + const msg = `Only detected ${balances[BASE].available} ${BASE}, but ${CONFIG.INVESTMENT[BASE].MIN} ${BASE} is required to satisfy your INVESTMENT.${BASE}.MIN configuration`; + logger.execution.error(msg); + throw new Error(msg); + } + if (balances[BASE].available < CONFIG.INVESTMENT[BASE].MAX) { + const msg = `Only detected ${balances[BASE].available} ${BASE}, but ${CONFIG.INVESTMENT[BASE].MAX} ${BASE} is required to satisfy your INVESTMENT.${BASE}.MAX configuration`; + logger.execution.error(msg); + throw new Error(msg); + } + }); if (balances['BNB'].available <= 0.001) { const msg = `Only detected ${balances['BNB'].available} BNB which is not sufficient to pay for trading fees via BNB`; logger.execution.error(msg); diff --git a/src/main/MarketCache.js b/src/main/MarketCache.js index 0a5b64f..83ca0e7 100644 --- a/src/main/MarketCache.js +++ b/src/main/MarketCache.js @@ -33,10 +33,12 @@ const MarketCache = { }); // Get trades from symbols - uniqueSymbols.forEach(symbol2 => { - uniqueSymbols.forEach(symbol3 => { - const trade = MarketCache.createTrade(baseSymbol, symbol2, symbol3); - if (trade) MarketCache.trades.push(trade); + Object.keys(CONFIG.INVESTMENT).forEach(symbol1 => { + uniqueSymbols.forEach(symbol2 => { + uniqueSymbols.forEach(symbol3 => { + const trade = MarketCache.createTrade(symbol1, symbol2, symbol3); + if (trade) MarketCache.trades.push(trade); + }); }); }); diff --git a/src/main/Validation.js b/src/main/Validation.js index efbdac1..97478cb 100644 --- a/src/main/Validation.js +++ b/src/main/Validation.js @@ -16,30 +16,47 @@ const Validation = { } // INVESTMENT - if (isNaN(CONFIG.INVESTMENT.MIN) || CONFIG.INVESTMENT.MIN <= 0) { - const msg = `Minimum investment quantity (INVESTMENT.MIN) must be a positive number`; - logger.execution.error(msg); - throw new Error(msg); - } - if (isNaN(CONFIG.INVESTMENT.MAX) || CONFIG.INVESTMENT.MAX <= 0) { - const msg = `Maximum investment quantity (INVESTMENT.MAX) must be a positive number`; - logger.execution.error(msg); - throw new Error(msg); - } - if (isNaN(CONFIG.INVESTMENT.STEP) || CONFIG.INVESTMENT.STEP <= 0) { - const msg = `Investment step size (INVESTMENT.STEP) must be a positive number`; - logger.execution.error(msg); - throw new Error(msg); - } - if (CONFIG.INVESTMENT.MIN > CONFIG.INVESTMENT.MAX) { - const msg = `Minimum investment quantity (INVESTMENT.MIN) cannot be greater than maximum investment quantity (INVESTMENT.MAX)`; - logger.execution.error(msg); - throw new Error(msg); - } - if (CONFIG.INVESTMENT.MIN !== CONFIG.INVESTMENT.MAX && (CONFIG.INVESTMENT.MIN + CONFIG.INVESTMENT.STEP) > CONFIG.INVESTMENT.MAX) { - const msg = `Step size (INVESTMENT.STEP) is too large for calculation optimization`; - logger.execution.warn(msg); - } + Object.keys(CONFIG.INVESTMENT).forEach(BASE => { + if (typeof BASE !== 'string') { + const msg = `Investment base (INVESTMENT.${BASE}) must be a string`; + logger.execution.error(msg); + throw new Error(msg); + } + if (BASE !== BASE.trim()) { + const msg = `Investment base (INVESTMENT.${BASE}) cannot contain whitespace`; + logger.execution.error(msg); + throw new Error(msg); + } + if (BASE !== BASE.toUpperCase()) { + const msg = `Investment base (INVESTMENT.${BASE}) must be uppercase`; + logger.execution.error(msg); + throw new Error(msg); + } + if (isNaN(CONFIG.INVESTMENT[BASE].MIN) || CONFIG.INVESTMENT[BASE].MIN <= 0) { + const msg = `Minimum investment quantity (INVESTMENT.${BASE}.MIN) must be a positive number`; + logger.execution.error(msg); + throw new Error(msg); + } + if (isNaN(CONFIG.INVESTMENT[BASE].MAX) || CONFIG.INVESTMENT[BASE].MAX <= 0) { + const msg = `Maximum investment quantity (INVESTMENT.${BASE}.MAX) must be a positive number`; + logger.execution.error(msg); + throw new Error(msg); + } + if (isNaN(CONFIG.INVESTMENT[BASE].STEP) || CONFIG.INVESTMENT[BASE].STEP <= 0) { + const msg = `Investment step size (INVESTMENT.${BASE}.STEP) must be a positive number`; + logger.execution.error(msg); + throw new Error(msg); + } + if (CONFIG.INVESTMENT[BASE].MIN > CONFIG.INVESTMENT[BASE].MAX) { + const msg = `Minimum investment quantity (INVESTMENT.${BASE}.MIN) cannot be greater than maximum investment quantity (INVESTMENT.${BASE}.MAX)`; + logger.execution.error(msg); + throw new Error(msg); + } + if (CONFIG.INVESTMENT[BASE].MIN !== CONFIG.INVESTMENT[BASE].MAX && (CONFIG.INVESTMENT[BASE].MIN + CONFIG.INVESTMENT[BASE].STEP) > CONFIG.INVESTMENT[BASE].MAX) { + const msg = `Step size (INVESTMENT.${BASE}.STEP) is too large for calculation optimization`; + logger.execution.warn(msg); + } + }); // SCANNING if (!Number.isInteger(CONFIG.SCANNING.DEPTH) || CONFIG.SCANNING.DEPTH <= 0) { @@ -72,12 +89,6 @@ const Validation = { logger.execution.error(msg); throw new Error(msg); } - if (CONFIG.SCANNING.WHITELIST.length > 0 && !CONFIG.SCANNING.WHITELIST.includes(CONFIG.INVESTMENT.BASE)) { - const msg = `Whitelist (SCANNING.WHITELIST) must include the base symbol of ${CONFIG.INVESTMENT.BASE}`; - logger.execution.debug(`Whitelist: [${CONFIG.SCANNING.WHITELIST}]`); - logger.execution.error(msg); - throw new Error(msg); - } // EXECUTION if (typeof CONFIG.EXECUTION.ENABLED !== 'boolean') { diff --git a/src/resources/docs/bases.md b/src/resources/docs/bases.md new file mode 100644 index 0000000..affb3a7 --- /dev/null +++ b/src/resources/docs/bases.md @@ -0,0 +1,53 @@ +# Investment Bases + +Each trade must begin and end with the same asset. This asset is referred to as the base asset in relation to the trade. +Every trade has one base asset and is commonly referred to as the `A` in the `A-B-C` simplification. +You must specify at least one base to start the application, and must hold a balance of all base assets. + +### Configuring Base Assets + +Base assets, and their associated configuration, are defined under the `INVESTMENT` configuration object. +Each json key is the trading symbol of the base asset, and the value is a json object containing the associated options. +Here is an example of configuring one base asset (BTC): + +```json +// config.json +{ + ... + + "INVESTMENT": { + "BTC": { // Base asset + "MIN": 0.010, + "MAX": 0.015, + "STEP": 0.005 + } + } + + ... +} +``` + +To declare multiple base assets, you simply add another key/value json entry to the `INVESTMENT` object. +Here is an example of two base assets (BTC and USDT) being configured: + +```json +// config.json +{ + ... + + "INVESTMENT": { + "BTC": { + "MIN": 0.010, // only applies to BTC + "MAX": 0.015, + "STEP": 0.005 + }, + "USDT": { + "MIN": 250, // only applies to USDT + "MAX": 500, + "STEP": 10 + } + }, + + ... +} +``` \ No newline at end of file From 52e74215e34c5aed75ccf586994d7d367128c0d3 Mon Sep 17 00:00:00 2001 From: Brandon Date: Sat, 27 Feb 2021 02:04:40 -0500 Subject: [PATCH 09/11] Async Market Initialization --- src/main/Main.js | 6 +----- src/main/MarketCache.js | 5 ++++- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/Main.js b/src/main/Main.js index d0fb48d..a3021b8 100644 --- a/src/main/Main.js +++ b/src/main/Main.js @@ -34,11 +34,7 @@ SpeedTest.multiPing(5) console.log(msg); logger.performance.info(msg); }) - .then(() => { - console.log(`Fetching exchange info ...`); - return BinanceApi.exchangeInfo(); - }) - .then(exchangeInfo => MarketCache.initialize(exchangeInfo, CONFIG.SCANNING.WHITELIST, CONFIG.INVESTMENT.BASE)) + .then(MarketCache.initialize) .then(checkBalances) .then(checkMarket) .then(() => { diff --git a/src/main/MarketCache.js b/src/main/MarketCache.js index 83ca0e7..ace5ebf 100644 --- a/src/main/MarketCache.js +++ b/src/main/MarketCache.js @@ -14,7 +14,10 @@ const MarketCache = { tickers: {} }, - initialize(exchangeInfo, whitelistSymbols, baseSymbol) { + async initialize() { + console.log(`Fetching exchange info ...`); + const exchangeInfo = await BinanceApi.exchangeInfo(); + // Mapping and Filters const isTRADING = (symbolObj) => symbolObj.status === 'TRADING'; const getLOT_SIZE = (symbolObj) => symbolObj.filterType === 'LOT_SIZE'; From cfa7b1b1f7ead26aeb5498418d6ee2649f050234 Mon Sep 17 00:00:00 2001 From: Brandon Date: Sat, 27 Feb 2021 02:05:54 -0500 Subject: [PATCH 10/11] Update Version --- package-lock.json | 1516 ++++++++++++++++++++++----------------------- package.json | 50 +- 2 files changed, 783 insertions(+), 783 deletions(-) diff --git a/package-lock.json b/package-lock.json index 876b0de..4813232 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,758 +1,758 @@ -{ - "name": "binance-triangle-arbitrage", - "version": "6.1.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@hapi/bourne": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.0.0.tgz", - "integrity": "sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg==" - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "args": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/args/-/args-5.0.1.tgz", - "integrity": "sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ==", - "requires": { - "camelcase": "5.0.0", - "chalk": "2.4.2", - "leven": "2.1.0", - "mri": "1.1.4" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "blessed": { - "version": "0.1.81", - "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", - "integrity": "sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk=" - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-redact": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.0.tgz", - "integrity": "sha512-a/S/Hp6aoIjx7EmugtzLqXmcNsyFszqbt6qQ99BdG61QjBZF6shNis0BYR6TsZOQ1twYc0FN2Xdhwwbv6+KD0w==" - }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, - "flatstr": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", - "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", - "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, - "joycon": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-2.2.5.tgz", - "integrity": "sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ==" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" - }, - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" - }, - "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "requires": { - "mime-db": "1.45.0" - } - }, - "mri": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", - "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node-binance-api": { - "version": "0.11.12", - "resolved": "https://registry.npmjs.org/node-binance-api/-/node-binance-api-0.11.12.tgz", - "integrity": "sha512-APQ/+2077v9o6mcAtaOKeIb+B/Nj6W/TUAiy36c1uH7PMRsmtIzBEal3ImJMF021j0xpqrAaSv/yFoOnesOoYw==", - "requires": { - "async": "^3.1.0", - "https-proxy-agent": "^3.0.1", - "request": "^2.88.0", - "socks-proxy-agent": "^4.0.2", - "string-hash": "^1.1.3", - "url": "^0.11.0", - "ws": "^7.2.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "pino": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-6.11.1.tgz", - "integrity": "sha512-PoDR/4jCyaP1k2zhuQ4N0NuhaMtei+C9mUHBRRJQujexl/bq3JkeL2OC23ada6Np3zeUMHbO4TGzY2D/rwZX3w==", - "requires": { - "fast-redact": "^3.0.0", - "fast-safe-stringify": "^2.0.7", - "flatstr": "^1.0.12", - "pino-std-serializers": "^3.1.0", - "quick-format-unescaped": "^4.0.1", - "sonic-boom": "^1.0.2" - } - }, - "pino-pretty": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-4.5.0.tgz", - "integrity": "sha512-TtIzAq3JrPT4cYMZcXHypAXYV+MTE7ncAPUFoaz/1enVD2Loj+hV6RZsypYo85dm7SbBolW6fcIydOF28iGjsg==", - "requires": { - "@hapi/bourne": "^2.0.0", - "args": "^5.0.1", - "chalk": "^4.0.0", - "dateformat": "^3.0.3", - "fast-safe-stringify": "^2.0.7", - "jmespath": "^0.15.0", - "joycon": "^2.2.5", - "pump": "^3.0.0", - "readable-stream": "^3.6.0", - "split2": "^3.1.1", - "strip-json-comments": "^3.1.1" - } - }, - "pino-std-serializers": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", - "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==" - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "quick-format-unescaped": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.1.tgz", - "integrity": "sha512-RyYpQ6Q5/drsJyOhrWHYMWTedvjTIat+FTwv0K4yoUxzvekw2aRHMQJLlnvt8UantkZg2++bEzD9EdxXqkWf4A==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" - }, - "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", - "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", - "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "requires": { - "es6-promisify": "^5.0.0" - } - } - } - }, - "sonic-boom": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.3.2.tgz", - "integrity": "sha512-/B4tAuK2+hIlR94GhhWU1mJHWk5lt0CEuBvG0kvk1qIAzQc4iB1TieMio8DCZxY+Y7tsuzOxSUDOGmaUm3vXMg==", - "requires": { - "atomic-sleep": "^1.0.0", - "flatstr": "^1.0.12" - } - }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "requires": { - "readable-stream": "^3.0.0" - } - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "ws": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", - "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==" - } - } -} +{ + "name": "binance-triangle-arbitrage", + "version": "6.2.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@hapi/bourne": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.0.0.tgz", + "integrity": "sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg==" + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "args": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/args/-/args-5.0.1.tgz", + "integrity": "sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ==", + "requires": { + "camelcase": "5.0.0", + "chalk": "2.4.2", + "leven": "2.1.0", + "mri": "1.1.4" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "blessed": { + "version": "0.1.81", + "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", + "integrity": "sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk=" + }, + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-redact": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.0.tgz", + "integrity": "sha512-a/S/Hp6aoIjx7EmugtzLqXmcNsyFszqbt6qQ99BdG61QjBZF6shNis0BYR6TsZOQ1twYc0FN2Xdhwwbv6+KD0w==" + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, + "flatstr": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", + "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", + "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + }, + "joycon": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-2.2.5.tgz", + "integrity": "sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ==" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" + }, + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" + }, + "mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "requires": { + "mime-db": "1.45.0" + } + }, + "mri": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node-binance-api": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/node-binance-api/-/node-binance-api-0.11.12.tgz", + "integrity": "sha512-APQ/+2077v9o6mcAtaOKeIb+B/Nj6W/TUAiy36c1uH7PMRsmtIzBEal3ImJMF021j0xpqrAaSv/yFoOnesOoYw==", + "requires": { + "async": "^3.1.0", + "https-proxy-agent": "^3.0.1", + "request": "^2.88.0", + "socks-proxy-agent": "^4.0.2", + "string-hash": "^1.1.3", + "url": "^0.11.0", + "ws": "^7.2.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pino": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.11.1.tgz", + "integrity": "sha512-PoDR/4jCyaP1k2zhuQ4N0NuhaMtei+C9mUHBRRJQujexl/bq3JkeL2OC23ada6Np3zeUMHbO4TGzY2D/rwZX3w==", + "requires": { + "fast-redact": "^3.0.0", + "fast-safe-stringify": "^2.0.7", + "flatstr": "^1.0.12", + "pino-std-serializers": "^3.1.0", + "quick-format-unescaped": "^4.0.1", + "sonic-boom": "^1.0.2" + } + }, + "pino-pretty": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-4.5.0.tgz", + "integrity": "sha512-TtIzAq3JrPT4cYMZcXHypAXYV+MTE7ncAPUFoaz/1enVD2Loj+hV6RZsypYo85dm7SbBolW6fcIydOF28iGjsg==", + "requires": { + "@hapi/bourne": "^2.0.0", + "args": "^5.0.1", + "chalk": "^4.0.0", + "dateformat": "^3.0.3", + "fast-safe-stringify": "^2.0.7", + "jmespath": "^0.15.0", + "joycon": "^2.2.5", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "split2": "^3.1.1", + "strip-json-comments": "^3.1.1" + } + }, + "pino-std-serializers": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", + "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "quick-format-unescaped": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.1.tgz", + "integrity": "sha512-RyYpQ6Q5/drsJyOhrWHYMWTedvjTIat+FTwv0K4yoUxzvekw2aRHMQJLlnvt8UantkZg2++bEzD9EdxXqkWf4A==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sonic-boom": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.3.2.tgz", + "integrity": "sha512-/B4tAuK2+hIlR94GhhWU1mJHWk5lt0CEuBvG0kvk1qIAzQc4iB1TieMio8DCZxY+Y7tsuzOxSUDOGmaUm3vXMg==", + "requires": { + "atomic-sleep": "^1.0.0", + "flatstr": "^1.0.12" + } + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "requires": { + "readable-stream": "^3.0.0" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", + "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==" + } + } +} diff --git a/package.json b/package.json index 4d91bbf..38b4661 100644 --- a/package.json +++ b/package.json @@ -1,25 +1,25 @@ -{ - "name": "binance-triangle-arbitrage", - "version": "6.1.0", - "repository": { - "type": "git", - "url": "https://github.com/bmino/binance-triangle-arbitrage.git" - }, - "author": { - "name": "Brandon Mino" - }, - "engines": { - "node": "14.15.4", - "npm": "6.14.10" - }, - "scripts": { - "start": "node src/main/Main.js" - }, - "dependencies": { - "blessed": "^0.1.81", - "node-binance-api": "^0.11.11", - "pino": "^6.11.1", - "pino-pretty": "^4.5.0" - }, - "license": "MIT" -} +{ + "name": "binance-triangle-arbitrage", + "version": "6.2.0", + "repository": { + "type": "git", + "url": "https://github.com/bmino/binance-triangle-arbitrage.git" + }, + "author": { + "name": "Brandon Mino" + }, + "engines": { + "node": "14.15.4", + "npm": "6.14.10" + }, + "scripts": { + "start": "node src/main/Main.js" + }, + "dependencies": { + "blessed": "^0.1.81", + "node-binance-api": "^0.11.11", + "pino": "^6.11.1", + "pino-pretty": "^4.5.0" + }, + "license": "MIT" +} From fa3b4bd45831bffb4ef57b15f69bf462ba16a7db Mon Sep 17 00:00:00 2001 From: Brandon Date: Sat, 27 Feb 2021 02:13:26 -0500 Subject: [PATCH 11/11] Doc Tweaks --- config/README.md | 6 +++--- src/resources/docs/bases.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/README.md b/config/README.md index 2b19576..35c7656 100644 --- a/config/README.md +++ b/config/README.md @@ -25,9 +25,9 @@ Upon each version update you should copy the new syntax from `config.json.exampl ### `INVESTMENT` -#### `INVESTMENT.[BASE]` ({}}) -* Default: `"BTC"` -* Description: Symbol which all triangle trades must start and end with +#### `INVESTMENT.[BASE]` (Object) +* Default: `"BTC": {...}` +* Description: Symbol which triangle trades must start and end with * [Extended Documentation](../src/resources/docs/bases.md) #### `INVESTMENT.[BASE].MIN` (Number) diff --git a/src/resources/docs/bases.md b/src/resources/docs/bases.md index affb3a7..4ce6f1e 100644 --- a/src/resources/docs/bases.md +++ b/src/resources/docs/bases.md @@ -1,9 +1,9 @@ # Investment Bases -Each trade must begin and end with the same asset. This asset is referred to as the base asset in relation to the trade. Every trade has one base asset and is commonly referred to as the `A` in the `A-B-C` simplification. You must specify at least one base to start the application, and must hold a balance of all base assets. + ### Configuring Base Assets Base assets, and their associated configuration, are defined under the `INVESTMENT` configuration object.