├── binance-backtest ├── .gitignore ├── package.json ├── README.md └── index.js ├── support-resistance ├── .gitignore ├── Kline.js ├── package.json ├── README.md ├── index.js ├── Candlechart.js └── package-lock.json ├── binance-monitor ├── .gitignore ├── .env.example ├── index.js ├── package.json └── README.md ├── binance-spot ├── .gitignore ├── package.json ├── .env.example ├── README.md ├── index.js └── package-lock.json ├── binance-rsi ├── .env.example ├── package.json ├── README.md └── index.js ├── binance-sma-ema ├── .env.example ├── package.json ├── README.md ├── index.js └── package-lock.json ├── binance-timerbot ├── .env.example ├── package.json ├── index.js ├── api.js └── README.md ├── binance-trailing-stop ├── .env.example ├── package.json ├── README.md ├── index.js └── package-lock.json ├── tradingview-webhook ├── .env.example ├── package.json ├── README.md └── index.js ├── binance-tape-reading ├── package.json ├── README.md └── index.js ├── binance-scrapper ├── package.json ├── README.md └── index.js ├── binance-historic-price ├── package.json ├── README.md ├── index.js └── package-lock.json ├── binance-arbitrage ├── .env.example ├── package.json ├── stream.js ├── api.js ├── README.md ├── index.js └── package-lock.json ├── binance-candles ├── package.json ├── README.md ├── index.js └── package-lock.json ├── binance-top-gl ├── package.json ├── README.md ├── index.js └── package-lock.json ├── binance-calculator ├── package.json ├── .env.example ├── README.md ├── index.js ├── mock.json └── package-lock.json ├── binance-futures ├── .env.example ├── package.json ├── index.js ├── README.md └── api.js ├── binance-launchbot ├── package.json ├── .env.example ├── api.js ├── README.md ├── index.js └── package-lock.json ├── binance-telegram ├── package.json ├── .env.example ├── README.md ├── api.js ├── index.js └── package-lock.json ├── binance-copytrade-spot ├── .env.example ├── package.json ├── README.md ├── api.js ├── index.js └── package-lock.json ├── mercado-bitcoin ├── package.json ├── .env.example ├── README.md ├── index.js └── package-lock.json ├── bitypreco-arbitrage ├── .env.example ├── package.json ├── README.md ├── index.js └── package-lock.json ├── binance-copytrade-futures ├── package.json ├── .env.example ├── README.md ├── api.js ├── index.js └── package-lock.json ├── README.md └── .gitignore /binance-backtest/.gitignore: -------------------------------------------------------------------------------- 1 | data/* -------------------------------------------------------------------------------- /support-resistance/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /binance-monitor/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env -------------------------------------------------------------------------------- /binance-spot/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env -------------------------------------------------------------------------------- /binance-rsi/.env.example: -------------------------------------------------------------------------------- 1 | # Ex: BTCUSDT (always uppercase) 2 | SYMBOL= 3 | 4 | # Ex: 1d, 1h, 15m, etc 5 | INTERVAL=1h 6 | 7 | # Ex: 14 8 | PERIOD=14 -------------------------------------------------------------------------------- /binance-monitor/.env.example: -------------------------------------------------------------------------------- 1 | #Produção: wss://stream.binance.com:9443/ws - Desenvolvimento: wss://stream.testnet.binance.vision/ws 2 | STREAM_URL= 3 | 4 | #o par de moedas que você vai monitorar. Ex: btcusdt 5 | SYMBOL= -------------------------------------------------------------------------------- /binance-sma-ema/.env.example: -------------------------------------------------------------------------------- 1 | # Ex: https://api.binance.com/api (prod) 2 | API_URL= 3 | 4 | # Ex: BTCUSDT (keep uppercase) 5 | SYMBOL= 6 | 7 | # Ex: 1d, 1h, 15m, etc 8 | INTERVAL=1h 9 | 10 | # Ex: 14 11 | PERIOD=14 -------------------------------------------------------------------------------- /binance-timerbot/.env.example: -------------------------------------------------------------------------------- 1 | #ex: https://testnet.binance.vision/api 2 | API_URL= 3 | 4 | #ex: abc123. Crie em https://testnet.binance.vision 5 | API_KEY= 6 | 7 | #ex: abc123. Crie em https://testnet.binance.vision 8 | SECRET_KEY= -------------------------------------------------------------------------------- /binance-trailing-stop/.env.example: -------------------------------------------------------------------------------- 1 | #Production: https://api.binance.com/api - Development: https://testnet.binance.vision/api 2 | API_URL= 3 | 4 | # Your Binance API credentials: https://www.youtube.com/watch?v=-6bF6a6ecIs 5 | API_KEY= 6 | SECRET_KEY= -------------------------------------------------------------------------------- /tradingview-webhook/.env.example: -------------------------------------------------------------------------------- 1 | #ex: 3000 2 | PORT= 3 | 4 | #ex: https://api.binance.com/api or https://testnet.binance.vision/api 5 | API_URL= 6 | 7 | #Your api key at Binance 8 | API_KEY= 9 | 10 | #Your API secret at Binance 11 | SECRET_KEY= -------------------------------------------------------------------------------- /support-resistance/Kline.js: -------------------------------------------------------------------------------- 1 | module.exports = class Kline { 2 | constructor(arr){ 3 | this.time = arr[0]; 4 | this.open = parseFloat(arr[1]); 5 | this.high = parseFloat(arr[2]); 6 | this.low = parseFloat(arr[3]); 7 | this.close = parseFloat(arr[4]); 8 | } 9 | } -------------------------------------------------------------------------------- /support-resistance/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "support-resistance", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^1.2.1" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /binance-backtest/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-backtest", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index" 8 | }, 9 | "keywords": [], 10 | "author": "LuizTools", 11 | "license": "MIT", 12 | "dependencies": { 13 | "axios": "^1.7.7" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /binance-tape-reading/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-book", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index" 8 | }, 9 | "keywords": [], 10 | "author": "LuizTools", 11 | "license": "MIT", 12 | "dependencies": { 13 | "axios": "^1.7.9" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /binance-scrapper/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-scrapper", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index" 8 | }, 9 | "keywords": [], 10 | "author": "LuizTools", 11 | "license": "MIT", 12 | "dependencies": { 13 | "puppeteer": "^22.6.5" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /binance-historic-price/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-historic-price", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "start": "node index" 7 | }, 8 | "keywords": [], 9 | "author": "LuizTools", 10 | "license": "MIT", 11 | "description": "", 12 | "dependencies": { 13 | "axios": "^1.7.9" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /binance-monitor/index.js: -------------------------------------------------------------------------------- 1 | //index.js 2 | const WebSocket = require('ws'); 3 | const ws = new WebSocket(`${process.env.STREAM_URL}/${process.env.SYMBOL}@ticker`); 4 | 5 | ws.onmessage = (event) => { 6 | console.clear(); 7 | const obj = JSON.parse(event.data); 8 | console.log(`Symbol: ${obj.s}`); 9 | console.log(`Ask Price: ${obj.a}`); 10 | } 11 | -------------------------------------------------------------------------------- /binance-arbitrage/.env.example: -------------------------------------------------------------------------------- 1 | #ex: https://api.binance.com/api ou https://testnet.binance.vision/api 2 | API_URL= 3 | 4 | #ex: wss://stream.binance.com:9443/ws ou wss://stream.testnet.binance.vision/ws 5 | STREAM_URL= 6 | 7 | #ex: 3000 8 | CRAWLER_INTERVAL= 9 | 10 | #ex: 1.003 11 | PROFITABILITY= 12 | 13 | #ex: USDT 14 | QUOTE= 15 | 16 | #ex: 10 17 | AMOUNT= -------------------------------------------------------------------------------- /binance-candles/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-candles", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index" 8 | }, 9 | "keywords": [], 10 | "author": "LuizTools", 11 | "license": "MIT", 12 | "dependencies": { 13 | "axios": "^1.6.8", 14 | "ws": "^8.17.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /binance-sma-ema/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-ema", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index" 8 | }, 9 | "keywords": [], 10 | "author": "LuizTools", 11 | "license": "MIT", 12 | "dependencies": { 13 | "axios": "^1.6.7", 14 | "dotenv": "^16.4.5" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /binance-top-gl/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-top-gl", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index" 8 | }, 9 | "keywords": [], 10 | "author": "LuizTools", 11 | "license": "MIT", 12 | "dependencies": { 13 | "axios": "^1.6.8", 14 | "ws": "^8.17.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /binance-calculator/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-calculator", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "start": "node index" 7 | }, 8 | "keywords": [], 9 | "author": "LuizTools", 10 | "license": "MIT", 11 | "description": "", 12 | "dependencies": { 13 | "axios": "^1.8.2", 14 | "dotenv": "^16.4.7" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /binance-futures/.env.example: -------------------------------------------------------------------------------- 1 | #ex: https://demo-fapi.binance.com/fapi (demo) ou https://fapi.binance.com/fapi (prod) 2 | API_URL= 3 | 4 | #ex: wss://fstream.binancefuture.com/ws/ (demo) ou wss://fstream.binance.com/ws/ (prod) 5 | STREAM_URL= 6 | 7 | #Your Futures API Key. Ex: https://www.youtube.com/watch?v=Aex5ytH_ENg 8 | API_KEY= 9 | 10 | #Your Futures API Key Secret 11 | SECRET_KEY= -------------------------------------------------------------------------------- /binance-launchbot/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "launchbot", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^1.3.4", 14 | "dotenv": "^16.0.3", 15 | "ws": "^8.12.1" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /binance-trailing-stop/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-trailing-stop", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index" 8 | }, 9 | "keywords": [], 10 | "author": "LuizTools", 11 | "license": "MIT", 12 | "dependencies": { 13 | "axios": "^1.6.8", 14 | "dotenv": "^16.4.5" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /binance-rsi/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-rsi", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node -r dotenv/config index", 8 | "gpt": "node -r dotenv/config gpt" 9 | }, 10 | "keywords": [], 11 | "author": "LuizTools", 12 | "license": "MIT", 13 | "dependencies": { 14 | "dotenv": "^16.4.4" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /binance-telegram/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-telegram", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^1.4.0", 14 | "dotenv": "^16.0.3", 15 | "telegraf": "^4.12.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /binance-timerbot/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "timerbot", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^0.24.0", 14 | "dotenv-safe": "^8.2.0", 15 | "node-schedule": "^2.1.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /binance-launchbot/.env.example: -------------------------------------------------------------------------------- 1 | #ex: BTCUSDT 2 | SYMBOL= 3 | 4 | #ex: 1.01 = 1% 5 | PROFIT= 6 | 7 | #ex: 10 8 | BUY_QTY= 9 | 10 | #ex: https://testnet.binance.vision/api ou https://api.binance.com/api 11 | API_URL= 12 | 13 | #ex: abc123. Saiba mais em https://www.youtube.com/watch?v=-6bF6a6ecIs 14 | API_KEY= 15 | 16 | #ex: abc123. Saiba mais em https://www.youtube.com/watch?v=-6bF6a6ecIs 17 | SECRET_KEY= -------------------------------------------------------------------------------- /binance-arbitrage/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-arbitrage", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node -r dotenv/config index" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^0.27.2", 14 | "dotenv": "^16.0.1", 15 | "ws": "^8.6.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /binance-monitor/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-spot", 3 | "version": "1.0.0", 4 | "description": "Simple trader bot for Binance Spot.", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node -r dotenv/config index" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "dotenv": "^16.0.3", 14 | "ws": "^8.11.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /tradingview-webhook/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tradingview-webhook", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "npx nodemon index" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^1.2.2", 14 | "dotenv": "^16.0.3", 15 | "express": "^4.18.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /binance-futures/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-futures", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node -r dotenv/config index" 8 | }, 9 | "keywords": [], 10 | "author": "LuizTools", 11 | "license": "MIT", 12 | "dependencies": { 13 | "axios": "^1.12.2", 14 | "dotenv": "^17.2.2", 15 | "ws": "^8.18.3" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /binance-copytrade-spot/.env.example: -------------------------------------------------------------------------------- 1 | #EX: https://testnet.binance.vision/api 2 | BINANCE_API_URL= 3 | 4 | #EX: wss://stream.testnet.binance.vision/ws 5 | BINANCE_WS_URL= 6 | 7 | #Ex: https://www.youtube.com/watch?v=-6bF6a6ecIs 8 | TRADER0_API_KEY= 9 | 10 | #Ex: https://www.youtube.com/watch?v=-6bF6a6ecIs 11 | TRADER0_API_SECRET= 12 | 13 | # For each copy trader, add a pair of... 14 | # TRADER1_API_KEY= 15 | # TRADER1_API_SECRET= -------------------------------------------------------------------------------- /mercado-bitcoin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mercado-bitcoin", 3 | "version": "1.0.0", 4 | "description": "Simple trader bot for Mercado Bitcoin (v4).", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^1.5.0", 14 | "dotenv": "^16.3.1", 15 | "ws": "^8.14.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /binance-spot/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-spot", 3 | "version": "1.0.0", 4 | "description": "Simple trader bot for Binance Spot.", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node -r dotenv/config index" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^1.2.0", 14 | "dotenv": "^16.0.3", 15 | "ws": "^8.11.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /bitypreco-arbitrage/.env.example: -------------------------------------------------------------------------------- 1 | # A sua assinatura de API da BityPreço 2 | SIGNATURE= 3 | 4 | # A sua chave de API da BityPreço 5 | API_KEY= 6 | 7 | # O seu gatilho (preço) de compra. Ex: 27000 8 | BUY_TRIGGER= 9 | 10 | # O quanto você quer gastar na compra. Ex: 10 11 | BUY_AMOUNT= 12 | 13 | # O seu percentual de saída (multiplicador). Ex: 1.1 (10%) 14 | PROFITABILITY= 15 | 16 | # O mercado que vai negociar. Ex: BTC-BRL 17 | COINPAIR= -------------------------------------------------------------------------------- /binance-copytrade-spot/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-copytrade-spot", 3 | "version": "1.0.0", 4 | "description": "Simple copy trader bot for Binance Spot.", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^1.3.4", 14 | "dotenv": "^16.0.3", 15 | "ws": "^8.13.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /binance-arbitrage/stream.js: -------------------------------------------------------------------------------- 1 | const WebSocket = require('ws'); 2 | 3 | const ws = new WebSocket(`${process.env.STREAM_URL}/!miniTicker@arr`); 4 | 5 | const BOOK = {}; 6 | 7 | ws.onmessage = async (event) => { 8 | const arr = JSON.parse(event.data); 9 | arr.map(obj => BOOK[obj.s] = { price: parseFloat(obj.c) }); 10 | } 11 | 12 | function getBook(symbol){ 13 | return BOOK[symbol]; 14 | } 15 | 16 | module.exports = { 17 | getBook 18 | } -------------------------------------------------------------------------------- /binance-copytrade-futures/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-copytrade-futures", 3 | "version": "1.0.0", 4 | "description": "Simple copy trader bot for Binance Futures.", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^1.4.0", 14 | "dotenv": "^16.0.3", 15 | "ws": "^8.13.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /tradingview-webhook/README.md: -------------------------------------------------------------------------------- 1 | # Trading View WebHook 2 | 3 | Webhook to receive signals from Trading View. 4 | 5 | Tutorial here: https://www.luiztools.com.br/post/como-criar-webhooks-no-tradingview-com-node-js/ 6 | 7 | ## More 8 | 9 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 10 | 11 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 12 | 13 | Me siga nas redes sociais: https://about.me/luiztools -------------------------------------------------------------------------------- /binance-calculator/.env.example: -------------------------------------------------------------------------------- 1 | # coinpair to calc PnL (all uppercase). Ex: BTCUSDT 2 | SYMBOL= 3 | 4 | # if you use commission in BNB or not. Ex: true 5 | BNB_COMMISSION= 6 | 7 | # if you want to specify a start timestamp to list orders. Ex: 0 8 | START_TIME= 9 | 10 | # The API URL. Ex: https://api.binance.com (production) or https://testnet.binance.vision (dev/test) 11 | API_URL= 12 | 13 | # Your API Key 14 | API_KEY= 15 | 16 | # Your API Secret 17 | API_SECRET= -------------------------------------------------------------------------------- /bitypreco-arbitrage/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bitypreco-arbitrage", 3 | "version": "1.0.0", 4 | "description": "A simple arbitrage bot using BityPreço exchange API.", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^1.5.1", 14 | "dotenv": "^16.3.1", 15 | "phoenix-channels": "^1.0.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /binance-arbitrage/api.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | 3 | async function exchangeInfo() { 4 | const response = await axios.get(`${process.env.API_URL}/v3/exchangeInfo`); 5 | return response.data.symbols.filter(s => s.status === 'TRADING').map(s => { 6 | return { 7 | symbol: s.symbol, 8 | base: s.baseAsset, 9 | quote: s.quoteAsset 10 | } 11 | }); 12 | } 13 | 14 | module.exports = { exchangeInfo } 15 | -------------------------------------------------------------------------------- /support-resistance/README.md: -------------------------------------------------------------------------------- 1 | # support-resistance 2 | 3 | Algorithm for detect the support/resistance chart pattern. 4 | 5 | ## How To Run 6 | 7 | 1. git clone 8 | 2. cd support-resistance 9 | 3. npm install 10 | 4. check the consts in index.js 11 | 5. npm start 12 | 13 | ## Referências: 14 | 15 | Vídeo em https://youtu.be/-yHHXICYI2o 16 | 17 | Me siga nas redes sociais: https://about.me/luiztools 18 | 19 | Receba minhas novidades no Telegram: https://t.me/luiznews -------------------------------------------------------------------------------- /binance-copytrade-futures/.env.example: -------------------------------------------------------------------------------- 1 | #EX: https://demo-fapi.binance.com/fapi (demo) ou https://fapi.binance.com/fapi (prod) 2 | BINANCE_API_URL= 3 | 4 | #EX: wss://fstream.binancefuture.com/ws/ (demo) ou wss://fstream.binance.com/ws/ (prod) 5 | BINANCE_WS_URL= 6 | 7 | #Ex: https://www.youtube.com/watch?v=Aex5ytH_ENg 8 | TRADER0_API_KEY= 9 | 10 | #Ex: https://www.youtube.com/watch?v=Aex5ytH_ENg 11 | TRADER0_API_SECRET= 12 | 13 | # For each copy trader, add a pair of... 14 | # TRADER1_API_KEY= 15 | # TRADER1_API_SECRET= -------------------------------------------------------------------------------- /binance-spot/.env.example: -------------------------------------------------------------------------------- 1 | #Produção: https://api.binance.com/api - Desenvolvimento: https://testnet.binance.vision/api 2 | API_URL= 3 | 4 | #Produção: wss://stream.binance.com:9443/ws - Desenvolvimento: wss://stream.testnet.binance.vision/ws 5 | STREAM_URL= 6 | 7 | # Como criar credenciais da Binance https://www.youtube.com/watch?v=-6bF6a6ecIs 8 | API_KEY= 9 | SECRET_KEY= 10 | 11 | #Quanto você quer ganhar em cima das compras? 1.1 = 10% 12 | PROFITABILITY= 13 | 14 | #o par de moedas que você vai negociar 15 | SYMBOL= -------------------------------------------------------------------------------- /binance-telegram/.env.example: -------------------------------------------------------------------------------- 1 | # O token do seu bot de telegram / Your telegram bot token 2 | BOT_TOKEN= 3 | 4 | # A sua chave de API da Binance Futures / Your Binance Futures API Key. Ex: https://www.youtube.com/watch?v=FCzgqr2P0_g 5 | API_KEY= 6 | 7 | # O seu segredo de API da Binance Futures / Your Binance Futures API Secret. Ex: https://www.youtube.com/watch?v=FCzgqr2P0_g 8 | SECRET_KEY= 9 | 10 | # A URL da API Binance que você vai usar / # Your Binance API URL. Ex: https://testnet.binancefuture.com/fapi ou https://fapi.binance.com/fapi 11 | API_URL= 12 | -------------------------------------------------------------------------------- /binance-timerbot/index.js: -------------------------------------------------------------------------------- 1 | require('dotenv-safe').config(); 2 | const api = require('./api'); 3 | 4 | const nodeSchedule = require('node-schedule'); 5 | 6 | let order; 7 | 8 | const dt = new Date(2022, 1, 20, 8, 59, 59, 82); 9 | const job = nodeSchedule.scheduleJob(dt, async () => { 10 | order = await api.newQuoteOrder('LOKABNB', 0.1); 11 | let order2; 12 | if (order.status === 'FILLED') { 13 | order2 = await api.newOrder('LOKABNB', order.executedQty, 0, 'SELL', 'LIMIT'); 14 | } 15 | 16 | console.log(order); 17 | console.log(order2); 18 | }) -------------------------------------------------------------------------------- /mercado-bitcoin/.env.example: -------------------------------------------------------------------------------- 1 | # .env.example, committed to repo 2 | 3 | # O par de moedas que vai negociar. Ex: BTC-BRL 4 | SYMBOL= 5 | 6 | # O par de moedas que vai monitorar. Ex: BRLBTC 7 | STREAM_ID= 8 | 9 | # Credenciais do MercadoBitcoin. Ex: https://suporte.mercadobitcoin.com.br/hc/pt-br/articles/360040781391-Como-gerar-uma-chave-de-API 10 | ACCOUNT_ID= 11 | API_KEY= 12 | API_SECRET= 13 | 14 | # Gatilho de compra (preço) 15 | BUY_PRICE= 16 | 17 | # Quantidade de compra. Ex: 0.0001 18 | BUY_QTY= 19 | 20 | #Quanto você quer ganhar em cima das compras? 1.1 = 10% 21 | PROFITABILITY= -------------------------------------------------------------------------------- /binance-candles/README.md: -------------------------------------------------------------------------------- 1 | # binance-candles 2 | Monitor for all coins candles (USDT pairs) from Binance Spot. 3 | 4 | ## How to Run 5 | 6 | 1. git clone 7 | 2. npm install 8 | 3. npm start 9 | 10 | ## Mais informações 11 | 12 | Para ler o tutorial (incluindo vídeo), acesse: https://www.luiztools.com.br/post/como-monitorar-todas-moedas-da-binance-com-js 13 | 14 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 15 | 16 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 17 | 18 | Me siga nas redes sociais: https://about.me/luiztools 19 | -------------------------------------------------------------------------------- /binance-tape-reading/README.md: -------------------------------------------------------------------------------- 1 | # binance-tape-reading 2 | Simple indicators for Tape Reading strategies. 3 | 4 | ## How to Run 5 | 6 | 1. git clone 7 | 2. npm install 8 | 5. npm start 9 | 10 | ## Mais informações 11 | 12 | Para ler o tutorial do script (incluindo vídeo), acesse: https://www.luiztools.com.br/post/monitor-tape-reading-na-binance-com-node-js/ 13 | 14 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 15 | 16 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 17 | 18 | Me siga nas redes sociais: https://about.me/luiztools 19 | -------------------------------------------------------------------------------- /binance-top-gl/README.md: -------------------------------------------------------------------------------- 1 | # binance-top-gl 2 | Monitor for top gainers and losers (% USD in last minute) from Binance Spot. 3 | 4 | ## How to Run 5 | 6 | 1. git clone 7 | 2. npm install 8 | 3. npm start 9 | 10 | ## Mais informações 11 | 12 | Para ler o tutorial (incluindo vídeo), acesse: https://www.luiztools.com.br/post/como-monitorar-top-gainers-losers-mercado-cripto-node-js/ 13 | 14 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 15 | 16 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 17 | 18 | Me siga nas redes sociais: https://about.me/luiztools 19 | -------------------------------------------------------------------------------- /bitypreco-arbitrage/README.md: -------------------------------------------------------------------------------- 1 | # bitypreco-arbitrage 2 | 3 | A simple arbitrage bot using BityPreço exchange API. 4 | 5 | ## How to run 6 | 1. Enter in bitypreco-arbitrage folder 7 | 2. npm install 8 | 3. node index (adjust as you like) 9 | 10 | Leia o tutorial ou assista aos vídeos em meu blog: https://www.luiztools.com.br/post/como-criar-um-bot-de-arbitragem-de-criptomoedas-na-bitypreco-com-nodejs/ 11 | 12 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 13 | 14 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 15 | 16 | Me siga nas redes sociais: https://about.me/luiztools -------------------------------------------------------------------------------- /binance-monitor/README.md: -------------------------------------------------------------------------------- 1 | # binance-monitor 2 | Simple cryptocurrency monitor for Binance Spot. 3 | 4 | ## How to Run 5 | 6 | 1. git clone 7 | 2. npm install 8 | 3. copy .env.example as .env 9 | 4. fill the .env 10 | 5. npm start 11 | 12 | ## Mais informações 13 | 14 | Para ler o tutorial do bot para Binance (incluindo vídeo), acesse: https://www.luiztools.com.br/post/como-monitorar-precos-de-criptomoedas-em-node-js/ 15 | 16 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 17 | 18 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 19 | 20 | Me siga nas redes sociais: https://about.me/luiztools 21 | -------------------------------------------------------------------------------- /binance-arbitrage/README.md: -------------------------------------------------------------------------------- 1 | # binance-arbitrage 2 | 3 | A simple triangular arbitrage monitor using Binance exchange APIs & streams. 4 | 5 | ## How to run 6 | 1. Enter in binance-arbitrage folder 7 | 2. Copy .env.example as .env 8 | 3. fill .env variables 9 | 4. npm install 10 | 5. npm start 11 | 12 | Leia o tutorial ou assista aos vídeos em meu blog: https://www.luiztools.com.br/post/algoritmo-para-arbitragem-triangular-com-bot/ 13 | 14 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 15 | 16 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 17 | 18 | Me siga nas redes sociais: https://about.me/luiztools -------------------------------------------------------------------------------- /binance-scrapper/README.md: -------------------------------------------------------------------------------- 1 | # binance-scrapper 2 | Simple webscrapper to discover new cryptos that will launch at Binance (Launchpool & Launchpad). 3 | 4 | ## How to Run 5 | 6 | 1. git clone 7 | 2. npm install 8 | 3. npm start 9 | 10 | ## Mais informações 11 | 12 | Para ler o tutorial do bot scrapper para Binance, acesse: https://www.luiztools.com.br/post/como-criar-robo-bot-monitorar-lancamentos-binance-launchpool-launchpad 13 | 14 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 15 | 16 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 17 | 18 | Me siga nas redes sociais: https://about.me/luiztools 19 | -------------------------------------------------------------------------------- /binance-backtest/README.md: -------------------------------------------------------------------------------- 1 | # binance-backtest 2 | Simple cryptocurrency strategy backtest example. 3 | 4 | ## How to Run 5 | 6 | 1. git clone 7 | 2. npm install 8 | 4. adjust index.js initial constants 9 | 5. npm start 10 | 11 | ## Mais informações 12 | 13 | Para ler o tutorial do backtest para Binance (incluindo vídeo), acesse: https://www.luiztools.com.br/post/como-calcular-indicadores-tecnicos-em-robo-trader-com-javascript-rsi 14 | 15 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 16 | 17 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 18 | 19 | Me siga nas redes sociais: https://about.me/luiztools 20 | -------------------------------------------------------------------------------- /binance-rsi/README.md: -------------------------------------------------------------------------------- 1 | # binance-rsi 2 | Simple cryptocurrency technical indicator project (RSI example). 3 | 4 | ## How to Run 5 | 6 | 1. git clone 7 | 2. npm install 8 | 3. copy .env.example as .env 9 | 4. fill the .env 10 | 5. npm start 11 | 12 | ## Mais informações 13 | 14 | Para ler o tutorial do bot para Binance (incluindo vídeo), acesse: https://www.luiztools.com.br/post/como-calcular-indicadores-tecnicos-em-robo-trader-com-javascript-rsi 15 | 16 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 17 | 18 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 19 | 20 | Me siga nas redes sociais: https://about.me/luiztools 21 | -------------------------------------------------------------------------------- /binance-historic-price/README.md: -------------------------------------------------------------------------------- 1 | # binance-historic-price 2 | Simple script to obtain historical prices for cryptos, incluind hist fiat price at the same moment. 3 | 4 | ## How to Run 5 | 6 | 1. git clone 7 | 2. npm install 8 | 3. npm start 9 | 10 | ## Mais informações 11 | 12 | Para ler o tutorial do script (incluindo vídeo), acesse: https://www.luiztools.com.br/post/como-obter-precos-historicos-de-criptomoedas-na-binance-com-js/ (a partir de 28/01) 13 | 14 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 15 | 16 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 17 | 18 | Me siga nas redes sociais: https://about.me/luiztools 19 | -------------------------------------------------------------------------------- /binance-sma-ema/README.md: -------------------------------------------------------------------------------- 1 | # binance-sma-ema 2 | Simple cryptocurrency technical indicator project (SMA and EMA examples). 3 | 4 | ## How to Run 5 | 6 | 1. git clone 7 | 2. npm install 8 | 3. copy .env.example as .env 9 | 4. fill the .env 10 | 5. npm start 11 | 12 | ## Mais informações 13 | 14 | Para ler o tutorial do bot para Binance (incluindo vídeo), acesse: https://www.luiztools.com.br/post/como-calcular-indicadores-tecnicos-em-robo-trader-com-javascript-sma-ema 15 | 16 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 17 | 18 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 19 | 20 | Me siga nas redes sociais: https://about.me/luiztools 21 | -------------------------------------------------------------------------------- /binance-trailing-stop/README.md: -------------------------------------------------------------------------------- 1 | # binance-trailing-stop 2 | Trailing Stop crypto bot example, for Binance Spot. 3 | 4 | ## How to Run 5 | 6 | 1. git clone 7 | 2. cd binance-trailing-stop 8 | 3. copy .env.example as .env 9 | 4. fill .env variables 10 | 5. adjust your symbol and strategy at index.js 11 | 6. npm install 12 | 7. npm start 13 | 14 | ## Mais informações 15 | 16 | Para ler o tutorial (incluindo vídeo, a partir de 20/05), acesse: https://www.luiztools.com.br/post/como-criar-robo-trailing-stop-para-binance-spot-em-node-js/ 17 | 18 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 19 | 20 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 21 | 22 | Me siga nas redes sociais: https://about.me/luiztools 23 | -------------------------------------------------------------------------------- /binance-calculator/README.md: -------------------------------------------------------------------------------- 1 | # binance-calculator 2 | Simple script to calculate PnL (profits and losses) from your trades in a period 3 | 4 | ## How to Run 5 | 6 | 1. git clone 7 | 2. copy .env.example as .env 8 | 3. fill .env variables 9 | 4. npm install 10 | 5. look at the getAllOrders function inside index.js to use mock data or not 11 | 6. npm start 12 | 13 | ## Mais informações 14 | 15 | Para ler o tutorial do script (incluindo vídeo), acesse: https://www.luiztools.com.br/post/como-calcular-a-lucratividade-de-bot-cripto-com-js/ (a partir de 18/03) 16 | 17 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 18 | 19 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 20 | 21 | Me siga nas redes sociais: https://about.me/luiztools 22 | -------------------------------------------------------------------------------- /binance-telegram/README.md: -------------------------------------------------------------------------------- 1 | # Binance Telegram 2 | A simple bot the read signs on Telegram and send orders to Binance. 3 | 4 | ## How to Use 5 | 1. create a Telegram Bot with @BotFather (at Telegram app) 6 | 2. Change privacy of the bot to allow listen group messages 7 | 3. put your new bot at the signals group 8 | 4. git clone the project 9 | 5. cd binance-telegram 10 | 6. copy .env.example as .env 11 | 7. fill the .env variables 12 | 8. npm install 13 | 9. npm start 14 | 15 | ## More 16 | 17 | Leia o tutorial completo (incluindo vídeo) em https://www.luiztools.com.br/post/bot-que-le-sinais-no-telegram-e-faz-trades-na-binance 18 | 19 | Aprenda a obter suas chaves da Binance Futures em https://www.youtube.com/watch?v=FCzgqr2P0_g 20 | 21 | Me siga nas redes sociais: https://about.me/luiztools 22 | 23 | Receba novidades no Telegram: https://t.me/luiznews 24 | 25 | Conheça meus cursos em https://www.luiztools.com.br/meus-cursos -------------------------------------------------------------------------------- /binance-scrapper/index.js: -------------------------------------------------------------------------------- 1 | const puppeteer = require('puppeteer'); 2 | 3 | async function scrap() { 4 | const browser = await puppeteer.launch({ headless: "new" }); 5 | const page = await browser.newPage(); 6 | await page.goto('https://launchpad.binance.com/pt-BR/'); 7 | await page.waitForNetworkIdle(); 8 | 9 | const launchpad = await page.evaluate(() => { 10 | return document.querySelector('div.css-1q7tw3q').innerText; 11 | }) 12 | 13 | const launchpool = await page.evaluate(() => { 14 | return document.querySelector('div.css-13to1co').innerText; 15 | }) 16 | 17 | browser.close(); 18 | 19 | if (!launches.includes(launchpad)) { 20 | launches.push(launchpad); 21 | console.log("Novo Launchpad: " + launchpad); 22 | } 23 | 24 | if (!launches.includes(launchpool)) { 25 | launches.push(launchpool); 26 | console.log("Novo Launchpool: " + launchpool); 27 | } 28 | }; 29 | 30 | const launches = []; 31 | scrap(); 32 | setInterval(scrap, 60 * 60 * 1000); -------------------------------------------------------------------------------- /binance-candles/index.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios"); 2 | const WebSocket = require("ws"); 3 | 4 | async function start() { 5 | const { data } = await axios.get("https://api.binance.com/api/v3/exchangeInfo"); 6 | const symbols = data.symbols.filter(s => s.quoteAsset === "USDT").map(s => s.symbol.toLowerCase()); 7 | const streams = symbols.map(s => `${s}@kline_1m`).join("/"); 8 | 9 | const ws = new WebSocket(`wss://stream.binance.com:9443/stream?streams=${streams}`); 10 | ws.onmessage = (event) => { 11 | const obj = JSON.parse(event.data); 12 | 13 | if (obj.data.k.x) { 14 | const symbol = obj.data.k.s; 15 | const open = obj.data.k.o; 16 | const high = obj.data.k.h; 17 | const low = obj.data.k.l; 18 | const close = obj.data.k.c; 19 | console.log({ symbol, open, high, low, close }); 20 | 21 | //outros processamentos do seu robô 22 | } 23 | } 24 | 25 | ws.onerror = (err) => console.error(err); 26 | } 27 | 28 | start(); -------------------------------------------------------------------------------- /support-resistance/index.js: -------------------------------------------------------------------------------- 1 | //index.js 2 | const axios = require("axios"); 3 | 4 | const Candlechart = require("./Candlechart"); 5 | const SYMBOL = "BTCUSDT"; 6 | const INTERVAL = "1h"; 7 | const LIMIT = 120; 8 | const TICK_SIZE = 0.01; 9 | 10 | async function start() { 11 | const response = await axios.get(`https://api.binance.com/api/v3/klines?symbol=${SYMBOL}&interval=${INTERVAL}&limit=${LIMIT}`);//5 dias 12 | const candlechart = new Candlechart(response.data, TICK_SIZE); 13 | 14 | let atl = candlechart.lowestPrice(); 15 | let ath = candlechart.highestPrice(); 16 | let medium = candlechart.getMedium(atl, ath); 17 | 18 | console.log("ATH: " + ath); 19 | console.log("ATL: " + atl); 20 | console.log("Medium: " + medium); 21 | 22 | const support = candlechart.findSupport(medium); 23 | console.log("Support: " + JSON.stringify(support)); 24 | 25 | const resistance = candlechart.findResistance(medium); 26 | console.log("Resistance: " + JSON.stringify(resistance)); 27 | } 28 | 29 | start(); 30 | 31 | 32 | -------------------------------------------------------------------------------- /binance-telegram/api.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const crypto = require('crypto'); 3 | 4 | const apiKey = process.env.API_KEY; 5 | const apiSecret = process.env.SECRET_KEY; 6 | const apiUrl = process.env.API_URL; 7 | 8 | async function newOrder(symbol, quantity, side, price) { 9 | const data = { symbol, side, type: "LIMIT", quantity, price, timeInForce: "GTC" }; 10 | 11 | const timestamp = Date.now(); 12 | const recvWindow = 60000;//máximo permitido, default 5000 13 | 14 | const signature = crypto 15 | .createHmac('sha256', apiSecret) 16 | .update(`${new URLSearchParams({ ...data, timestamp, recvWindow }).toString()}`) 17 | .digest('hex'); 18 | 19 | const newData = { ...data, timestamp, recvWindow, signature }; 20 | const qs = `?${new URLSearchParams(newData).toString()}`; 21 | 22 | const result = await axios({ 23 | method: 'POST', 24 | url: `${apiUrl}/v1/order${qs}`, 25 | headers: { 'X-MBX-APIKEY': apiKey } 26 | }); 27 | return result.data; 28 | } 29 | 30 | module.exports = { 31 | newOrder 32 | } -------------------------------------------------------------------------------- /binance-telegram/index.js: -------------------------------------------------------------------------------- 1 | //index.js 2 | require('dotenv').config(); 3 | 4 | const { Telegraf } = require('telegraf'); 5 | const { message } = require('telegraf/filters'); 6 | 7 | const bot = new Telegraf(process.env.BOT_TOKEN); 8 | 9 | const { newOrder } = require("./api"); 10 | 11 | bot.on(message('text'), async (ctx) => { 12 | if (ctx.from.username !== "luiztools") return; 13 | 14 | console.log(ctx.message.text); 15 | 16 | const symbol = ctx.message.text.split("#")[1].split(" ")[0].trim(); 17 | const quantity = "0.01"; 18 | const price = ctx.message.text.split("Target 1: ")[1].split("\n")[0].trim(); 19 | 20 | let result; 21 | if (ctx.message.text.indexOf("BUY") !== -1 || ctx.message.text.indexOf("LONG") !== -1) { 22 | ctx.reply("Bora Comprar"); 23 | result = await newOrder(symbol, quantity, "BUY", price); 24 | } 25 | else if (ctx.message.text.indexOf("SELL") !== -1 || ctx.message.text.indexOf("SHORT") !== -1) { 26 | ctx.reply("Bora Vender"); 27 | result = await newOrder(symbol, quantity, "SELL", price); 28 | } 29 | 30 | console.log(result); 31 | }); 32 | 33 | bot.launch(); -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # nodejs-bitcoin 2 | Simple trader bots for Binance Spot, Binance Futures, Binance Launchpad, BityPreço e Mercado Bitcoin. 3 | 4 | ## AVISOS 5 | 6 | - VOCÊ DEVE TER CONHECIMENTOS BÁSICOS DE LÓGICA DE PROGRAMAÇÃO E DE ALGORITMOS PARA USAR ESTES ROBÔS. 7 | - EU NÃO ME RESPONSABILIZO PELO USO INDEVIDO DESTES ROBÔS TRADER, BUGS QUE ELES POSSAM TER OU A LÓGICA DE TRADING QUE VOCÊ VENHA A APLICAR. 8 | - EU NÃO ME RESPONSABILIZO POR PERDAS FINANCEIRAS E NÃO DOU CONSELHOS DE INVESTIMENTO. 9 | - CRIPTOMOEDAS É INVESTIMENTO DE RISCO, TENHA ISSO EM MENTE. 10 | - NÃO COMPARTILHE SUAS VARIÁVEIS DE AMBIENTE E ARQUIVO .ENV COM NINGUÉM, NEM COMIGO. 11 | - AO USAR ESTES ROBÔS, VOCÊ ASSUME QUALQUER RISCO FINANCEIRO QUE ELES POSSAM LHE CAUSAR. 12 | - NÃO TENHO ROBÔS DE OUTROS BROKERS, SÓ TENHO ESSES. 13 | - NÃO DESENVOLVO PARA TERCEIROS 14 | 15 | ## Instructions & Info 16 | 17 | Check each projects' readme file. 18 | 19 | Consulte o Readme de cada projeto. 20 | 21 | ## More 22 | 23 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 24 | 25 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 26 | 27 | Me siga nas redes sociais: https://about.me/luiztools 28 | -------------------------------------------------------------------------------- /binance-spot/README.md: -------------------------------------------------------------------------------- 1 | # binance-spot 2 | Simple trader bot for Binance Spot. 3 | 4 | ## How to Run 5 | 6 | 1. git clone 7 | 2. npm install 8 | 3. copy .env.example as .env 9 | 4. fill the .env 10 | 5. npm start 11 | 12 | ## AVISOS 13 | 14 | - VOCÊ DEVE TER CONHECIMENTOS BÁSICOS DE LÓGICA DE PROGRAMAÇÃO E DE ALGORITMOS PARA USAR ESTE ROBÔ. 15 | - EU NÃO ME RESPONSABILIZO PELO USO INDEVIDO DESTE ROBÔ TRADER, BUGS QUE ELE POSSA TER OU A LÓGICA DE TRADING QUE VOCÊ VENHA A APLICAR. 16 | - EU NÃO ME RESPONSABILIZO POR PERDAS FINANCEIRAS E NÃO DOU CONSELHOS DE INVESTIMENTO. 17 | - CRIPTOMOEDAS É INVESTIMENTO DE RISCO, TENHA ISSO EM MENTE. 18 | - NÃO COMPARTILHE SUAS VARIÁVEIS DE AMBIENTE E ARQUIVO .ENV COM NINGUÉM, NEM COMIGO. 19 | - AO USAR ESTE ROBÔ, VOCÊ ASSUME QUALQUER RISCO FINANCEIRO QUE ELE POSSA LHE CAUSAR. 20 | - NÃO DESENVOLVO PARA TERCEIROS 21 | 22 | ## Mais informações 23 | 24 | Para ler o tutorial do bot para Binance (incluindo vídeo), acesse: https://www.luiztools.com.br/post/como-criar-robo-trader-da-binance-em-nodejs/ 25 | 26 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 27 | 28 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 29 | 30 | Me siga nas redes sociais: https://about.me/luiztools 31 | -------------------------------------------------------------------------------- /binance-futures/index.js: -------------------------------------------------------------------------------- 1 | const WebSocket = require('ws'); 2 | const ws = new WebSocket(`${process.env.STREAM_URL}btcusdt@markPrice@1s`); 3 | let isOpened = false; 4 | 5 | const api = require("./api"); 6 | 7 | ws.onmessage = (event) => { 8 | console.clear(); 9 | const obj = JSON.parse(event.data); 10 | console.log(`Symbol: ${obj.s}`); 11 | console.log(`Mark Price: ${obj.p}`); 12 | 13 | const price = parseFloat(obj.p); 14 | if (price < 120000 && !isOpened) { 15 | console.log('Abrir posição!'); 16 | api.newOrder("BTCUSDT", "0.001", "BUY") 17 | .then(result => { 18 | console.log(result); 19 | isOpened = true; 20 | }) 21 | .catch(err => console.error(err)); 22 | } 23 | else if (price > 130000 && isOpened) { 24 | console.log('Fechar posição!'); 25 | api.newOrder("BTCUSDT", "0.001", "SELL") 26 | .then(result => { 27 | console.log(result); 28 | isOpened = false; 29 | }) 30 | .catch(err => console.error(err)); 31 | } 32 | } 33 | 34 | setInterval(() => { 35 | api.accountInfo() 36 | .then(result => console.log(result)) 37 | .catch(err => console.error(err)) 38 | }, 10000) -------------------------------------------------------------------------------- /binance-sma-ema/index.js: -------------------------------------------------------------------------------- 1 | 2 | require("dotenv").config(); 3 | const axios = require("axios"); 4 | 5 | const API_URL = process.env.API_URL; 6 | const SYMBOL = process.env.SYMBOL; 7 | const INTERVAL = process.env.INTERVAL; 8 | const PERIOD = parseInt(process.env.PERIOD); 9 | 10 | function SMA(closes){ 11 | const sum = closes.reduce((a,b) => a + b); 12 | return sum / closes.length; 13 | } 14 | 15 | function smoothing(period){ 16 | return 2 / (period + 1); 17 | } 18 | 19 | function EMA(closes, period = 20) { 20 | if (closes.length < period) throw new Error("Não há dados suficientes para calcular o EMA."); 21 | 22 | const multiplier = smoothing(period); 23 | 24 | let prevEma = SMA(closes.slice(0, period)); 25 | 26 | for (let i = period; i < closes.length; i++) { 27 | prevEma = (closes[i] - prevEma) * multiplier + prevEma; 28 | } 29 | 30 | return prevEma; 31 | } 32 | 33 | async function getCandles(){ 34 | const response = await axios.get(`${API_URL}/v3/klines?symbol=${SYMBOL}&interval=${INTERVAL}&limit=1000`); 35 | const closes = response.data.map(k => parseFloat(k[4])); 36 | console.log("SMA: " + SMA(closes.slice(closes.length - PERIOD))); 37 | console.log("EMA: " + EMA(closes, PERIOD)); 38 | } 39 | 40 | getCandles(); 41 | setInterval(getCandles, 3000); -------------------------------------------------------------------------------- /binance-copytrade-spot/README.md: -------------------------------------------------------------------------------- 1 | # binance-copytrade-spot 2 | Simple copy trader bot for Binance Spot. 3 | 4 | ## How to Run 5 | 6 | 1. git clone 7 | 2. npm install 8 | 3. copy .env.example as .env 9 | 4. fill the .env 10 | 5. npm start 11 | 12 | ## AVISOS 13 | 14 | - VOCÊ DEVE TER CONHECIMENTOS BÁSICOS DE LÓGICA DE PROGRAMAÇÃO E DE ALGORITMOS PARA USAR ESTE ROBÔ. 15 | - EU NÃO ME RESPONSABILIZO PELO USO INDEVIDO DESTE ROBÔ TRADER, BUGS QUE ELE POSSA TER OU A LÓGICA DE TRADING QUE VOCÊ VENHA A APLICAR. 16 | - EU NÃO ME RESPONSABILIZO POR PERDAS FINANCEIRAS E NÃO DOU CONSELHOS DE INVESTIMENTO. 17 | - CRIPTOMOEDAS É INVESTIMENTO DE RISCO, TENHA ISSO EM MENTE. 18 | - NÃO COMPARTILHE SUAS VARIÁVEIS DE AMBIENTE E ARQUIVO .ENV COM NINGUÉM, NEM COMIGO. 19 | - AO USAR ESTE ROBÔ, VOCÊ ASSUME QUALQUER RISCO FINANCEIRO QUE ELE POSSA LHE CAUSAR. 20 | - NÃO DESENVOLVO PARA TERCEIROS 21 | 22 | ## Mais informações 23 | 24 | Para ler o tutorial do bot para Binance (incluindo vídeo), acesse: https://www.luiztools.com.br/post/como-criar-um-bot-para-copy-trade-na-binance-spot-com-node-js 25 | 26 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 27 | 28 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 29 | 30 | Me siga nas redes sociais: https://about.me/luiztools 31 | -------------------------------------------------------------------------------- /binance-copytrade-futures/README.md: -------------------------------------------------------------------------------- 1 | # binance-copytrade-futures 2 | Simple copy trader bot for Binance Futures. 3 | 4 | ## How to Run 5 | 6 | 1. git clone 7 | 2. npm install 8 | 3. copy .env.example as .env 9 | 4. fill the .env 10 | 5. npm start 11 | 12 | ## AVISOS 13 | 14 | - VOCÊ DEVE TER CONHECIMENTOS BÁSICOS DE LÓGICA DE PROGRAMAÇÃO E DE ALGORITMOS PARA USAR ESTE ROBÔ. 15 | - EU NÃO ME RESPONSABILIZO PELO USO INDEVIDO DESTE ROBÔ TRADER, BUGS QUE ELE POSSA TER OU A LÓGICA DE TRADING QUE VOCÊ VENHA A APLICAR. 16 | - EU NÃO ME RESPONSABILIZO POR PERDAS FINANCEIRAS E NÃO DOU CONSELHOS DE INVESTIMENTO. 17 | - CRIPTOMOEDAS É INVESTIMENTO DE RISCO, TENHA ISSO EM MENTE. 18 | - NÃO COMPARTILHE SUAS VARIÁVEIS DE AMBIENTE E ARQUIVO .ENV COM NINGUÉM, NEM COMIGO. 19 | - AO USAR ESTE ROBÔ, VOCÊ ASSUME QUALQUER RISCO FINANCEIRO QUE ELE POSSA LHE CAUSAR. 20 | - NÃO DESENVOLVO PARA TERCEIROS 21 | 22 | ## Mais informações 23 | 24 | Para ler o tutorial do bot para Binance (incluindo vídeo), acesse: https://www.luiztools.com.br/post/como-criar-um-bot-para-copy-trade-na-binance-futures-com-node-js 25 | 26 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 27 | 28 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 29 | 30 | Me siga nas redes sociais: https://about.me/luiztools 31 | -------------------------------------------------------------------------------- /binance-launchbot/api.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const crypto = require('crypto'); 3 | 4 | const apiKey = process.env.API_KEY; 5 | const apiSecret = process.env.SECRET_KEY; 6 | const apiUrl = process.env.API_URL; 7 | 8 | async function newOrder(data) { 9 | if (!apiKey || !apiSecret) 10 | throw new Error('Preencha corretamente sua API KEY e SECRET KEY'); 11 | 12 | data.type = "MARKET"; 13 | data.timestamp = Date.now(); 14 | data.recvWindow = 60000;//máximo permitido, default 5000 15 | 16 | const signature = crypto 17 | .createHmac('sha256', apiSecret) 18 | .update(`${new URLSearchParams(data)}`) 19 | .digest('hex'); 20 | 21 | const qs = `?${new URLSearchParams({ ...data, signature })}`; 22 | 23 | try { 24 | const result = await axios({ 25 | method: "POST", 26 | url: `${apiUrl}/v3/order${qs}`, 27 | headers: { 'X-MBX-APIKEY': apiKey } 28 | }); 29 | return result.data; 30 | } catch (err) { 31 | console.log(err); 32 | } 33 | } 34 | 35 | function buy(symbol, quoteOrderQty) { 36 | const data = { symbol, side: 'BUY', quoteOrderQty }; 37 | return newOrder(data); 38 | } 39 | 40 | function sell(symbol, quantity) { 41 | const data = { symbol, side: "SELL", quantity }; 42 | return newOrder(data); 43 | } 44 | 45 | module.exports = { buy, sell } -------------------------------------------------------------------------------- /binance-rsi/index.js: -------------------------------------------------------------------------------- 1 | //index.js 2 | const SYMBOL = process.env.SYMBOL; 3 | const INTERVAL = process.env.INTERVAL; 4 | const PERIOD = parseInt(process.env.PERIOD); 5 | 6 | function averages(closes, period, startIndex) { 7 | let gains = 0, losses = 0; 8 | 9 | for (let i = 0; i < period && (i + startIndex) < closes.length; i++) { 10 | const diff = closes[i + startIndex] - closes[i + startIndex - 1]; 11 | 12 | if (diff >= 0) 13 | gains += diff; 14 | else 15 | losses += Math.abs(diff); 16 | } 17 | 18 | let avgGains = gains / period; 19 | let avgLosses = losses / period; 20 | return { avgGains, avgLosses }; 21 | } 22 | 23 | function RSI(closes, period) { 24 | let { avgGains, avgLosses } = averages(closes, period, 1); 25 | 26 | for (let i = 2; i < closes.length; i++) { 27 | let newAverages = averages(closes, period, i); 28 | avgGains = (avgGains * (period - 1) + newAverages.avgGains) / period; 29 | avgLosses = (avgLosses * (period - 1) + newAverages.avgLosses) / period; 30 | } 31 | 32 | const rs = avgGains / avgLosses; 33 | return 100 - (100 / (1 + rs)); 34 | } 35 | 36 | 37 | async function getCandles() { 38 | const response = await fetch(`https://api.binance.com/api/v3/klines?symbol=${SYMBOL}&interval=${INTERVAL}&limit=100`); 39 | const data = await response.json(); 40 | const closes = data.map(k => parseFloat(k[4])); 41 | const rsi = RSI(closes, PERIOD); 42 | console.clear(); 43 | console.log(rsi); 44 | } 45 | 46 | setInterval(getCandles, 3000); 47 | -------------------------------------------------------------------------------- /binance-futures/README.md: -------------------------------------------------------------------------------- 1 | # binance-futures 2 | Simple trader bot for Binance Futures. 3 | 4 | ## AVISOS 5 | 6 | - VOCÊ DEVE TER CONHECIMENTOS BÁSICOS DE LÓGICA DE PROGRAMAÇÃO E DE ALGORITMOS PARA USAR ESTE ROBÔ. 7 | - EU NÃO ME RESPONSABILIZO PELO USO INDEVIDO DESTE ROBÔ TRADER, BUGS QUE ELE POSSA TER OU A LÓGICA DE TRADING QUE VOCÊ VENHA A APLICAR. 8 | - EU NÃO ME RESPONSABILIZO POR PERDAS FINANCEIRAS E NÃO DOU CONSELHOS DE INVESTIMENTO. 9 | - CRIPTOMOEDAS É INVESTIMENTO DE RISCO, TENHA ISSO EM MENTE. 10 | - NÃO COMPARTILHE SUAS VARIÁVEIS DE AMBIENTE E ARQUIVO .ENV COM NINGUÉM, NEM COMIGO. 11 | - AO USAR ESTE ROBÔ, VOCÊ ASSUME QUALQUER RISCO FINANCEIRO QUE ELE POSSA LHE CAUSAR. 12 | - NÃO DESENVOLVO PARA TERCEIROS 13 | 14 | ## Instruções 15 | 16 | 1. Execute npm install na pasta do projeto que vai executar para baixar dependências 17 | 2. Obtenha suas credenciais de API na sua área logada da sua exchange 18 | 3. Crie um arquivo .env na raiz do projeto com o mesmo conteúdo do arquivo .env.example 19 | 4. Preencha os valores das variáveis no .env conforme instruído nos comentários do .env.example 20 | 5. Execute o robô com npm start, leva 1 segundo para começar a monitorar 21 | 22 | ## Mais informações 23 | 24 | Crie suas chaves de API para Futuros com este vídeo: https://www.youtube.com/watch?v=FCzgqr2P0_g 25 | 26 | Tutorial em https://www.luiztools.com.br/post/como-criar-um-bot-trader-para-binance-futures-em-node-js/ 27 | 28 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 29 | 30 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 31 | 32 | Me siga nas redes sociais: https://about.me/luiztools 33 | -------------------------------------------------------------------------------- /binance-launchbot/README.md: -------------------------------------------------------------------------------- 1 | # launchbot 2 | Simple launch bot for Binance Launchpad and other new coinpairs. 3 | 4 | ## AVISOS 5 | 6 | - VOCÊ DEVE TER CONHECIMENTOS BÁSICOS DE LÓGICA DE PROGRAMAÇÃO E DE ALGORITMOS PARA USAR ESTE ROBÔ. 7 | - EU NÃO ME RESPONSABILIZO PELO USO INDEVIDO DESTE ROBÔ TRADER, BUGS QUE ELE POSSA TER OU A LÓGICA DE TRADING QUE VOCÊ VENHA A APLICAR. 8 | - EU NÃO ME RESPONSABILIZO POR PERDAS FINANCEIRAS E NÃO DOU CONSELHOS DE INVESTIMENTO. 9 | - CRIPTOMOEDAS É INVESTIMENTO DE RISCO, TENHA ISSO EM MENTE, NÃO COLOQUE MAIS DE 20% DA SUA CARTEIRA NELAS. 10 | - NÃO COMPARTILHE SUAS VARIÁVEIS DE AMBIENTE E ARQUIVO .ENV COM NINGUÉM, NEM COMIGO. 11 | - AO USAR ESTE ROBÔ, VOCÊ ASSUME QUALQUER RISCO FINANCEIRO QUE ELE POSSA LHE CAUSAR. 12 | - NÃO TENHO ROBÔS DE OUTROS BROKERS, SÓ TENHO ESSES. 13 | - NÃO DESENVOLVO PARA TERCEIROS 14 | 15 | ## Instruções 16 | 17 | 1. Execute npm install na pasta do projeto que vai executar para baixar dependências 18 | 2. Obtenha suas credenciais de API na sua área logada da sua exchange (https://www.youtube.com/watch?v=-6bF6a6ecIs) 19 | 3. Crie um arquivo .env na raiz do projeto com o mesmo conteúdo do arquivo .env.example 20 | 4. Preencha os valores das variáveis no .env conforme instruído nos comentários do .env.example 21 | 5. Execute o robô com npm start 22 | 23 | ## Mais informações 24 | 25 | Assista ao tutorial do LaunchBot: https://youtube.com/live/tu9jZQLNvx8?feature=share 26 | 27 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 28 | 29 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 30 | 31 | Me siga nas redes sociais: https://about.me/luiztools 32 | -------------------------------------------------------------------------------- /binance-copytrade-futures/api.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | 3 | const apiUrl = process.env.BINANCE_API_URL; 4 | 5 | async function connectAccount() { 6 | const apiKey = process.env.TRADER0_API_KEY; 7 | const apiSecret = process.env.TRADER0_API_SECRET; 8 | 9 | if (!apiKey || !apiSecret) 10 | throw new Error('Preencha corretamente sua API KEY e SECRET KEY'); 11 | try { 12 | const result = await axios({ 13 | method: "POST", 14 | url: `${apiUrl}/v1/listenKey`, 15 | headers: { 'X-MBX-APIKEY': apiKey } 16 | }); 17 | return result.data; 18 | } catch (err) { 19 | console.error(err.response ? err.response : err); 20 | } 21 | } 22 | 23 | const crypto = require('crypto'); 24 | async function newOrder(data, apiKey, apiSecret) { 25 | if (!apiKey || !apiSecret) 26 | throw new Error('Preencha corretamente sua API KEY e SECRET KEY'); 27 | 28 | data.timestamp = Date.now(); 29 | data.recvWindow = 60000;//máximo permitido, default 5000 30 | 31 | const signature = crypto 32 | .createHmac('sha256', apiSecret) 33 | .update(`${new URLSearchParams(data)}`) 34 | .digest('hex'); 35 | 36 | const qs = `?${new URLSearchParams({ ...data, signature })}`; 37 | 38 | try { 39 | const result = await axios({ 40 | method: "POST", 41 | url: `${apiUrl}/v1/order${qs}`, 42 | headers: { 'X-MBX-APIKEY': apiKey } 43 | }); 44 | return result.data; 45 | } catch (err) { 46 | console.error(err.response ? err.response : err); 47 | } 48 | } 49 | 50 | module.exports = { newOrder, connectAccount } -------------------------------------------------------------------------------- /binance-copytrade-spot/api.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const crypto = require('crypto'); 3 | 4 | const apiUrl = process.env.BINANCE_API_URL; 5 | 6 | async function connectAccount() { 7 | const apiKey = process.env.TRADER0_API_KEY; 8 | const apiSecret = process.env.TRADER0_API_SECRET; 9 | 10 | if (!apiKey || !apiSecret) 11 | throw new Error('Preencha corretamente sua API KEY e SECRET KEY'); 12 | try { 13 | const result = await axios({ 14 | method: "POST", 15 | url: `${apiUrl}/v3/userDataStream`, 16 | headers: { 'X-MBX-APIKEY': apiKey } 17 | }); 18 | return result.data; 19 | } catch (err) { 20 | console.error(err.response ? err.response : err); 21 | } 22 | } 23 | 24 | async function newOrder(data, apiKey, apiSecret) { 25 | if (!apiKey || !apiSecret) 26 | throw new Error('Preencha corretamente sua API KEY e SECRET KEY'); 27 | 28 | data.timestamp = Date.now(); 29 | data.recvWindow = 60000;//máximo permitido, default 5000 30 | 31 | const signature = crypto 32 | .createHmac('sha256', apiSecret) 33 | .update(`${new URLSearchParams(data)}`) 34 | .digest('hex'); 35 | 36 | const qs = `?${new URLSearchParams({ ...data, signature })}`; 37 | 38 | try { 39 | const result = await axios({ 40 | method: "POST", 41 | url: `${apiUrl}/v3/order${qs}`, 42 | headers: { 'X-MBX-APIKEY': apiKey } 43 | }); 44 | return result.data; 45 | } catch (err) { 46 | console.error(err.response ? err.response : err); 47 | } 48 | } 49 | 50 | module.exports = { newOrder, connectAccount } -------------------------------------------------------------------------------- /mercado-bitcoin/README.md: -------------------------------------------------------------------------------- 1 | # mercado-bitcoin 2 | Simple trader bot for Mercado Bitcoin (v4). 3 | 4 | ## AVISOS 5 | 6 | - VOCÊ DEVE TER CONHECIMENTOS BÁSICOS DE LÓGICA DE PROGRAMAÇÃO E DE ALGORITMOS PARA USAR ESTE ROBÔ. 7 | - EU NÃO ME RESPONSABILIZO PELO USO INDEVIDO DESTE ROBÔ TRADER, BUGS QUE ELE POSSA TER OU A LÓGICA DE TRADING QUE VOCÊ VENHA A APLICAR. 8 | - EU NÃO ME RESPONSABILIZO POR PERDAS FINANCEIRAS E NÃO DOU CONSELHOS DE INVESTIMENTO. 9 | - CRIPTOMOEDAS É INVESTIMENTO DE RISCO, TENHA ISSO EM MENTE, NÃO COLOQUE MAIS DE 20% DA SUA CARTEIRA NELAS. 10 | - NÃO COMPARTILHE SUAS VARIÁVEIS DE AMBIENTE E ARQUIVO .ENV COM NINGUÉM, NEM COMIGO. 11 | - AO USAR ESTE ROBÔ, VOCÊ ASSUME QUALQUER RISCO FINANCEIRO QUE ELE POSSA LHE CAUSAR. 12 | - NÃO TENHO ROBÔS DE OUTROS BROKERS, SÓ TENHO ESSES. 13 | - NÃO DESENVOLVO PARA TERCEIROS 14 | 15 | ## Instruções 16 | 17 | 1. Execute npm install na pasta do projeto que vai executar para baixar dependências 18 | 2. Obtenha suas credenciais de API na sua área logada da sua exchange 19 | 3. Crie um arquivo .env na raiz do projeto com o mesmo conteúdo do arquivo .env.example 20 | 4. Preencha os valores das variáveis no .env conforme instruído nos comentários do .env.example 21 | 5. ajuste o código para sua lógica de 'comprar barato' 22 | 5. Execute o robô com npm start 23 | 24 | ## Mais informações 25 | 26 | Para ler o tutorial da Mercado Bitcoin, acesse: https://www.luiztools.com.br/post/como-criar-robo-trader-para-mercado-bitcoin-v4-em-node-js 27 | 28 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 29 | 30 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 31 | 32 | Me siga nas redes sociais: https://about.me/luiztools 33 | -------------------------------------------------------------------------------- /binance-top-gl/index.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios"); 2 | const WebSocket = require("ws"); 3 | 4 | const changes = {}; 5 | let symbols = []; 6 | 7 | async function start() { 8 | const { data } = await axios.get("https://api.binance.com/api/v3/exchangeInfo"); 9 | symbols = data.symbols.filter(s => s.quoteAsset === "USDT").map(s => s.symbol.toLowerCase()); 10 | const streams = symbols.map(s => `${s}@kline_1m`).join("/"); 11 | 12 | const ws = new WebSocket(`wss://stream.binance.com:9443/stream?streams=${streams}`); 13 | ws.onmessage = (event) => { 14 | const obj = JSON.parse(event.data); 15 | 16 | if (obj.data.k.x) { 17 | const openPrice = parseFloat(obj.data.k.o); 18 | const closePrice = parseFloat(obj.data.k.c); 19 | const change = ((closePrice * 100) / openPrice) - 100; 20 | changes[obj.data.s] = change; 21 | console.log(obj.data.s, changes[obj.data.s]); 22 | } 23 | } 24 | 25 | ws.onerror = (err) => console.error(err); 26 | 27 | setInterval(() => { 28 | console.clear(); 29 | const changeArray = Object.keys(changes).map(k => { 30 | return { symbol: k, change: changes[k] } 31 | }) 32 | 33 | const topGainers = changeArray.sort((a, b) => b.change - a.change).slice(0, 5); 34 | 35 | console.log("TOP GAINERS"); 36 | topGainers.map(tg => console.log(tg.symbol, `+${tg.change.toFixed(2)}%`)); 37 | 38 | const topLosers = changeArray.sort((a, b) => a.change - b.change).slice(0, 5); 39 | console.log("\nTOP LOSERS"); 40 | topLosers.map(tg => console.log(tg.symbol, tg.change.toFixed(2) + "%")); 41 | }, 30000); 42 | } 43 | 44 | start(); -------------------------------------------------------------------------------- /binance-timerbot/api.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const queryString = require('querystring'); 3 | 4 | const crypto = require('crypto'); 5 | const apiKey = process.env.API_KEY; 6 | const apiSecret = process.env.SECRET_KEY; 7 | const apiUrl = process.env.API_URL; 8 | 9 | async function newQuoteOrder(symbol, quoteOrderQty) { 10 | const data = { symbol, side: 'BUY', type: 'MARKET', quoteOrderQty }; 11 | return privateCall('/v3/order', data, 'POST'); 12 | } 13 | 14 | async function newOrder(symbol, quantity, price, side = 'BUY', type = 'MARKET') { 15 | const data = { symbol, side, type, quantity }; 16 | 17 | if (price) data.price = parseInt(price); 18 | if (type === 'LIMIT') data.timeInForce = 'GTC'; 19 | 20 | return privateCall('/v3/order', data, 'POST'); 21 | } 22 | 23 | async function privateCall(path, data = {}, method = 'GET') { 24 | if (!apiKey || !apiSecret) 25 | throw new Error('Preencha corretamente sua API KEY e SECRET KEY'); 26 | 27 | const timestamp = Date.now(); 28 | const recvWindow = 60000;//máximo permitido, default 5000 29 | 30 | const signature = crypto 31 | .createHmac('sha256', apiSecret) 32 | .update(`${queryString.stringify({ ...data, timestamp, recvWindow })}`) 33 | .digest('hex'); 34 | 35 | const newData = { ...data, timestamp, recvWindow, signature }; 36 | const qs = `?${queryString.stringify(newData)}`; 37 | 38 | try { 39 | const result = await axios({ 40 | method, 41 | url: `${apiUrl}${path}${qs}`, 42 | headers: { 'X-MBX-APIKEY': apiKey } 43 | }); 44 | console.log('sent at ' + timestamp); 45 | return result.data; 46 | } catch (err) { 47 | console.log(err); 48 | } 49 | } 50 | 51 | module.exports = { newOrder, newQuoteOrder } -------------------------------------------------------------------------------- /binance-tape-reading/index.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios"); 2 | 3 | function findGreater(arr) { 4 | let bestIndex = 0; 5 | let bestValue = arr[0]; 6 | for (let i = 1; i < arr.length; i++) { 7 | if (arr[i] > bestValue) { 8 | bestValue = arr[i]; 9 | bestIndex = i; 10 | } 11 | } 12 | return bestIndex; 13 | } 14 | 15 | setInterval(async () => { 16 | const { data } = await axios.get("https://api.binance.com/api/v3/depth?symbol=BTCUSDT&limit=5000"); 17 | console.clear(); 18 | 19 | //apenas converte para float 20 | const bidsFloat = data.bids.map(b => [parseFloat(b[0]), parseFloat(b[1])]); 21 | const asksFloat = data.asks.map(a => [parseFloat(a[0]), parseFloat(a[1])]); 22 | 23 | //calcula o valor nominal 24 | const bidsNotional = bidsFloat.map(b => b[0] * b[1]); 25 | const asksNotional = asksFloat.map(a => a[0] * a[1]); 26 | 27 | //somatório dos valores nominais 28 | const bidsSum = bidsNotional.reduce((a, b) => a + b); 29 | const asksSum = asksNotional.reduce((a, b) => a + b); 30 | 31 | console.log("Bids: " + bidsSum); 32 | console.log("Asks: " + asksSum); 33 | 34 | let difference = 0; 35 | 36 | if (bidsSum > asksSum) { 37 | console.log("Força compradora vencendo, preço vai subir!"); 38 | difference = (bidsSum * 100 / asksSum) - 100; 39 | } 40 | else { 41 | console.log("Força vendedora vencendo, preço vai cair!"); 42 | difference = (asksSum * 100 / bidsSum) - 100; 43 | } 44 | console.log(difference.toFixed(2) + "%"); 45 | 46 | const bestBuyIndex = findGreater(bidsNotional); 47 | console.log("Maior zona de compra: " + bidsFloat[bestBuyIndex]); 48 | 49 | const bestSellIndex = findGreater(asksNotional); 50 | console.log("Maior zona de venda: " + asksFloat[bestSellIndex]); 51 | }, 3000) -------------------------------------------------------------------------------- /binance-spot/index.js: -------------------------------------------------------------------------------- 1 | //index.js 2 | const WebSocket = require('ws'); 3 | const ws = new WebSocket(`${process.env.STREAM_URL}/${process.env.SYMBOL.toLowerCase()}@ticker`); 4 | 5 | let sellPrice = 0; 6 | const profitability = parseFloat(process.env.PROFITABILITY); 7 | 8 | ws.onmessage = (event) => { 9 | //console.clear(); 10 | const obj = JSON.parse(event.data); 11 | console.log(`Symbol: ${obj.s}`); 12 | console.log(`Ask Price: ${obj.a}`); 13 | 14 | const currentPrice = parseFloat(obj.a); 15 | if (sellPrice === 0 && currentPrice < 29000) { 16 | newOrder("0.001", "BUY"); 17 | sellPrice = currentPrice * profitability; 18 | } 19 | else if (sellPrice !== 0 && currentPrice >= sellPrice) { 20 | newOrder("0.001", "SELL"); 21 | sellPrice = 0; 22 | } 23 | else 24 | console.log("Waiting..."); 25 | } 26 | 27 | const axios = require('axios'); 28 | const crypto = require('crypto'); 29 | 30 | async function newOrder(quantity, side) { 31 | const data = { 32 | symbol: process.env.SYMBOL, 33 | side, 34 | type: 'MARKET', 35 | quantity, 36 | timestamp: Date.now(), 37 | recvWindow: 60000//máximo permitido, default 5000 38 | }; 39 | 40 | const signature = crypto 41 | .createHmac('sha256', process.env.SECRET_KEY) 42 | .update(`${new URLSearchParams(data)}`) 43 | .digest('hex'); 44 | 45 | const newData = { ...data, signature }; 46 | const qs = `?${new URLSearchParams(newData)}`; 47 | 48 | try { 49 | const result = await axios({ 50 | method: 'POST', 51 | url: `${process.env.API_URL}/v3/order${qs}`, 52 | headers: { 'X-MBX-APIKEY': process.env.API_KEY } 53 | }); 54 | console.log(result.data); 55 | } catch (err) { 56 | console.error(err); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /binance-timerbot/README.md: -------------------------------------------------------------------------------- 1 | # timerbot 2 | Simple trader bot for Binance. 3 | 4 | ## AVISOS 5 | 6 | - VOCÊ DEVE TER CONHECIMENTOS BÁSICOS DE LÓGICA DE PROGRAMAÇÃO E DE ALGORITMOS PARA USAR ESTE ROBÔ. 7 | - EU NÃO ME RESPONSABILIZO PELO USO INDEVIDO DESTE ROBÔ TRADER, BUGS QUE ELE POSSA TER OU A LÓGICA DE TRADING QUE VOCÊ VENHA A APLICAR. 8 | - EU NÃO ME RESPONSABILIZO POR PERDAS FINANCEIRAS E NÃO DOU CONSELHOS DE INVESTIMENTO. 9 | - CRIPTOMOEDAS É INVESTIMENTO DE RISCO, TENHA ISSO EM MENTE, NÃO COLOQUE MAIS DE 20% DA SUA CARTEIRA NELAS. 10 | - NÃO COMPARTILHE SUAS VARIÁVEIS DE AMBIENTE E ARQUIVO .ENV COM NINGUÉM, NEM COMIGO. 11 | - AO USAR ESTE ROBÔ, VOCÊ ASSUME QUALQUER RISCO FINANCEIRO QUE ELE POSSA LHE CAUSAR. 12 | - NÃO TENHO ROBÔS DE OUTROS BROKERS, SÓ TENHO ESSES. 13 | - NÃO DESENVOLVO PARA TERCEIROS 14 | 15 | ## Instruções 16 | 17 | 1. Execute npm install na pasta do projeto que vai executar para baixar dependências 18 | 2. Obtenha suas credenciais de API na sua área logada da sua exchange 19 | 3. Crie um arquivo .env na raiz do projeto com o mesmo conteúdo do arquivo .env.example (quando houver) 20 | 4. Preencha os valores das variáveis no .env conforme instruído nos comentários do .env.example 21 | 5. No caso da Mercado Bitcoin, ajuste a linha 32 do index.js para sua lógica de 'comprar barato' 22 | 5. Execute o robô com npm start, leva alguns segundos para começar (CRAWLER_INTERVAL) 23 | 24 | ## Mais informações 25 | 26 | Para ver a videoaula deste repositório, acesse: https://youtu.be/TFBgrrqRnOI 27 | 28 | Para ler o tutorial de Node Schedule acesse: https://www.luiztools.com.br/post/como-executar-tarefas-agendadas-com-node-schedule/ 29 | 30 | Conheça meu curso de bot para criptomoedas: https://www.luiztools.com.br/curso-beholder 31 | 32 | Conheça meus livros: https://www.luiztools.com.br/meus-livros 33 | 34 | Me siga nas redes sociais: https://about.me/luiztools 35 | -------------------------------------------------------------------------------- /tradingview-webhook/index.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config(); 2 | const express = require('express'); 3 | const app = express(); 4 | 5 | app.use(express.json()); 6 | 7 | app.use('/buy', async (req, res, next) => { 8 | console.log(req.originalUrl); 9 | console.log(req.body); 10 | //res.send(`Received a request:\nURL: ${req.originalUrl}\nBody: ${JSON.stringify(req.body)}`); 11 | const order = await newOrder("0.01", "BUY"); 12 | return res.json(order); 13 | }) 14 | 15 | app.use('/sell', async (req, res, next) => { 16 | console.log(req.originalUrl); 17 | console.log(req.body); 18 | //res.send(`Received a request:\nURL: ${req.originalUrl}\nBody: ${JSON.stringify(req.body)}`); 19 | const order = await newOrder("0.01", "SELL"); 20 | return res.json(order); 21 | }) 22 | 23 | app.use("/", (req, res, next) => { 24 | return res.send("Health Check!"); 25 | }) 26 | 27 | const axios = require('axios'); 28 | const crypto = require('crypto'); 29 | 30 | async function newOrder(quantity, side) { 31 | const data = { 32 | symbol: "BTCUSDT", 33 | side, 34 | type: 'MARKET', 35 | quantity, 36 | timestamp: Date.now(), 37 | recvWindow: 60000//máximo permitido, default 5000 38 | }; 39 | 40 | const signature = crypto 41 | .createHmac('sha256', process.env.SECRET_KEY) 42 | .update(`${new URLSearchParams(data)}`) 43 | .digest('hex'); 44 | 45 | const newData = { ...data, signature }; 46 | const qs = `?${new URLSearchParams(newData)}`; 47 | 48 | try { 49 | const result = await axios({ 50 | method: 'POST', 51 | url: `${process.env.API_URL}/v3/order${qs}`, 52 | headers: { 'X-MBX-APIKEY': process.env.API_KEY } 53 | }); 54 | console.log(result.data); 55 | } catch (err) { 56 | console.error(err); 57 | } 58 | } 59 | 60 | 61 | app.listen(process.env.PORT, () => { 62 | console.log(`Running at ${process.env.PORT}`) 63 | }) -------------------------------------------------------------------------------- /binance-launchbot/index.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config(); 2 | const api = require('./api'); 3 | 4 | const SYMBOL = process.env.SYMBOL; 5 | const PROFIT = parseFloat(process.env.PROFIT); 6 | const BUY_QTY = parseFloat(process.env.BUY_QTY); 7 | 8 | const WebSocket = require('ws'); 9 | const ws = new WebSocket(`wss://stream.binance.com:9443/ws/${SYMBOL.toLowerCase()}@bookTicker`); 10 | 11 | //não mexa nestas variáveis 12 | let quantity = 0; 13 | let buyPrice = 0; 14 | 15 | ws.on('error', (err) => { 16 | console.log('WS Error'); 17 | console.error(err); 18 | process.exit(1); 19 | }) 20 | 21 | ws.onmessage = async (event) => { 22 | 23 | try { 24 | const obj = JSON.parse(event.data); 25 | console.clear(); 26 | 27 | console.log(`Symbol: ${obj.s}`); 28 | console.log(`Best ask: ${obj.a}`); 29 | console.log(`Best bid: ${obj.b}`); 30 | console.log(`Buy Price: ${buyPrice}`); 31 | console.log(`Qty: ${quantity}`); 32 | console.log(`Notional: ${buyPrice * quantity}`); 33 | console.log(`Target Price: ${buyPrice * PROFIT}`); 34 | 35 | if (quantity === 0) { 36 | quantity = -1; 37 | 38 | const order = await api.buy(SYMBOL, BUY_QTY); 39 | if (order.status !== 'FILLED') { 40 | console.log(order); 41 | process.exit(1); 42 | } 43 | 44 | quantity = parseFloat(order.executedQty); 45 | buyPrice = parseFloat(order.fills[0].price); 46 | return; 47 | } 48 | else if (quantity > 0 && parseFloat(obj.b) > (buyPrice * PROFIT)) { 49 | const order = await api.sell(SYMBOL, quantity); 50 | if (order.status !== 'FILLED') 51 | console.log(order); 52 | else 53 | console.log(`Sold at ${new Date()} by ${order.fills[0].price}`); 54 | process.exit(1); 55 | } 56 | } catch (err) { 57 | console.error(err); 58 | process.exit(1); 59 | } 60 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /support-resistance/Candlechart.js: -------------------------------------------------------------------------------- 1 | const Kline = require("./Kline"); 2 | module.exports = class Candlechart { 3 | constructor(arr, tickSize) { 4 | this.klines = arr.map(k => new Kline(k)); 5 | this.TICK_SIZE = tickSize; 6 | } 7 | 8 | highestPrice() { 9 | const orderedKlines = this.klines.sort((a, b) => a.high - b.high); 10 | return orderedKlines[orderedKlines.length - 1].high; 11 | } 12 | 13 | lowestPrice() { 14 | const orderedKlines = this.klines.sort((a, b) => a.low - b.low); 15 | return orderedKlines[0].low; 16 | } 17 | 18 | getMedium(support, resistance) { 19 | if (support === undefined) 20 | support = this.lowestPrice(); 21 | 22 | if (resistance === undefined) 23 | resistance = this.highestPrice(); 24 | 25 | return ((resistance - support) / 2) + support; 26 | } 27 | 28 | getTrendTick(grouped, total) { 29 | let tickArr = Object.keys(grouped).map(k => { 30 | return { tick: k, count: grouped[k] } 31 | }); 32 | tickArr = tickArr.sort((a, b) => a.count - b.count); 33 | return {...tickArr[tickArr.length - 1], total }; 34 | } 35 | 36 | getTicks(kline) { 37 | const priceOsc = kline.high - kline.low; 38 | return priceOsc * (1 / this.TICK_SIZE); 39 | } 40 | 41 | getGroupedTicks(grouped, kline) { 42 | const ticks = this.getTicks(kline); 43 | for (let i = 0; i < ticks; i++) { 44 | const tick = kline.low + (this.TICK_SIZE * i); 45 | if (grouped[tick]) 46 | grouped[tick]++; 47 | else 48 | grouped[tick] = 1; 49 | } 50 | return grouped; 51 | } 52 | 53 | findSupport(medium) { 54 | const candles = this.klines.filter(k => k.low < medium); 55 | let grouped = {}; 56 | candles.map(kline => grouped = this.getGroupedTicks(grouped, kline)); 57 | 58 | return this.getTrendTick(grouped, candles.length); 59 | } 60 | 61 | findResistance(medium) { 62 | const candles = this.klines.filter(k => k.high > medium); 63 | let grouped = {}; 64 | candles.map(kline => grouped = this.getGroupedTicks(grouped, kline)); 65 | 66 | return this.getTrendTick(grouped, candles.length); 67 | } 68 | } -------------------------------------------------------------------------------- /binance-futures/api.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const crypto = require('crypto'); 3 | 4 | const apiKey = process.env.API_KEY; 5 | const apiSecret = process.env.SECRET_KEY; 6 | const apiUrl = process.env.API_URL; 7 | 8 | async function newOrder(symbol, quantity, side = 'BUY', type = 'MARKET', price = 0) { 9 | const data = { symbol, side, type, quantity }; 10 | 11 | if (price) data.price = parseInt(price); 12 | if (type === 'LIMIT') data.timeInForce = 'GTC'; 13 | 14 | if (!apiKey || !apiSecret) 15 | throw new Error('Preencha corretamente sua API KEY e SECRET KEY'); 16 | 17 | const timestamp = Date.now(); 18 | const recvWindow = 60000;//máximo permitido, default 5000 19 | 20 | const signature = crypto 21 | .createHmac('sha256', apiSecret) 22 | .update(`${new URLSearchParams({ ...data, timestamp, recvWindow }).toString()}`) 23 | .digest('hex'); 24 | 25 | const newData = { ...data, timestamp, recvWindow, signature }; 26 | const qs = `?${new URLSearchParams(newData).toString()}`; 27 | 28 | const result = await axios({ 29 | method: 'POST', 30 | url: `${apiUrl}/v1/order${qs}`, 31 | headers: { 'X-MBX-APIKEY': apiKey } 32 | }); 33 | return result.data; 34 | } 35 | 36 | async function accountInfo() { 37 | 38 | if (!apiKey || !apiSecret) 39 | throw new Error('Preencha corretamente sua API KEY e SECRET KEY'); 40 | 41 | const timestamp = Date.now(); 42 | const recvWindow = 60000;//máximo permitido, default 5000 43 | 44 | const signature = crypto 45 | .createHmac('sha256', apiSecret) 46 | .update(`${new URLSearchParams({ timestamp, recvWindow }).toString()}`) 47 | .digest('hex'); 48 | 49 | const newData = { timestamp, recvWindow, signature }; 50 | const qs = `?${new URLSearchParams(newData).toString()}`; 51 | 52 | const result = await axios({ 53 | method: 'GET', 54 | url: `${apiUrl}/v2/account${qs}`, 55 | headers: { 'X-MBX-APIKEY': apiKey } 56 | }); 57 | 58 | const data = { ...result.data }; 59 | 60 | data.assets = result.data.assets.filter(item => parseFloat(item.availableBalance) > 0).map(item => { 61 | return { asset: item.asset, balance: item.availableBalance } 62 | }); 63 | 64 | data.positions = result.data.positions.filter(item => parseFloat(item.positionAmt) !== 0); 65 | 66 | return data; 67 | } 68 | 69 | module.exports = { 70 | newOrder, 71 | accountInfo 72 | } -------------------------------------------------------------------------------- /binance-trailing-stop/index.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config(); 2 | 3 | const axios = require('axios'); 4 | const crypto = require('crypto'); 5 | 6 | const SYMBOL = "BTCUSDT"; 7 | 8 | async function orderRequest(method, data) { 9 | const signature = crypto 10 | .createHmac('sha256', process.env.SECRET_KEY) 11 | .update(`${new URLSearchParams(data)}`) 12 | .digest('hex'); 13 | 14 | const newData = { ...data, signature }; 15 | const qs = `?${new URLSearchParams(newData)}`; 16 | 17 | const result = await axios({ 18 | method, 19 | url: `${process.env.API_URL}/v3/order${qs}`, 20 | headers: { 'X-MBX-APIKEY': process.env.API_KEY } 21 | }); 22 | console.log(result.data); 23 | return result.data; 24 | } 25 | 26 | async function newOrder(symbol, quantity, side, trailingDelta) { 27 | //se stop price for usado, ele funciona como activation price 28 | const data = { 29 | symbol, 30 | side, 31 | type: side === "BUY" ? "STOP_LOSS" : "TAKE_PROFIT", 32 | quantity, 33 | trailingDelta,//substitui stop price (opcional), divide por 100 34 | timestamp: Date.now(), 35 | recvWindow: 60000//máximo permitido, default 5000 36 | }; 37 | 38 | return orderRequest("POST", data); 39 | } 40 | 41 | //newOrder(SYMBOL, "0.001", "BUY", 100); 42 | 43 | async function checkStatus(symbol, orderId, filledCallback) { 44 | const data = { 45 | symbol, 46 | orderId, 47 | timestamp: Date.now(), 48 | recvWindow: 60000//máximo permitido, default 5000 49 | }; 50 | 51 | const orderStatus = await orderRequest("GET", data); 52 | if (orderStatus.status === "FILLED") { 53 | console.log("Order FILLED, executing next step."); 54 | filledCallback(); 55 | } 56 | else { 57 | console.log("Not FILLED yet. Scheduling next check.") 58 | setTimeout(() => checkStatus(symbol, orderId, filledCallback), 60000); 59 | } 60 | } 61 | 62 | //checkStatus(SYMBOL, 295160, ()=> console.log("Finalizou!")); 63 | 64 | async function startCycle() { 65 | console.log("Starting a new cycle!"); 66 | const buyOrderReceipt = await newOrder(SYMBOL, "0.001", "BUY", 100); 67 | checkStatus(SYMBOL, buyOrderReceipt.orderId, async () => { 68 | const sellOrderReceipt = await newOrder(SYMBOL, "0.001", "SELL", 100); 69 | checkStatus(SYMBOL, sellOrderReceipt.orderId, startCycle); 70 | }) 71 | } 72 | 73 | startCycle(); 74 | 75 | -------------------------------------------------------------------------------- /binance-copytrade-spot/index.js: -------------------------------------------------------------------------------- 1 | const WebSocket = require("ws"); 2 | require("dotenv").config(); 3 | 4 | const accounts = []; 5 | 6 | const api = require("./api"); 7 | 8 | async function loadAccounts() { 9 | const { listenKey } = await api.connectAccount(); 10 | console.log(`ListenKey obtained/updated: ${listenKey}`); 11 | 12 | let i = 1; 13 | while (process.env[`TRADER${i}_API_KEY`]) { 14 | accounts.push({ 15 | apiKey: process.env[`TRADER${i}_API_KEY`], 16 | apiSecret: process.env[`TRADER${i}_API_SECRET`] 17 | }) 18 | i++; 19 | } 20 | console.log(`${i - 1} copy accounts loaded`); 21 | 22 | return listenKey; 23 | } 24 | 25 | function copyTrade(trade) { 26 | const data = { 27 | symbol: trade.s, 28 | side: trade.S, 29 | type: trade.o 30 | } 31 | 32 | if (trade.q && parseFloat(trade.q)) 33 | data.quantity = trade.q; 34 | 35 | if (trade.p && parseFloat(trade.p)) 36 | data.price = trade.p 37 | 38 | if (trade.f && trade.f !== "GTC") 39 | data.timeInForce = trade.f; 40 | 41 | if (trade.P && parseFloat(trade.P)) 42 | data.stopPrice = trade.P; 43 | 44 | if (trade.Q && parseFloat(trade.Q)) 45 | data.quoteOrderQty = trade.Q; 46 | 47 | return data; 48 | } 49 | 50 | const oldOrders = {}; 51 | 52 | async function start() { 53 | const listenKey = await loadAccounts(); 54 | 55 | const ws = new WebSocket(`${process.env.BINANCE_WS_URL}/${listenKey}`); 56 | ws.onmessage = async (event) => { 57 | try { 58 | const trade = JSON.parse(event.data); 59 | if (trade.e === "executionReport" && !oldOrders[trade.i]) { 60 | oldOrders[trade.i] = true; 61 | 62 | console.clear(); 63 | console.log(trade); 64 | 65 | const data = copyTrade(trade); 66 | 67 | const promises = accounts.map(acc => api.newOrder(data, acc.apiKey, acc.apiSecret)); 68 | const results = await Promise.allSettled(promises); 69 | console.log(results); 70 | 71 | //para não entrar em loop durante os testes, descomente abaixo 72 | process.exit(0); 73 | } 74 | } 75 | catch (err) { 76 | console.error(err); 77 | } 78 | } 79 | 80 | console.log("Waiting news..."); 81 | 82 | setInterval(() => { 83 | api.connectAccount(); 84 | }, 59 * 60 * 1000) 85 | } 86 | 87 | start(); -------------------------------------------------------------------------------- /mercado-bitcoin/index.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config(); 2 | const WebSocket = require("ws"); 3 | const axios = require('axios'); 4 | 5 | const BUY_QTY = process.env.BUY_QTY; 6 | const BUY_PRICE = parseFloat(process.env.BUY_PRICE); 7 | const PROFITABILITY = parseFloat(process.env.PROFITABILITY); 8 | 9 | let sellPrice = 0; 10 | let accessToken = ""; 11 | 12 | login(); 13 | //getAccountId(); 14 | 15 | const ws = new WebSocket("wss://ws.mercadobitcoin.net/ws"); 16 | 17 | ws.onopen = () => { 18 | ws.send(JSON.stringify({ 19 | type: "subscribe", 20 | subscription: { 21 | name: "ticker", 22 | id: process.env.STREAM_ID 23 | } 24 | })); 25 | } 26 | 27 | ws.onmessage = (evt) => { 28 | console.clear(); 29 | const obj = JSON.parse(evt.data); 30 | if (obj.type !== "ticker") return; 31 | 32 | console.log(obj.data); 33 | console.log("Sell Target: " + sellPrice); 34 | 35 | if (!sellPrice && parseFloat(obj.data.sell) <= BUY_PRICE) { 36 | sellPrice = parseFloat(obj.data.sell) * PROFITABILITY; 37 | newOrder(BUY_QTY, "buy"); 38 | } 39 | else if (sellPrice && parseFloat(obj.data.buy) >= sellPrice) { 40 | newOrder(BUY_QTY, "sell"); 41 | } 42 | } 43 | 44 | async function getAccountId() { 45 | const url = `https://api.mercadobitcoin.net/api/v4/accounts/`; 46 | const headers = { Authorization: "Bearer " + accessToken }; 47 | const { data } = await axios.get(url, { headers }); 48 | 49 | console.log(data); 50 | process.exit(0); 51 | } 52 | 53 | async function login() { 54 | const url = `https://api.mercadobitcoin.net/api/v4/authorize/`; 55 | const body = { login: process.env.API_KEY, password: process.env.API_SECRET }; 56 | const { data } = await axios.post(url, body); 57 | 58 | accessToken = data.access_token; 59 | 60 | console.log("Acesso autorizado!"); 61 | 62 | setTimeout(login, (data.expiration * 1000) - Date.now()); 63 | } 64 | 65 | async function newOrder(qty, side = "buy") { 66 | const url = `https://api.mercadobitcoin.net/api/v4/accounts/${process.env.ACCOUNT_ID}/${process.env.SYMBOL}/orders`; 67 | const body = { 68 | qty, 69 | side, 70 | type: "market" 71 | } 72 | const headers = { Authorization: "Bearer " + accessToken }; 73 | 74 | try { 75 | const { data } = await axios.post(url, body, { headers }); 76 | 77 | if (side === "sell") 78 | sellPrice = 0; 79 | 80 | return data; 81 | } catch (err) { 82 | console.error(err.response ? err.response.data : err.message); 83 | process.exit(0); 84 | } 85 | } -------------------------------------------------------------------------------- /binance-backtest/index.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios"); 2 | const fs = require("fs"); 3 | 4 | const SYMBOL = "ETHUSDT"; 5 | const INTERVAL = "15m"; 6 | const FILENAME = `data/${SYMBOL}_${INTERVAL}.txt`; 7 | const PROFITABILITY = 2;//% 8 | 9 | async function downloadCandles(startTime) { 10 | if (startTime >= Date.now()) return; 11 | 12 | const response = await axios.get(`https://api.binance.com/api/v3/klines?symbol=${SYMBOL}&interval=${INTERVAL}&limit=1000&startTime=${startTime}`); 13 | const closes = response.data.map(k => k[4]).reduce((a, b) => a + "\n" + b); 14 | console.log(closes); 15 | 16 | if (fs.existsSync(FILENAME)) 17 | fs.appendFileSync(FILENAME, "\n" + closes); 18 | else 19 | fs.writeFileSync(FILENAME, closes); 20 | 21 | await downloadCandles(response.data[response.data.length - 1][6] + 1); 22 | } 23 | downloadCandles(Date.now() - (365 * 24 * 60 * 60 * 1000)); 24 | 25 | async function doBacktest() { 26 | let closes = fs.readFileSync(FILENAME, { encoding: "utf-8" }); 27 | closes = closes.split("\n").map(c => parseFloat(c)); 28 | 29 | const firstCandle = closes[0]; 30 | let orderPrice = firstCandle; 31 | let isOpened = true; 32 | let qtdSells = 0; 33 | let accPnl = 0; 34 | console.log(`Abriu e comprou no preço ${firstCandle}`); 35 | 36 | for (let i = 1; i < closes.length; i++) { 37 | const currentCandle = closes[i]; 38 | 39 | const targetPrice = isOpened 40 | ? (orderPrice * (1 + (PROFITABILITY / 100))) 41 | : (orderPrice * (1 - (PROFITABILITY / 100))); 42 | 43 | const isLastCandle = i === closes.length - 1; 44 | if (isOpened) { 45 | if ((currentCandle >= targetPrice) || isLastCandle) { 46 | const pnl = ((currentCandle * 100) / orderPrice) - 100; 47 | accPnl += pnl; 48 | isOpened = false; 49 | orderPrice = currentCandle; 50 | qtdSells++; 51 | console.log(`Vendeu com ${pnl.toFixed(2)}% de lucro no preço: ${currentCandle}`); 52 | } 53 | } 54 | else if (!isOpened) { 55 | if (currentCandle <= targetPrice) { 56 | isOpened = true; 57 | console.log(`Comprou no preço ${currentCandle}`); 58 | } 59 | 60 | orderPrice = currentCandle; 61 | } 62 | } 63 | 64 | const lastCandle = closes[closes.length - 1]; 65 | let holdPnl = ((lastCandle * 100) / firstCandle) - 100; 66 | 67 | console.log("Fechou no preço: " + lastCandle); 68 | console.log("Operações: ", qtdSells); 69 | console.log("PnL Trade %: ", accPnl); 70 | console.log("PnL Hold %: ", holdPnl); 71 | 72 | } 73 | //doBacktest(); -------------------------------------------------------------------------------- /binance-copytrade-futures/index.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config(); 2 | 3 | const accounts = []; 4 | const api = require("./api"); 5 | 6 | async function loadAccounts() { 7 | const { listenKey } = await api.connectAccount(); 8 | console.log(`ListenKey obtained/updated: ${listenKey}`); 9 | 10 | let i = 1; 11 | while (process.env[`TRADER${i}_API_KEY`]) { 12 | accounts.push({ 13 | apiKey: process.env[`TRADER${i}_API_KEY`], 14 | apiSecret: process.env[`TRADER${i}_API_SECRET`] 15 | }) 16 | i++; 17 | } 18 | console.log(`${i - 1} copy accounts loaded`); 19 | 20 | return listenKey; 21 | } 22 | 23 | function copyTrade(trade) { 24 | const data = { 25 | symbol: trade.s, 26 | side: trade.S, 27 | type: trade.o 28 | } 29 | 30 | if (trade.q && parseFloat(trade.q)) 31 | data.quantity = trade.q; 32 | 33 | if (trade.p && parseFloat(trade.p)) 34 | data.price = trade.p 35 | 36 | if (trade.f && trade.f !== "GTC") 37 | data.timeInForce = trade.f; 38 | 39 | if (trade.sp && parseFloat(trade.sp)) 40 | data.stopPrice = trade.sp; 41 | 42 | if (trade.ps) 43 | data.positionSide = trade.ps; 44 | 45 | if (trade.AP && parseFloat(trade.AP)) 46 | data.activationPrice = trade.AP; 47 | 48 | if (trade.cr && parseFloat(trade.cr)) 49 | data.callbackRate = trade.cr; 50 | 51 | return data; 52 | } 53 | 54 | const WebSocket = require("ws"); 55 | 56 | const oldOrders = {}; 57 | 58 | async function start() { 59 | const listenKey = await loadAccounts(); 60 | 61 | const ws = new WebSocket(`${process.env.BINANCE_WS_URL}/${listenKey}`); 62 | ws.onmessage = async (event) => { 63 | 64 | try { 65 | const trade = JSON.parse(event.data); 66 | 67 | if (trade.e === "ORDER_TRADE_UPDATE" && !oldOrders[trade.i]) { 68 | oldOrders[trade.i] = true; 69 | 70 | console.clear(); 71 | 72 | const data = copyTrade(trade.o); 73 | 74 | const promises = accounts.map(acc => api.newOrder(data, acc.apiKey, acc.apiSecret)); 75 | const results = await Promise.allSettled(promises); 76 | console.log(results); 77 | 78 | //para não entrar em loop durante os testes, descomente abaixo 79 | process.exit(0); 80 | } 81 | } 82 | catch (err) { 83 | console.error(err); 84 | } 85 | } 86 | 87 | ws.onerror = (event) => { 88 | console.error(event); 89 | } 90 | 91 | console.log("Waiting news..."); 92 | 93 | setInterval(() => { 94 | api.connectAccount(); 95 | }, 59 * 60 * 1000) 96 | } 97 | 98 | start(); -------------------------------------------------------------------------------- /bitypreco-arbitrage/index.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config(); 2 | 3 | const AUTH_TOKEN = process.env.SIGNATURE + process.env.API_KEY; 4 | const COINPAIR = process.env.COINPAIR; 5 | const BUY_TRIGGER = parseFloat(process.env.BUY_TRIGGER); 6 | const PROFITABILITY = parseFloat(process.env.PROFITABILITY); 7 | const SELL_TRIGGER = BUY_TRIGGER * PROFITABILITY; 8 | 9 | let isOpened = false; 10 | let amountToBuy = parseFloat(process.env.BUY_AMOUNT) 11 | let amountToSell = 0; 12 | 13 | const { Socket } = require('phoenix-channels') 14 | 15 | const socket = new Socket(`wss://websocket.bitpreco.com/orderbook/socket`) 16 | socket.connect(); 17 | 18 | socket.onOpen(() => console.log('Connected successfully')) 19 | socket.onError(e => { 20 | console.error('Failed to connect to socket', e); 21 | process.exit(0); 22 | }) 23 | 24 | const channel = socket.channel(`ticker:ALL-BRL`, {}); 25 | channel.join() 26 | .receive('ok', resp => console.log('Joined successfully', resp)) 27 | .receive('error', resp => console.log('Unable to join', resp)) 28 | 29 | channel.on('price', payload => { 30 | console.clear(); 31 | //console.log(payload); 32 | 33 | const coinPair = payload[COINPAIR]; 34 | console.log(coinPair); 35 | console.log(`Is Opened? ${isOpened}`); 36 | 37 | if (!isOpened) { 38 | console.log(`Buy Trigger: ${BUY_TRIGGER}`); 39 | if (coinPair.sell <= BUY_TRIGGER) { 40 | isOpened = true; 41 | console.log("Comprar"); 42 | buy() 43 | .catch(err => { 44 | console.error(err); 45 | process.exit(0); 46 | }); 47 | } 48 | } 49 | else { 50 | console.log(`Sell Trigger: ${SELL_TRIGGER}`); 51 | if (coinPair.buy >= SELL_TRIGGER) { 52 | console.log("Vender"); 53 | sell() 54 | .then(response => { 55 | isOpened = false; 56 | process.exit(0); 57 | }) 58 | .catch(err => { 59 | console.error(err); 60 | process.exit(0); 61 | }) 62 | } 63 | } 64 | }) 65 | 66 | //compra/venda 67 | 68 | const axios = require("axios"); 69 | 70 | async function buy() { 71 | const data = await call('buy', amountToBuy); 72 | console.log(data); 73 | amountToSell = data.exec_amount; 74 | return data; 75 | } 76 | 77 | async function sell() { 78 | const data = await call('sell', amountToSell); 79 | console.log(data); 80 | amountToBuy = data.exec_amount * data.price; 81 | return data; 82 | } 83 | 84 | async function call(side, volume) { 85 | const url = `https://api.bitpreco.com/v1/trading/${side}`; 86 | 87 | const data = { 88 | market: COINPAIR, 89 | limited: false, 90 | auth_token: AUTH_TOKEN 91 | } 92 | 93 | if (side === "buy") 94 | data.volume = volume; 95 | else 96 | data.amount = volume; 97 | 98 | const result = await axios.post(url, data); 99 | return result.data; 100 | } -------------------------------------------------------------------------------- /binance-calculator/index.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config(); 2 | const axios = require('axios'); 3 | const crypto = require('crypto'); 4 | 5 | const SYMBOL = process.env.SYMBOL; 6 | const COMMISSION = process.env.BNB_COMMISSION === "true" ? 0.075 : 0; 7 | const START_TIME = parseInt(process.env.START_TIME || 0); 8 | const API_KEY = process.env.API_KEY; 9 | const API_SECRET = process.env.API_SECRET; 10 | const API_URL = process.env.API_URL; 11 | 12 | async function getAllOrders() { 13 | // rodando em modo simulado 14 | const mock = require("./mock.json"); 15 | return Promise.resolve(mock); 16 | 17 | // descomente o código abaixo para rodar de verdade 18 | // const data = { 19 | // symbol: SYMBOL, 20 | // limit: 1000,//máximo permitido 21 | // timestamp: Date.now(), 22 | // recvWindow: 60000//máximo permitido, default 5000 23 | // }; 24 | 25 | // const signature = crypto 26 | // .createHmac('sha256', API_SECRET) 27 | // .update(`${new URLSearchParams(data)}`) 28 | // .digest('hex'); 29 | 30 | // const newData = { ...data, signature }; 31 | // const qs = `?${new URLSearchParams(newData)}`; 32 | 33 | // try { 34 | // const result = await axios({ 35 | // method: 'GET', 36 | // url: `${API_URL}/api/v3/allOrders${qs}`, 37 | // headers: { 'X-MBX-APIKEY': API_KEY } 38 | // }); 39 | // return result.data; 40 | // } catch (err) { 41 | // console.error(err); 42 | // } 43 | } 44 | 45 | async function calcResults() { 46 | const allOrders = await getAllOrders(); 47 | 48 | const allBuyOrders = allOrders.filter(order => order.side === "BUY" && order.status === "FILLED" && order.workingTime > START_TIME); 49 | const totalBuyQuantity = allBuyOrders.map(order => parseFloat(order.executedQty)).reduce((a, b) => a + b); 50 | const totalBuyQuote = allBuyOrders.map(order => parseFloat(order.cummulativeQuoteQty)).reduce((a, b) => a + b); 51 | console.log(`Total Spent (${SYMBOL}): ${totalBuyQuote.toFixed(2)}`); 52 | console.log(`Number of Buys: ${allBuyOrders.length}`); 53 | const avgBuyPrice = totalBuyQuote / totalBuyQuantity; 54 | console.log(`Avg Buy Price (${SYMBOL}): ${avgBuyPrice.toFixed(2)}`); 55 | 56 | const allSellOrders = allOrders.filter(order => order.side === "SELL" && order.status === "FILLED" && order.workingTime > START_TIME); 57 | const totalSellQuantity = allSellOrders.map(order => parseFloat(order.executedQty)).reduce((a, b) => a + b); 58 | const totalSellQuote = allSellOrders.map(order => parseFloat(order.cummulativeQuoteQty)).reduce((a, b) => a + b); 59 | console.log(`Total Received (${SYMBOL}): ${totalSellQuote.toFixed(2)}`); 60 | console.log(`Number of Sells: ${allSellOrders.length}`); 61 | const avgSellPrice = totalSellQuote / totalSellQuantity; 62 | console.log(`Avg Sell Price (${SYMBOL}): ${avgSellPrice.toFixed(2)}`); 63 | 64 | const totalCommission = (allSellOrders.length + allBuyOrders.length) * COMMISSION; 65 | const quotePnL = (totalSellQuote - totalBuyQuote) * ((100 - totalCommission)/100); 66 | console.log(`Quote PnL (${SYMBOL}): ${quotePnL.toFixed(2)}`); 67 | 68 | const pnl = quotePnL * 100 / totalBuyQuote; 69 | console.log(`PnL (%): ${pnl.toFixed(2)}%`); 70 | } 71 | 72 | calcResults(); -------------------------------------------------------------------------------- /binance-historic-price/index.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios"); 2 | 3 | const readline = require("readline/promises"); 4 | const rl = readline.createInterface({ 5 | input: process.stdin, 6 | output: process.stdout, 7 | terminal: false 8 | }) 9 | 10 | let allSymbols = {}; 11 | 12 | async function loadAllSymbols() { 13 | const { data } = await axios.get(`https://api.binance.com/api/v3/exchangeInfo`); 14 | for (let i = 0; i < data.symbols.length; i++) { 15 | const symbolObj = data.symbols[i]; 16 | allSymbols[symbolObj.symbol] = { base: symbolObj.baseAsset, quote: symbolObj.quoteAsset }; 17 | } 18 | } 19 | 20 | async function getSymbolQuotation(symbol, timestamp) { 21 | console.log("Loading quotation for " + symbol); 22 | const { data } = await axios.get(`https://api.binance.com/api/v3/klines?symbol=${symbol}&interval=1d&limit=1&startTime=${timestamp}`); 23 | return { 24 | time: data[0][0], 25 | price: parseFloat(data[0][4]) 26 | } 27 | } 28 | 29 | const dollarcoins = ["USDT", "USDC", "DAI", "FDUSD", "TUSD"]; 30 | 31 | async function calcFiatPrice(symbolObj, fiat, cryptoPrice, timestamp) { 32 | //já é fiat, não precisa converter 33 | if (symbolObj.quote === fiat) { 34 | return cryptoPrice; 35 | } 36 | 37 | //pareado com alguma dollarcoin 38 | if (dollarcoins.some(sc => symbolObj.quote === sc)) { 39 | const fiatQuotation = await getSymbolQuotation("USDT" + fiat, timestamp); 40 | return fiatQuotation.price * cryptoPrice; 41 | } 42 | 43 | //outras criptos 44 | if(allSymbols[symbolObj.quote + fiat]){//se existe conversão direta 45 | const fiatQuotation = await getSymbolQuotation(symbolObj.quote + fiat, timestamp); 46 | return fiatQuotation.price * cryptoPrice; 47 | } 48 | 49 | //se não existe conversão direta, converte pra USDT primeiro 50 | const dollarQuotation = await getSymbolQuotation(symbolObj.quote + "USDT", timestamp); 51 | const fiatQuotation = await getSymbolQuotation("USDT" + fiat, timestamp); 52 | return dollarQuotation.price * fiatQuotation.price * cryptoPrice; 53 | } 54 | 55 | async function start() { 56 | console.clear(); 57 | 58 | let symbol = await rl.question("Informe o par de moeda: "); 59 | symbol = symbol.toUpperCase(); 60 | 61 | let fiat = await rl.question("Informe sua moeda fiat: "); 62 | fiat = fiat.toUpperCase(); 63 | 64 | let date = await rl.question("Informe a data (yyyy-mm-dd): "); 65 | if (!/\d{4}-\d{2}-\d{2}/.test(date)) { 66 | console.error("Data inválida, o formato é yyyy-mm-dd!"); 67 | process.exit(0); 68 | } 69 | 70 | date = Date.parse(date); 71 | 72 | console.clear(); 73 | console.log(`Preço para ${symbol} em ${new Date(date)}: `); 74 | 75 | try { 76 | await loadAllSymbols(); 77 | 78 | const symbolObj = allSymbols[symbol]; 79 | const cryptoQuotation = await getSymbolQuotation(symbol, date); 80 | console.log(symbolObj.quote + " " + cryptoQuotation.price); 81 | 82 | const fiatPrice = await calcFiatPrice(symbolObj, fiat, cryptoQuotation.price, date); 83 | console.log(fiat + " " + fiatPrice.toFixed(2)); 84 | } catch (err) { 85 | console.error(err.response ? err.response.data : err); 86 | } 87 | process.exit(0); 88 | } 89 | 90 | start(); 91 | -------------------------------------------------------------------------------- /binance-calculator/mock.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "symbol":"BTCUSDT", 4 | "orderId":25542659033, 5 | "executedQty":"0.05021000", 6 | "cummulativeQuoteQty":"3616.12420000", 7 | "status":"FILLED", 8 | "type":"MARKET", 9 | "side":"SELL", 10 | "workingTime":1710167753527 11 | }, 12 | { 13 | "symbol":"BTCUSDT", 14 | "orderId":25667154166, 15 | "executedQty":"0.06907000", 16 | "cummulativeQuoteQty":"4640.81399070", 17 | "status":"FILLED", 18 | "type":"MARKET", 19 | "side":"SELL", 20 | "workingTime":1710502288429 21 | }, 22 | { 23 | "symbol":"BTCUSDT", 24 | "orderId":26617893454, 25 | "executedQty":"0.03126000", 26 | "cummulativeQuoteQty":"1907.35078200", 27 | "status":"FILLED", 28 | "type":"MARKET", 29 | "side":"BUY", 30 | "workingTime":1713382192896 31 | }, 32 | { 33 | "symbol":"BTCUSDT", 34 | "orderId":26678210882, 35 | "executedQty":"0.03128000", 36 | "cummulativeQuoteQty":"2030.23622000", 37 | "status":"FILLED", 38 | "type":"MARKET", 39 | "side":"SELL", 40 | "workingTime":1713528384524 41 | }, 42 | { 43 | "symbol":"BTCUSDT", 44 | "orderId":28064125850, 45 | "executedQty":"0.01899000", 46 | "cummulativeQuoteQty":"1169.78418990", 47 | "status":"FILLED", 48 | "type":"MARKET", 49 | "side":"BUY", 50 | "workingTime":1719237641185 51 | }, 52 | { 53 | "symbol":"BTCUSDT", 54 | "orderId":35416324911, 55 | "executedQty":"0.00952000", 56 | "cummulativeQuoteQty":"999.66378400", 57 | "status":"FILLED", 58 | "type":"MARKET", 59 | "side":"SELL", 60 | "workingTime":1737149208089 61 | }, 62 | { 63 | "symbol":"BTCUSDT", 64 | "orderId":36037108947, 65 | "executedQty":"0.01052000", 66 | "cummulativeQuoteQty":"1040.31543600", 67 | "status":"FILLED", 68 | "type":"MARKET", 69 | "side":"BUY", 70 | "workingTime":1737978998518 71 | }, 72 | { 73 | "symbol":"BTCUSDT", 74 | "orderId":37101401631, 75 | "executedQty":"0.01279000", 76 | "cummulativeQuoteQty":"1235.24451470", 77 | "status":"FILLED", 78 | "type":"MARKET", 79 | "side":"BUY", 80 | "workingTime":1739423871524 81 | }, 82 | { 83 | "symbol":"BTCUSDT", 84 | "orderId":37123656157, 85 | "executedQty":"0.00224000", 86 | "cummulativeQuoteQty":"214.92800000", 87 | "status":"FILLED", 88 | "type":"MARKET", 89 | "side":"BUY", 90 | "workingTime":1739458964317 91 | }, 92 | { 93 | "symbol":"BTCUSDT", 94 | "orderId":37148513046, 95 | "executedQty":"0.00223000", 96 | "cummulativeQuoteQty":"215.15033310", 97 | "status":"FILLED", 98 | "type":"MARKET", 99 | "side":"BUY", 100 | "workingTime":1739498692297 101 | }, 102 | { 103 | "symbol":"BTCUSDT", 104 | "orderId":37201889596, 105 | "executedQty":"0.00425000", 106 | "cummulativeQuoteQty":"415.29546500", 107 | "status":"FILLED", 108 | "type":"MARKET", 109 | "side":"BUY", 110 | "workingTime":1739624990400 111 | }, 112 | { 113 | "symbol":"BTCUSDT", 114 | "orderId":37259014423, 115 | "executedQty":"0.00403000", 116 | "cummulativeQuoteQty":"387.76152220", 117 | "status":"FILLED", 118 | "type":"MARKET", 119 | "side":"BUY", 120 | "workingTime":1739806874047 121 | } 122 | ] -------------------------------------------------------------------------------- /binance-historic-price/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-historic-price", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "binance-historic-price", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^1.7.9" 13 | } 14 | }, 15 | "node_modules/asynckit": { 16 | "version": "0.4.0", 17 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 18 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 19 | "license": "MIT" 20 | }, 21 | "node_modules/axios": { 22 | "version": "1.7.9", 23 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", 24 | "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", 25 | "license": "MIT", 26 | "dependencies": { 27 | "follow-redirects": "^1.15.6", 28 | "form-data": "^4.0.0", 29 | "proxy-from-env": "^1.1.0" 30 | } 31 | }, 32 | "node_modules/combined-stream": { 33 | "version": "1.0.8", 34 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 35 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 36 | "license": "MIT", 37 | "dependencies": { 38 | "delayed-stream": "~1.0.0" 39 | }, 40 | "engines": { 41 | "node": ">= 0.8" 42 | } 43 | }, 44 | "node_modules/delayed-stream": { 45 | "version": "1.0.0", 46 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 47 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 48 | "license": "MIT", 49 | "engines": { 50 | "node": ">=0.4.0" 51 | } 52 | }, 53 | "node_modules/follow-redirects": { 54 | "version": "1.15.9", 55 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", 56 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", 57 | "funding": [ 58 | { 59 | "type": "individual", 60 | "url": "https://github.com/sponsors/RubenVerborgh" 61 | } 62 | ], 63 | "license": "MIT", 64 | "engines": { 65 | "node": ">=4.0" 66 | }, 67 | "peerDependenciesMeta": { 68 | "debug": { 69 | "optional": true 70 | } 71 | } 72 | }, 73 | "node_modules/form-data": { 74 | "version": "4.0.1", 75 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", 76 | "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", 77 | "license": "MIT", 78 | "dependencies": { 79 | "asynckit": "^0.4.0", 80 | "combined-stream": "^1.0.8", 81 | "mime-types": "^2.1.12" 82 | }, 83 | "engines": { 84 | "node": ">= 6" 85 | } 86 | }, 87 | "node_modules/mime-db": { 88 | "version": "1.52.0", 89 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 90 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 91 | "license": "MIT", 92 | "engines": { 93 | "node": ">= 0.6" 94 | } 95 | }, 96 | "node_modules/mime-types": { 97 | "version": "2.1.35", 98 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 99 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 100 | "license": "MIT", 101 | "dependencies": { 102 | "mime-db": "1.52.0" 103 | }, 104 | "engines": { 105 | "node": ">= 0.6" 106 | } 107 | }, 108 | "node_modules/proxy-from-env": { 109 | "version": "1.1.0", 110 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 111 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 112 | "license": "MIT" 113 | } 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /binance-sma-ema/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-ema", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "binance-ema", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "axios": "^1.6.7", 13 | "dotenv": "^16.4.5" 14 | } 15 | }, 16 | "node_modules/asynckit": { 17 | "version": "0.4.0", 18 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 19 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 20 | }, 21 | "node_modules/axios": { 22 | "version": "1.6.7", 23 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", 24 | "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", 25 | "dependencies": { 26 | "follow-redirects": "^1.15.4", 27 | "form-data": "^4.0.0", 28 | "proxy-from-env": "^1.1.0" 29 | } 30 | }, 31 | "node_modules/combined-stream": { 32 | "version": "1.0.8", 33 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 34 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 35 | "dependencies": { 36 | "delayed-stream": "~1.0.0" 37 | }, 38 | "engines": { 39 | "node": ">= 0.8" 40 | } 41 | }, 42 | "node_modules/delayed-stream": { 43 | "version": "1.0.0", 44 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 45 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 46 | "engines": { 47 | "node": ">=0.4.0" 48 | } 49 | }, 50 | "node_modules/dotenv": { 51 | "version": "16.4.5", 52 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", 53 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", 54 | "engines": { 55 | "node": ">=12" 56 | }, 57 | "funding": { 58 | "url": "https://dotenvx.com" 59 | } 60 | }, 61 | "node_modules/follow-redirects": { 62 | "version": "1.15.5", 63 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", 64 | "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", 65 | "funding": [ 66 | { 67 | "type": "individual", 68 | "url": "https://github.com/sponsors/RubenVerborgh" 69 | } 70 | ], 71 | "engines": { 72 | "node": ">=4.0" 73 | }, 74 | "peerDependenciesMeta": { 75 | "debug": { 76 | "optional": true 77 | } 78 | } 79 | }, 80 | "node_modules/form-data": { 81 | "version": "4.0.0", 82 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 83 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 84 | "dependencies": { 85 | "asynckit": "^0.4.0", 86 | "combined-stream": "^1.0.8", 87 | "mime-types": "^2.1.12" 88 | }, 89 | "engines": { 90 | "node": ">= 6" 91 | } 92 | }, 93 | "node_modules/mime-db": { 94 | "version": "1.52.0", 95 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 96 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 97 | "engines": { 98 | "node": ">= 0.6" 99 | } 100 | }, 101 | "node_modules/mime-types": { 102 | "version": "2.1.35", 103 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 104 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 105 | "dependencies": { 106 | "mime-db": "1.52.0" 107 | }, 108 | "engines": { 109 | "node": ">= 0.6" 110 | } 111 | }, 112 | "node_modules/proxy-from-env": { 113 | "version": "1.1.0", 114 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 115 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 116 | } 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /binance-trailing-stop/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-trailing-stop", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "binance-trailing-stop", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^1.6.8", 13 | "dotenv": "^16.4.5" 14 | } 15 | }, 16 | "node_modules/asynckit": { 17 | "version": "0.4.0", 18 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 19 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 20 | }, 21 | "node_modules/axios": { 22 | "version": "1.6.8", 23 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", 24 | "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", 25 | "dependencies": { 26 | "follow-redirects": "^1.15.6", 27 | "form-data": "^4.0.0", 28 | "proxy-from-env": "^1.1.0" 29 | } 30 | }, 31 | "node_modules/combined-stream": { 32 | "version": "1.0.8", 33 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 34 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 35 | "dependencies": { 36 | "delayed-stream": "~1.0.0" 37 | }, 38 | "engines": { 39 | "node": ">= 0.8" 40 | } 41 | }, 42 | "node_modules/delayed-stream": { 43 | "version": "1.0.0", 44 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 45 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 46 | "engines": { 47 | "node": ">=0.4.0" 48 | } 49 | }, 50 | "node_modules/dotenv": { 51 | "version": "16.4.5", 52 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", 53 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", 54 | "engines": { 55 | "node": ">=12" 56 | }, 57 | "funding": { 58 | "url": "https://dotenvx.com" 59 | } 60 | }, 61 | "node_modules/follow-redirects": { 62 | "version": "1.15.6", 63 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 64 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", 65 | "funding": [ 66 | { 67 | "type": "individual", 68 | "url": "https://github.com/sponsors/RubenVerborgh" 69 | } 70 | ], 71 | "engines": { 72 | "node": ">=4.0" 73 | }, 74 | "peerDependenciesMeta": { 75 | "debug": { 76 | "optional": true 77 | } 78 | } 79 | }, 80 | "node_modules/form-data": { 81 | "version": "4.0.0", 82 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 83 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 84 | "dependencies": { 85 | "asynckit": "^0.4.0", 86 | "combined-stream": "^1.0.8", 87 | "mime-types": "^2.1.12" 88 | }, 89 | "engines": { 90 | "node": ">= 6" 91 | } 92 | }, 93 | "node_modules/mime-db": { 94 | "version": "1.52.0", 95 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 96 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 97 | "engines": { 98 | "node": ">= 0.6" 99 | } 100 | }, 101 | "node_modules/mime-types": { 102 | "version": "2.1.35", 103 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 104 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 105 | "dependencies": { 106 | "mime-db": "1.52.0" 107 | }, 108 | "engines": { 109 | "node": ">= 0.6" 110 | } 111 | }, 112 | "node_modules/proxy-from-env": { 113 | "version": "1.1.0", 114 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 115 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 116 | } 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /binance-candles/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-top-gl", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "binance-top-gl", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^1.6.8", 13 | "ws": "^8.17.0" 14 | } 15 | }, 16 | "node_modules/asynckit": { 17 | "version": "0.4.0", 18 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 19 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 20 | }, 21 | "node_modules/axios": { 22 | "version": "1.6.8", 23 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", 24 | "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", 25 | "dependencies": { 26 | "follow-redirects": "^1.15.6", 27 | "form-data": "^4.0.0", 28 | "proxy-from-env": "^1.1.0" 29 | } 30 | }, 31 | "node_modules/combined-stream": { 32 | "version": "1.0.8", 33 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 34 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 35 | "dependencies": { 36 | "delayed-stream": "~1.0.0" 37 | }, 38 | "engines": { 39 | "node": ">= 0.8" 40 | } 41 | }, 42 | "node_modules/delayed-stream": { 43 | "version": "1.0.0", 44 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 45 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 46 | "engines": { 47 | "node": ">=0.4.0" 48 | } 49 | }, 50 | "node_modules/follow-redirects": { 51 | "version": "1.15.6", 52 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 53 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", 54 | "funding": [ 55 | { 56 | "type": "individual", 57 | "url": "https://github.com/sponsors/RubenVerborgh" 58 | } 59 | ], 60 | "engines": { 61 | "node": ">=4.0" 62 | }, 63 | "peerDependenciesMeta": { 64 | "debug": { 65 | "optional": true 66 | } 67 | } 68 | }, 69 | "node_modules/form-data": { 70 | "version": "4.0.0", 71 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 72 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 73 | "dependencies": { 74 | "asynckit": "^0.4.0", 75 | "combined-stream": "^1.0.8", 76 | "mime-types": "^2.1.12" 77 | }, 78 | "engines": { 79 | "node": ">= 6" 80 | } 81 | }, 82 | "node_modules/mime-db": { 83 | "version": "1.52.0", 84 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 85 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 86 | "engines": { 87 | "node": ">= 0.6" 88 | } 89 | }, 90 | "node_modules/mime-types": { 91 | "version": "2.1.35", 92 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 93 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 94 | "dependencies": { 95 | "mime-db": "1.52.0" 96 | }, 97 | "engines": { 98 | "node": ">= 0.6" 99 | } 100 | }, 101 | "node_modules/proxy-from-env": { 102 | "version": "1.1.0", 103 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 104 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 105 | }, 106 | "node_modules/ws": { 107 | "version": "8.17.0", 108 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", 109 | "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", 110 | "engines": { 111 | "node": ">=10.0.0" 112 | }, 113 | "peerDependencies": { 114 | "bufferutil": "^4.0.1", 115 | "utf-8-validate": ">=5.0.2" 116 | }, 117 | "peerDependenciesMeta": { 118 | "bufferutil": { 119 | "optional": true 120 | }, 121 | "utf-8-validate": { 122 | "optional": true 123 | } 124 | } 125 | } 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /binance-top-gl/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-top-gl", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "binance-top-gl", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^1.6.8", 13 | "ws": "^8.17.0" 14 | } 15 | }, 16 | "node_modules/asynckit": { 17 | "version": "0.4.0", 18 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 19 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 20 | }, 21 | "node_modules/axios": { 22 | "version": "1.6.8", 23 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", 24 | "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", 25 | "dependencies": { 26 | "follow-redirects": "^1.15.6", 27 | "form-data": "^4.0.0", 28 | "proxy-from-env": "^1.1.0" 29 | } 30 | }, 31 | "node_modules/combined-stream": { 32 | "version": "1.0.8", 33 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 34 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 35 | "dependencies": { 36 | "delayed-stream": "~1.0.0" 37 | }, 38 | "engines": { 39 | "node": ">= 0.8" 40 | } 41 | }, 42 | "node_modules/delayed-stream": { 43 | "version": "1.0.0", 44 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 45 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 46 | "engines": { 47 | "node": ">=0.4.0" 48 | } 49 | }, 50 | "node_modules/follow-redirects": { 51 | "version": "1.15.6", 52 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 53 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", 54 | "funding": [ 55 | { 56 | "type": "individual", 57 | "url": "https://github.com/sponsors/RubenVerborgh" 58 | } 59 | ], 60 | "engines": { 61 | "node": ">=4.0" 62 | }, 63 | "peerDependenciesMeta": { 64 | "debug": { 65 | "optional": true 66 | } 67 | } 68 | }, 69 | "node_modules/form-data": { 70 | "version": "4.0.0", 71 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 72 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 73 | "dependencies": { 74 | "asynckit": "^0.4.0", 75 | "combined-stream": "^1.0.8", 76 | "mime-types": "^2.1.12" 77 | }, 78 | "engines": { 79 | "node": ">= 6" 80 | } 81 | }, 82 | "node_modules/mime-db": { 83 | "version": "1.52.0", 84 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 85 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 86 | "engines": { 87 | "node": ">= 0.6" 88 | } 89 | }, 90 | "node_modules/mime-types": { 91 | "version": "2.1.35", 92 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 93 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 94 | "dependencies": { 95 | "mime-db": "1.52.0" 96 | }, 97 | "engines": { 98 | "node": ">= 0.6" 99 | } 100 | }, 101 | "node_modules/proxy-from-env": { 102 | "version": "1.1.0", 103 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 104 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 105 | }, 106 | "node_modules/ws": { 107 | "version": "8.17.0", 108 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", 109 | "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", 110 | "engines": { 111 | "node": ">=10.0.0" 112 | }, 113 | "peerDependencies": { 114 | "bufferutil": "^4.0.1", 115 | "utf-8-validate": ">=5.0.2" 116 | }, 117 | "peerDependenciesMeta": { 118 | "bufferutil": { 119 | "optional": true 120 | }, 121 | "utf-8-validate": { 122 | "optional": true 123 | } 124 | } 125 | } 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /binance-copytrade-spot/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-copytrade-spot", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "binance-copytrade-spot", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^1.3.4", 13 | "dotenv": "^16.0.3", 14 | "ws": "^8.13.0" 15 | } 16 | }, 17 | "node_modules/asynckit": { 18 | "version": "0.4.0", 19 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 20 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 21 | }, 22 | "node_modules/axios": { 23 | "version": "1.3.4", 24 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", 25 | "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", 26 | "dependencies": { 27 | "follow-redirects": "^1.15.0", 28 | "form-data": "^4.0.0", 29 | "proxy-from-env": "^1.1.0" 30 | } 31 | }, 32 | "node_modules/combined-stream": { 33 | "version": "1.0.8", 34 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 35 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 36 | "dependencies": { 37 | "delayed-stream": "~1.0.0" 38 | }, 39 | "engines": { 40 | "node": ">= 0.8" 41 | } 42 | }, 43 | "node_modules/delayed-stream": { 44 | "version": "1.0.0", 45 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 46 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 47 | "engines": { 48 | "node": ">=0.4.0" 49 | } 50 | }, 51 | "node_modules/dotenv": { 52 | "version": "16.0.3", 53 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 54 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", 55 | "engines": { 56 | "node": ">=12" 57 | } 58 | }, 59 | "node_modules/follow-redirects": { 60 | "version": "1.15.2", 61 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 62 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 63 | "funding": [ 64 | { 65 | "type": "individual", 66 | "url": "https://github.com/sponsors/RubenVerborgh" 67 | } 68 | ], 69 | "engines": { 70 | "node": ">=4.0" 71 | }, 72 | "peerDependenciesMeta": { 73 | "debug": { 74 | "optional": true 75 | } 76 | } 77 | }, 78 | "node_modules/form-data": { 79 | "version": "4.0.0", 80 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 81 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 82 | "dependencies": { 83 | "asynckit": "^0.4.0", 84 | "combined-stream": "^1.0.8", 85 | "mime-types": "^2.1.12" 86 | }, 87 | "engines": { 88 | "node": ">= 6" 89 | } 90 | }, 91 | "node_modules/mime-db": { 92 | "version": "1.52.0", 93 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 94 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 95 | "engines": { 96 | "node": ">= 0.6" 97 | } 98 | }, 99 | "node_modules/mime-types": { 100 | "version": "2.1.35", 101 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 102 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 103 | "dependencies": { 104 | "mime-db": "1.52.0" 105 | }, 106 | "engines": { 107 | "node": ">= 0.6" 108 | } 109 | }, 110 | "node_modules/proxy-from-env": { 111 | "version": "1.1.0", 112 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 113 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 114 | }, 115 | "node_modules/ws": { 116 | "version": "8.13.0", 117 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", 118 | "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", 119 | "engines": { 120 | "node": ">=10.0.0" 121 | }, 122 | "peerDependencies": { 123 | "bufferutil": "^4.0.1", 124 | "utf-8-validate": ">=5.0.2" 125 | }, 126 | "peerDependenciesMeta": { 127 | "bufferutil": { 128 | "optional": true 129 | }, 130 | "utf-8-validate": { 131 | "optional": true 132 | } 133 | } 134 | } 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /binance-copytrade-futures/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-copytrade-futures", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "binance-copytrade-futures", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^1.4.0", 13 | "dotenv": "^16.0.3", 14 | "ws": "^8.13.0" 15 | } 16 | }, 17 | "node_modules/asynckit": { 18 | "version": "0.4.0", 19 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 20 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 21 | }, 22 | "node_modules/axios": { 23 | "version": "1.4.0", 24 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", 25 | "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", 26 | "dependencies": { 27 | "follow-redirects": "^1.15.0", 28 | "form-data": "^4.0.0", 29 | "proxy-from-env": "^1.1.0" 30 | } 31 | }, 32 | "node_modules/combined-stream": { 33 | "version": "1.0.8", 34 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 35 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 36 | "dependencies": { 37 | "delayed-stream": "~1.0.0" 38 | }, 39 | "engines": { 40 | "node": ">= 0.8" 41 | } 42 | }, 43 | "node_modules/delayed-stream": { 44 | "version": "1.0.0", 45 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 46 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 47 | "engines": { 48 | "node": ">=0.4.0" 49 | } 50 | }, 51 | "node_modules/dotenv": { 52 | "version": "16.0.3", 53 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 54 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", 55 | "engines": { 56 | "node": ">=12" 57 | } 58 | }, 59 | "node_modules/follow-redirects": { 60 | "version": "1.15.2", 61 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 62 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 63 | "funding": [ 64 | { 65 | "type": "individual", 66 | "url": "https://github.com/sponsors/RubenVerborgh" 67 | } 68 | ], 69 | "engines": { 70 | "node": ">=4.0" 71 | }, 72 | "peerDependenciesMeta": { 73 | "debug": { 74 | "optional": true 75 | } 76 | } 77 | }, 78 | "node_modules/form-data": { 79 | "version": "4.0.0", 80 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 81 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 82 | "dependencies": { 83 | "asynckit": "^0.4.0", 84 | "combined-stream": "^1.0.8", 85 | "mime-types": "^2.1.12" 86 | }, 87 | "engines": { 88 | "node": ">= 6" 89 | } 90 | }, 91 | "node_modules/mime-db": { 92 | "version": "1.52.0", 93 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 94 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 95 | "engines": { 96 | "node": ">= 0.6" 97 | } 98 | }, 99 | "node_modules/mime-types": { 100 | "version": "2.1.35", 101 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 102 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 103 | "dependencies": { 104 | "mime-db": "1.52.0" 105 | }, 106 | "engines": { 107 | "node": ">= 0.6" 108 | } 109 | }, 110 | "node_modules/proxy-from-env": { 111 | "version": "1.1.0", 112 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 113 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 114 | }, 115 | "node_modules/ws": { 116 | "version": "8.13.0", 117 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", 118 | "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", 119 | "engines": { 120 | "node": ">=10.0.0" 121 | }, 122 | "peerDependencies": { 123 | "bufferutil": "^4.0.1", 124 | "utf-8-validate": ">=5.0.2" 125 | }, 126 | "peerDependenciesMeta": { 127 | "bufferutil": { 128 | "optional": true 129 | }, 130 | "utf-8-validate": { 131 | "optional": true 132 | } 133 | } 134 | } 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /mercado-bitcoin/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mercado-bitcoin", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "mercado-bitcoin", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^1.5.0", 13 | "dotenv": "^16.3.1", 14 | "ws": "^8.14.2" 15 | } 16 | }, 17 | "node_modules/asynckit": { 18 | "version": "0.4.0", 19 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 20 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 21 | }, 22 | "node_modules/axios": { 23 | "version": "1.5.0", 24 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", 25 | "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", 26 | "dependencies": { 27 | "follow-redirects": "^1.15.0", 28 | "form-data": "^4.0.0", 29 | "proxy-from-env": "^1.1.0" 30 | } 31 | }, 32 | "node_modules/combined-stream": { 33 | "version": "1.0.8", 34 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 35 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 36 | "dependencies": { 37 | "delayed-stream": "~1.0.0" 38 | }, 39 | "engines": { 40 | "node": ">= 0.8" 41 | } 42 | }, 43 | "node_modules/delayed-stream": { 44 | "version": "1.0.0", 45 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 46 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 47 | "engines": { 48 | "node": ">=0.4.0" 49 | } 50 | }, 51 | "node_modules/dotenv": { 52 | "version": "16.3.1", 53 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", 54 | "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", 55 | "engines": { 56 | "node": ">=12" 57 | }, 58 | "funding": { 59 | "url": "https://github.com/motdotla/dotenv?sponsor=1" 60 | } 61 | }, 62 | "node_modules/follow-redirects": { 63 | "version": "1.15.3", 64 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", 65 | "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", 66 | "funding": [ 67 | { 68 | "type": "individual", 69 | "url": "https://github.com/sponsors/RubenVerborgh" 70 | } 71 | ], 72 | "engines": { 73 | "node": ">=4.0" 74 | }, 75 | "peerDependenciesMeta": { 76 | "debug": { 77 | "optional": true 78 | } 79 | } 80 | }, 81 | "node_modules/form-data": { 82 | "version": "4.0.0", 83 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 84 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 85 | "dependencies": { 86 | "asynckit": "^0.4.0", 87 | "combined-stream": "^1.0.8", 88 | "mime-types": "^2.1.12" 89 | }, 90 | "engines": { 91 | "node": ">= 6" 92 | } 93 | }, 94 | "node_modules/mime-db": { 95 | "version": "1.52.0", 96 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 97 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 98 | "engines": { 99 | "node": ">= 0.6" 100 | } 101 | }, 102 | "node_modules/mime-types": { 103 | "version": "2.1.35", 104 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 105 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 106 | "dependencies": { 107 | "mime-db": "1.52.0" 108 | }, 109 | "engines": { 110 | "node": ">= 0.6" 111 | } 112 | }, 113 | "node_modules/proxy-from-env": { 114 | "version": "1.1.0", 115 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 116 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 117 | }, 118 | "node_modules/ws": { 119 | "version": "8.14.2", 120 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", 121 | "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", 122 | "engines": { 123 | "node": ">=10.0.0" 124 | }, 125 | "peerDependencies": { 126 | "bufferutil": "^4.0.1", 127 | "utf-8-validate": ">=5.0.2" 128 | }, 129 | "peerDependenciesMeta": { 130 | "bufferutil": { 131 | "optional": true 132 | }, 133 | "utf-8-validate": { 134 | "optional": true 135 | } 136 | } 137 | } 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /binance-arbitrage/index.js: -------------------------------------------------------------------------------- 1 | const { exchangeInfo, newOrder } = require("./api"); 2 | const stream = require("./stream"); 3 | 4 | const QUOTE = process.env.QUOTE; 5 | const AMOUNT = parseInt(process.env.AMOUNT); 6 | const INTERVAL = parseInt(process.env.CRAWLER_INTERVAL); 7 | const PROFITABILITY = parseFloat(process.env.PROFITABILITY); 8 | 9 | function getBuyBuySell(buySymbols, allSymbols, symbolsMap) { 10 | const buyBuySell = []; 11 | for (let i = 0; i < buySymbols.length; i++) { 12 | const buy1 = buySymbols[i]; 13 | 14 | const right = allSymbols.filter(s => s.quote === buy1.base); 15 | 16 | for (let j = 0; j < right.length; j++) { 17 | const buy2 = right[j]; 18 | 19 | const sell1 = symbolsMap[buy2.base + buy1.quote]; 20 | if (!sell1) continue; 21 | 22 | buyBuySell.push({ buy1, buy2, sell1 }); 23 | } 24 | } 25 | return buyBuySell; 26 | } 27 | 28 | function getBuySellSell(buySymbols, allSymbols, symbolsMap) { 29 | const buySellSell = []; 30 | for (let i = 0; i < buySymbols.length; i++) { 31 | const buy1 = buySymbols[i]; 32 | 33 | const right = allSymbols.filter(s => s.base === buy1.base && s.quote !== buy1.quote); 34 | 35 | for (let j = 0; j < right.length; j++) { 36 | const sell1 = right[j]; 37 | 38 | const sell2 = symbolsMap[sell1.quote + buy1.quote]; 39 | if (!sell2) continue; 40 | 41 | buySellSell.push({ buy1, sell1, sell2 }); 42 | } 43 | } 44 | return buySellSell; 45 | } 46 | 47 | async function processBuyBuySell(buyBuySell) { 48 | for (let i = 0; i < buyBuySell.length; i++) { 49 | const candidate = buyBuySell[i]; 50 | 51 | //verifica se já temos todos os preços 52 | let priceBuy1 = stream.getBook(candidate.buy1.symbol); 53 | if (!priceBuy1) continue; 54 | priceBuy1 = parseFloat(priceBuy1.price); 55 | 56 | let priceBuy2 = stream.getBook(candidate.buy2.symbol); 57 | if (!priceBuy2) continue; 58 | priceBuy2 = parseFloat(priceBuy2.price); 59 | 60 | let priceSell1 = stream.getBook(candidate.sell1.symbol); 61 | if (!priceSell1) continue; 62 | 63 | priceSell1 = parseFloat(priceSell1.price); 64 | 65 | //se tem o preço dos 3, pode analisar a lucratividade 66 | const crossRate = (1 / priceBuy1) * (1 / priceBuy2) * priceSell1; 67 | if (crossRate > PROFITABILITY) { 68 | console.log(`OP BBS EM ${candidate.buy1.symbol} > ${candidate.buy2.symbol} > ${candidate.sell1.symbol} = ${crossRate}`); 69 | console.log(`Investindo ${QUOTE}${AMOUNT}, retorna ${QUOTE}${((AMOUNT / priceBuy1) / priceBuy2) * priceSell1}`); 70 | } 71 | } 72 | } 73 | 74 | async function processBuySellSell(buySellSell) { 75 | for (let i = 0; i < buySellSell.length; i++) { 76 | const candidate = buySellSell[i]; 77 | 78 | //verifica se já temos todos os preços 79 | let priceBuy1 = stream.getBook(candidate.buy1.symbol); 80 | if (!priceBuy1) continue; 81 | priceBuy1 = parseFloat(priceBuy1.price); 82 | 83 | let priceSell1 = stream.getBook(candidate.sell1.symbol); 84 | if (!priceSell1) continue; 85 | priceSell1 = parseFloat(priceSell1.price); 86 | 87 | let priceSell2 = stream.getBook(candidate.sell2.symbol); 88 | if (!priceSell2) continue; 89 | priceSell2 = parseFloat(priceSell2.price); 90 | 91 | //se tem o preço dos 3, pode analisar a lucratividade 92 | const crossRate = (1 / priceBuy1) * priceSell1 * priceSell2; 93 | if (crossRate > PROFITABILITY) { 94 | console.log(`OP BSS EM ${candidate.buy1.symbol} > ${candidate.sell1.symbol} > ${candidate.sell2.symbol} = ${crossRate}`); 95 | console.log(`Investindo ${QUOTE}${AMOUNT}, retorna ${QUOTE}${((AMOUNT / priceBuy1) * priceSell1) * priceSell2}`); 96 | } 97 | } 98 | } 99 | 100 | function getSymbolMap(symbols) { 101 | const map = {}; 102 | symbols.map(s => map[s.symbol] = s); 103 | return map; 104 | } 105 | 106 | async function start() { 107 | //pega todas moedas que estão sendo negociadas 108 | console.log('Loading Exchange Info...'); 109 | const allSymbols = await exchangeInfo(); 110 | 111 | //moedas que você pode comprar 112 | const buySymbols = allSymbols.filter(s => s.quote === QUOTE); 113 | console.log('There are ' + buySymbols.length + " pairs that you can buy with " + QUOTE); 114 | 115 | //organiza em map para performance 116 | const symbolsMap = getSymbolMap(allSymbols); 117 | 118 | //descobre todos os pares que podem triangular BUY-BUY-SELL 119 | const buyBuySell = getBuyBuySell(buySymbols, allSymbols, symbolsMap); 120 | console.log('There are ' + buyBuySell.length + " pairs that we can do BBS"); 121 | 122 | //descobre todos os pares que podem triangular BUY-SELL-SELL 123 | const buySellSell = getBuySellSell(buySymbols, allSymbols, symbolsMap); 124 | console.log('There are ' + buySellSell.length + " pairs that we can do BSS"); 125 | 126 | setInterval(async () => { 127 | console.log(new Date()); 128 | processBuyBuySell(buyBuySell); 129 | processBuySellSell(buySellSell); 130 | }, INTERVAL || 3000) 131 | 132 | } 133 | 134 | start(); -------------------------------------------------------------------------------- /support-resistance/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "support-resistance", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "support-resistance", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^1.2.1" 13 | } 14 | }, 15 | "node_modules/asynckit": { 16 | "version": "0.4.0", 17 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 18 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 19 | }, 20 | "node_modules/axios": { 21 | "version": "1.2.1", 22 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz", 23 | "integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==", 24 | "dependencies": { 25 | "follow-redirects": "^1.15.0", 26 | "form-data": "^4.0.0", 27 | "proxy-from-env": "^1.1.0" 28 | } 29 | }, 30 | "node_modules/combined-stream": { 31 | "version": "1.0.8", 32 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 33 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 34 | "dependencies": { 35 | "delayed-stream": "~1.0.0" 36 | }, 37 | "engines": { 38 | "node": ">= 0.8" 39 | } 40 | }, 41 | "node_modules/delayed-stream": { 42 | "version": "1.0.0", 43 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 44 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 45 | "engines": { 46 | "node": ">=0.4.0" 47 | } 48 | }, 49 | "node_modules/follow-redirects": { 50 | "version": "1.15.2", 51 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 52 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 53 | "funding": [ 54 | { 55 | "type": "individual", 56 | "url": "https://github.com/sponsors/RubenVerborgh" 57 | } 58 | ], 59 | "engines": { 60 | "node": ">=4.0" 61 | }, 62 | "peerDependenciesMeta": { 63 | "debug": { 64 | "optional": true 65 | } 66 | } 67 | }, 68 | "node_modules/form-data": { 69 | "version": "4.0.0", 70 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 71 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 72 | "dependencies": { 73 | "asynckit": "^0.4.0", 74 | "combined-stream": "^1.0.8", 75 | "mime-types": "^2.1.12" 76 | }, 77 | "engines": { 78 | "node": ">= 6" 79 | } 80 | }, 81 | "node_modules/mime-db": { 82 | "version": "1.52.0", 83 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 84 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 85 | "engines": { 86 | "node": ">= 0.6" 87 | } 88 | }, 89 | "node_modules/mime-types": { 90 | "version": "2.1.35", 91 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 92 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 93 | "dependencies": { 94 | "mime-db": "1.52.0" 95 | }, 96 | "engines": { 97 | "node": ">= 0.6" 98 | } 99 | }, 100 | "node_modules/proxy-from-env": { 101 | "version": "1.1.0", 102 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 103 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 104 | } 105 | }, 106 | "dependencies": { 107 | "asynckit": { 108 | "version": "0.4.0", 109 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 110 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 111 | }, 112 | "axios": { 113 | "version": "1.2.1", 114 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz", 115 | "integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==", 116 | "requires": { 117 | "follow-redirects": "^1.15.0", 118 | "form-data": "^4.0.0", 119 | "proxy-from-env": "^1.1.0" 120 | } 121 | }, 122 | "combined-stream": { 123 | "version": "1.0.8", 124 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 125 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 126 | "requires": { 127 | "delayed-stream": "~1.0.0" 128 | } 129 | }, 130 | "delayed-stream": { 131 | "version": "1.0.0", 132 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 133 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 134 | }, 135 | "follow-redirects": { 136 | "version": "1.15.2", 137 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 138 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" 139 | }, 140 | "form-data": { 141 | "version": "4.0.0", 142 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 143 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 144 | "requires": { 145 | "asynckit": "^0.4.0", 146 | "combined-stream": "^1.0.8", 147 | "mime-types": "^2.1.12" 148 | } 149 | }, 150 | "mime-db": { 151 | "version": "1.52.0", 152 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 153 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 154 | }, 155 | "mime-types": { 156 | "version": "2.1.35", 157 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 158 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 159 | "requires": { 160 | "mime-db": "1.52.0" 161 | } 162 | }, 163 | "proxy-from-env": { 164 | "version": "1.1.0", 165 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 166 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 167 | } 168 | } 169 | } 170 | -------------------------------------------------------------------------------- /binance-arbitrage/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-arbitrage", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "binance-arbitrage", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^0.27.2", 13 | "dotenv": "^16.0.1", 14 | "ws": "^8.6.0" 15 | } 16 | }, 17 | "node_modules/asynckit": { 18 | "version": "0.4.0", 19 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 20 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 21 | }, 22 | "node_modules/axios": { 23 | "version": "0.27.2", 24 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", 25 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", 26 | "dependencies": { 27 | "follow-redirects": "^1.14.9", 28 | "form-data": "^4.0.0" 29 | } 30 | }, 31 | "node_modules/combined-stream": { 32 | "version": "1.0.8", 33 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 34 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 35 | "dependencies": { 36 | "delayed-stream": "~1.0.0" 37 | }, 38 | "engines": { 39 | "node": ">= 0.8" 40 | } 41 | }, 42 | "node_modules/delayed-stream": { 43 | "version": "1.0.0", 44 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 45 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 46 | "engines": { 47 | "node": ">=0.4.0" 48 | } 49 | }, 50 | "node_modules/dotenv": { 51 | "version": "16.0.1", 52 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", 53 | "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==", 54 | "engines": { 55 | "node": ">=12" 56 | } 57 | }, 58 | "node_modules/follow-redirects": { 59 | "version": "1.15.0", 60 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz", 61 | "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==", 62 | "funding": [ 63 | { 64 | "type": "individual", 65 | "url": "https://github.com/sponsors/RubenVerborgh" 66 | } 67 | ], 68 | "engines": { 69 | "node": ">=4.0" 70 | }, 71 | "peerDependenciesMeta": { 72 | "debug": { 73 | "optional": true 74 | } 75 | } 76 | }, 77 | "node_modules/form-data": { 78 | "version": "4.0.0", 79 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 80 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 81 | "dependencies": { 82 | "asynckit": "^0.4.0", 83 | "combined-stream": "^1.0.8", 84 | "mime-types": "^2.1.12" 85 | }, 86 | "engines": { 87 | "node": ">= 6" 88 | } 89 | }, 90 | "node_modules/mime-db": { 91 | "version": "1.52.0", 92 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 93 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 94 | "engines": { 95 | "node": ">= 0.6" 96 | } 97 | }, 98 | "node_modules/mime-types": { 99 | "version": "2.1.35", 100 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 101 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 102 | "dependencies": { 103 | "mime-db": "1.52.0" 104 | }, 105 | "engines": { 106 | "node": ">= 0.6" 107 | } 108 | }, 109 | "node_modules/ws": { 110 | "version": "8.6.0", 111 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", 112 | "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", 113 | "engines": { 114 | "node": ">=10.0.0" 115 | }, 116 | "peerDependencies": { 117 | "bufferutil": "^4.0.1", 118 | "utf-8-validate": "^5.0.2" 119 | }, 120 | "peerDependenciesMeta": { 121 | "bufferutil": { 122 | "optional": true 123 | }, 124 | "utf-8-validate": { 125 | "optional": true 126 | } 127 | } 128 | } 129 | }, 130 | "dependencies": { 131 | "asynckit": { 132 | "version": "0.4.0", 133 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 134 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 135 | }, 136 | "axios": { 137 | "version": "0.27.2", 138 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", 139 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", 140 | "requires": { 141 | "follow-redirects": "^1.14.9", 142 | "form-data": "^4.0.0" 143 | } 144 | }, 145 | "combined-stream": { 146 | "version": "1.0.8", 147 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 148 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 149 | "requires": { 150 | "delayed-stream": "~1.0.0" 151 | } 152 | }, 153 | "delayed-stream": { 154 | "version": "1.0.0", 155 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 156 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 157 | }, 158 | "dotenv": { 159 | "version": "16.0.1", 160 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", 161 | "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==" 162 | }, 163 | "follow-redirects": { 164 | "version": "1.15.0", 165 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz", 166 | "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==" 167 | }, 168 | "form-data": { 169 | "version": "4.0.0", 170 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 171 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 172 | "requires": { 173 | "asynckit": "^0.4.0", 174 | "combined-stream": "^1.0.8", 175 | "mime-types": "^2.1.12" 176 | } 177 | }, 178 | "mime-db": { 179 | "version": "1.52.0", 180 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 181 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 182 | }, 183 | "mime-types": { 184 | "version": "2.1.35", 185 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 186 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 187 | "requires": { 188 | "mime-db": "1.52.0" 189 | } 190 | }, 191 | "ws": { 192 | "version": "8.6.0", 193 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", 194 | "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", 195 | "requires": {} 196 | } 197 | } 198 | } 199 | -------------------------------------------------------------------------------- /binance-launchbot/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "launchbot", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "launchbot", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^1.3.4", 13 | "dotenv": "^16.0.3", 14 | "ws": "^8.12.1" 15 | } 16 | }, 17 | "node_modules/asynckit": { 18 | "version": "0.4.0", 19 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 20 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 21 | }, 22 | "node_modules/axios": { 23 | "version": "1.3.4", 24 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", 25 | "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", 26 | "dependencies": { 27 | "follow-redirects": "^1.15.0", 28 | "form-data": "^4.0.0", 29 | "proxy-from-env": "^1.1.0" 30 | } 31 | }, 32 | "node_modules/combined-stream": { 33 | "version": "1.0.8", 34 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 35 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 36 | "dependencies": { 37 | "delayed-stream": "~1.0.0" 38 | }, 39 | "engines": { 40 | "node": ">= 0.8" 41 | } 42 | }, 43 | "node_modules/delayed-stream": { 44 | "version": "1.0.0", 45 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 46 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 47 | "engines": { 48 | "node": ">=0.4.0" 49 | } 50 | }, 51 | "node_modules/dotenv": { 52 | "version": "16.0.3", 53 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 54 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", 55 | "engines": { 56 | "node": ">=12" 57 | } 58 | }, 59 | "node_modules/follow-redirects": { 60 | "version": "1.15.2", 61 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 62 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 63 | "funding": [ 64 | { 65 | "type": "individual", 66 | "url": "https://github.com/sponsors/RubenVerborgh" 67 | } 68 | ], 69 | "engines": { 70 | "node": ">=4.0" 71 | }, 72 | "peerDependenciesMeta": { 73 | "debug": { 74 | "optional": true 75 | } 76 | } 77 | }, 78 | "node_modules/form-data": { 79 | "version": "4.0.0", 80 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 81 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 82 | "dependencies": { 83 | "asynckit": "^0.4.0", 84 | "combined-stream": "^1.0.8", 85 | "mime-types": "^2.1.12" 86 | }, 87 | "engines": { 88 | "node": ">= 6" 89 | } 90 | }, 91 | "node_modules/mime-db": { 92 | "version": "1.52.0", 93 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 94 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 95 | "engines": { 96 | "node": ">= 0.6" 97 | } 98 | }, 99 | "node_modules/mime-types": { 100 | "version": "2.1.35", 101 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 102 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 103 | "dependencies": { 104 | "mime-db": "1.52.0" 105 | }, 106 | "engines": { 107 | "node": ">= 0.6" 108 | } 109 | }, 110 | "node_modules/proxy-from-env": { 111 | "version": "1.1.0", 112 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 113 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 114 | }, 115 | "node_modules/ws": { 116 | "version": "8.12.1", 117 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", 118 | "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", 119 | "engines": { 120 | "node": ">=10.0.0" 121 | }, 122 | "peerDependencies": { 123 | "bufferutil": "^4.0.1", 124 | "utf-8-validate": ">=5.0.2" 125 | }, 126 | "peerDependenciesMeta": { 127 | "bufferutil": { 128 | "optional": true 129 | }, 130 | "utf-8-validate": { 131 | "optional": true 132 | } 133 | } 134 | } 135 | }, 136 | "dependencies": { 137 | "asynckit": { 138 | "version": "0.4.0", 139 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 140 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 141 | }, 142 | "axios": { 143 | "version": "1.3.4", 144 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", 145 | "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", 146 | "requires": { 147 | "follow-redirects": "^1.15.0", 148 | "form-data": "^4.0.0", 149 | "proxy-from-env": "^1.1.0" 150 | } 151 | }, 152 | "combined-stream": { 153 | "version": "1.0.8", 154 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 155 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 156 | "requires": { 157 | "delayed-stream": "~1.0.0" 158 | } 159 | }, 160 | "delayed-stream": { 161 | "version": "1.0.0", 162 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 163 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 164 | }, 165 | "dotenv": { 166 | "version": "16.0.3", 167 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 168 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" 169 | }, 170 | "follow-redirects": { 171 | "version": "1.15.2", 172 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 173 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" 174 | }, 175 | "form-data": { 176 | "version": "4.0.0", 177 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 178 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 179 | "requires": { 180 | "asynckit": "^0.4.0", 181 | "combined-stream": "^1.0.8", 182 | "mime-types": "^2.1.12" 183 | } 184 | }, 185 | "mime-db": { 186 | "version": "1.52.0", 187 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 188 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 189 | }, 190 | "mime-types": { 191 | "version": "2.1.35", 192 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 193 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 194 | "requires": { 195 | "mime-db": "1.52.0" 196 | } 197 | }, 198 | "proxy-from-env": { 199 | "version": "1.1.0", 200 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 201 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 202 | }, 203 | "ws": { 204 | "version": "8.12.1", 205 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", 206 | "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", 207 | "requires": {} 208 | } 209 | } 210 | } 211 | -------------------------------------------------------------------------------- /binance-spot/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-spot", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "binance-spot", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^1.2.0", 13 | "dotenv": "^16.0.3", 14 | "ws": "^8.11.0" 15 | } 16 | }, 17 | "node_modules/asynckit": { 18 | "version": "0.4.0", 19 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 20 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 21 | }, 22 | "node_modules/axios": { 23 | "version": "1.2.0", 24 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz", 25 | "integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==", 26 | "dependencies": { 27 | "follow-redirects": "^1.15.0", 28 | "form-data": "^4.0.0", 29 | "proxy-from-env": "^1.1.0" 30 | } 31 | }, 32 | "node_modules/combined-stream": { 33 | "version": "1.0.8", 34 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 35 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 36 | "dependencies": { 37 | "delayed-stream": "~1.0.0" 38 | }, 39 | "engines": { 40 | "node": ">= 0.8" 41 | } 42 | }, 43 | "node_modules/delayed-stream": { 44 | "version": "1.0.0", 45 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 46 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 47 | "engines": { 48 | "node": ">=0.4.0" 49 | } 50 | }, 51 | "node_modules/dotenv": { 52 | "version": "16.0.3", 53 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 54 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", 55 | "engines": { 56 | "node": ">=12" 57 | } 58 | }, 59 | "node_modules/follow-redirects": { 60 | "version": "1.15.2", 61 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 62 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 63 | "funding": [ 64 | { 65 | "type": "individual", 66 | "url": "https://github.com/sponsors/RubenVerborgh" 67 | } 68 | ], 69 | "engines": { 70 | "node": ">=4.0" 71 | }, 72 | "peerDependenciesMeta": { 73 | "debug": { 74 | "optional": true 75 | } 76 | } 77 | }, 78 | "node_modules/form-data": { 79 | "version": "4.0.0", 80 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 81 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 82 | "dependencies": { 83 | "asynckit": "^0.4.0", 84 | "combined-stream": "^1.0.8", 85 | "mime-types": "^2.1.12" 86 | }, 87 | "engines": { 88 | "node": ">= 6" 89 | } 90 | }, 91 | "node_modules/mime-db": { 92 | "version": "1.52.0", 93 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 94 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 95 | "engines": { 96 | "node": ">= 0.6" 97 | } 98 | }, 99 | "node_modules/mime-types": { 100 | "version": "2.1.35", 101 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 102 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 103 | "dependencies": { 104 | "mime-db": "1.52.0" 105 | }, 106 | "engines": { 107 | "node": ">= 0.6" 108 | } 109 | }, 110 | "node_modules/proxy-from-env": { 111 | "version": "1.1.0", 112 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 113 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 114 | }, 115 | "node_modules/ws": { 116 | "version": "8.11.0", 117 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", 118 | "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", 119 | "engines": { 120 | "node": ">=10.0.0" 121 | }, 122 | "peerDependencies": { 123 | "bufferutil": "^4.0.1", 124 | "utf-8-validate": "^5.0.2" 125 | }, 126 | "peerDependenciesMeta": { 127 | "bufferutil": { 128 | "optional": true 129 | }, 130 | "utf-8-validate": { 131 | "optional": true 132 | } 133 | } 134 | } 135 | }, 136 | "dependencies": { 137 | "asynckit": { 138 | "version": "0.4.0", 139 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 140 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 141 | }, 142 | "axios": { 143 | "version": "1.2.0", 144 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz", 145 | "integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==", 146 | "requires": { 147 | "follow-redirects": "^1.15.0", 148 | "form-data": "^4.0.0", 149 | "proxy-from-env": "^1.1.0" 150 | } 151 | }, 152 | "combined-stream": { 153 | "version": "1.0.8", 154 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 155 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 156 | "requires": { 157 | "delayed-stream": "~1.0.0" 158 | } 159 | }, 160 | "delayed-stream": { 161 | "version": "1.0.0", 162 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 163 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 164 | }, 165 | "dotenv": { 166 | "version": "16.0.3", 167 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 168 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" 169 | }, 170 | "follow-redirects": { 171 | "version": "1.15.2", 172 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 173 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" 174 | }, 175 | "form-data": { 176 | "version": "4.0.0", 177 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 178 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 179 | "requires": { 180 | "asynckit": "^0.4.0", 181 | "combined-stream": "^1.0.8", 182 | "mime-types": "^2.1.12" 183 | } 184 | }, 185 | "mime-db": { 186 | "version": "1.52.0", 187 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 188 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 189 | }, 190 | "mime-types": { 191 | "version": "2.1.35", 192 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 193 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 194 | "requires": { 195 | "mime-db": "1.52.0" 196 | } 197 | }, 198 | "proxy-from-env": { 199 | "version": "1.1.0", 200 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 201 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 202 | }, 203 | "ws": { 204 | "version": "8.11.0", 205 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", 206 | "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", 207 | "requires": {} 208 | } 209 | } 210 | } 211 | -------------------------------------------------------------------------------- /binance-telegram/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-telegram", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "binance-telegram", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^1.4.0", 13 | "dotenv": "^16.0.3", 14 | "telegraf": "^4.12.2" 15 | } 16 | }, 17 | "node_modules/abort-controller": { 18 | "version": "3.0.0", 19 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 20 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 21 | "dependencies": { 22 | "event-target-shim": "^5.0.0" 23 | }, 24 | "engines": { 25 | "node": ">=6.5" 26 | } 27 | }, 28 | "node_modules/asynckit": { 29 | "version": "0.4.0", 30 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 31 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 32 | }, 33 | "node_modules/axios": { 34 | "version": "1.4.0", 35 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", 36 | "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", 37 | "dependencies": { 38 | "follow-redirects": "^1.15.0", 39 | "form-data": "^4.0.0", 40 | "proxy-from-env": "^1.1.0" 41 | } 42 | }, 43 | "node_modules/buffer-alloc": { 44 | "version": "1.2.0", 45 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 46 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 47 | "dependencies": { 48 | "buffer-alloc-unsafe": "^1.1.0", 49 | "buffer-fill": "^1.0.0" 50 | } 51 | }, 52 | "node_modules/buffer-alloc-unsafe": { 53 | "version": "1.1.0", 54 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 55 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" 56 | }, 57 | "node_modules/buffer-fill": { 58 | "version": "1.0.0", 59 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 60 | "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" 61 | }, 62 | "node_modules/combined-stream": { 63 | "version": "1.0.8", 64 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 65 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 66 | "dependencies": { 67 | "delayed-stream": "~1.0.0" 68 | }, 69 | "engines": { 70 | "node": ">= 0.8" 71 | } 72 | }, 73 | "node_modules/debug": { 74 | "version": "4.3.4", 75 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 76 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 77 | "dependencies": { 78 | "ms": "2.1.2" 79 | }, 80 | "engines": { 81 | "node": ">=6.0" 82 | }, 83 | "peerDependenciesMeta": { 84 | "supports-color": { 85 | "optional": true 86 | } 87 | } 88 | }, 89 | "node_modules/delayed-stream": { 90 | "version": "1.0.0", 91 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 92 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 93 | "engines": { 94 | "node": ">=0.4.0" 95 | } 96 | }, 97 | "node_modules/dotenv": { 98 | "version": "16.0.3", 99 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 100 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", 101 | "engines": { 102 | "node": ">=12" 103 | } 104 | }, 105 | "node_modules/event-target-shim": { 106 | "version": "5.0.1", 107 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 108 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 109 | "engines": { 110 | "node": ">=6" 111 | } 112 | }, 113 | "node_modules/follow-redirects": { 114 | "version": "1.15.2", 115 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 116 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 117 | "funding": [ 118 | { 119 | "type": "individual", 120 | "url": "https://github.com/sponsors/RubenVerborgh" 121 | } 122 | ], 123 | "engines": { 124 | "node": ">=4.0" 125 | }, 126 | "peerDependenciesMeta": { 127 | "debug": { 128 | "optional": true 129 | } 130 | } 131 | }, 132 | "node_modules/form-data": { 133 | "version": "4.0.0", 134 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 135 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 136 | "dependencies": { 137 | "asynckit": "^0.4.0", 138 | "combined-stream": "^1.0.8", 139 | "mime-types": "^2.1.12" 140 | }, 141 | "engines": { 142 | "node": ">= 6" 143 | } 144 | }, 145 | "node_modules/mime-db": { 146 | "version": "1.52.0", 147 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 148 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 149 | "engines": { 150 | "node": ">= 0.6" 151 | } 152 | }, 153 | "node_modules/mime-types": { 154 | "version": "2.1.35", 155 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 156 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 157 | "dependencies": { 158 | "mime-db": "1.52.0" 159 | }, 160 | "engines": { 161 | "node": ">= 0.6" 162 | } 163 | }, 164 | "node_modules/mri": { 165 | "version": "1.2.0", 166 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 167 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 168 | "engines": { 169 | "node": ">=4" 170 | } 171 | }, 172 | "node_modules/ms": { 173 | "version": "2.1.2", 174 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 175 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 176 | }, 177 | "node_modules/node-fetch": { 178 | "version": "2.6.11", 179 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", 180 | "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", 181 | "dependencies": { 182 | "whatwg-url": "^5.0.0" 183 | }, 184 | "engines": { 185 | "node": "4.x || >=6.0.0" 186 | }, 187 | "peerDependencies": { 188 | "encoding": "^0.1.0" 189 | }, 190 | "peerDependenciesMeta": { 191 | "encoding": { 192 | "optional": true 193 | } 194 | } 195 | }, 196 | "node_modules/p-timeout": { 197 | "version": "4.1.0", 198 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz", 199 | "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==", 200 | "engines": { 201 | "node": ">=10" 202 | } 203 | }, 204 | "node_modules/proxy-from-env": { 205 | "version": "1.1.0", 206 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 207 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 208 | }, 209 | "node_modules/safe-compare": { 210 | "version": "1.1.4", 211 | "resolved": "https://registry.npmjs.org/safe-compare/-/safe-compare-1.1.4.tgz", 212 | "integrity": "sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ==", 213 | "dependencies": { 214 | "buffer-alloc": "^1.2.0" 215 | } 216 | }, 217 | "node_modules/sandwich-stream": { 218 | "version": "2.0.2", 219 | "resolved": "https://registry.npmjs.org/sandwich-stream/-/sandwich-stream-2.0.2.tgz", 220 | "integrity": "sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ==", 221 | "engines": { 222 | "node": ">= 0.10" 223 | } 224 | }, 225 | "node_modules/telegraf": { 226 | "version": "4.12.2", 227 | "resolved": "https://registry.npmjs.org/telegraf/-/telegraf-4.12.2.tgz", 228 | "integrity": "sha512-PgwqI4wD86cMqVfFtEM9JkGGnMHgvgLJbReZMmwW4z35QeOi4DvbdItONld4bPnYn3A1jcO0SRKs0BXmR+x+Ew==", 229 | "dependencies": { 230 | "abort-controller": "^3.0.0", 231 | "debug": "^4.3.4", 232 | "mri": "^1.2.0", 233 | "node-fetch": "^2.6.8", 234 | "p-timeout": "^4.1.0", 235 | "safe-compare": "^1.1.4", 236 | "sandwich-stream": "^2.0.2", 237 | "typegram": "^4.3.0" 238 | }, 239 | "bin": { 240 | "telegraf": "lib/cli.mjs" 241 | }, 242 | "engines": { 243 | "node": "^12.20.0 || >=14.13.1" 244 | } 245 | }, 246 | "node_modules/tr46": { 247 | "version": "0.0.3", 248 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 249 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 250 | }, 251 | "node_modules/typegram": { 252 | "version": "4.3.0", 253 | "resolved": "https://registry.npmjs.org/typegram/-/typegram-4.3.0.tgz", 254 | "integrity": "sha512-pS4STyOZoJ++Mwa9GPMTNjOwEzMkxFfFt1By6IbMOJfheP0utMP/H1ga6J9R4DTjAYBr0UDn4eQg++LpWBvcAg==" 255 | }, 256 | "node_modules/webidl-conversions": { 257 | "version": "3.0.1", 258 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 259 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 260 | }, 261 | "node_modules/whatwg-url": { 262 | "version": "5.0.0", 263 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 264 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 265 | "dependencies": { 266 | "tr46": "~0.0.3", 267 | "webidl-conversions": "^3.0.0" 268 | } 269 | } 270 | } 271 | } 272 | -------------------------------------------------------------------------------- /bitypreco-arbitrage/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bitypreco-arbitrage", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "bitypreco-arbitrage", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^1.5.1", 13 | "dotenv": "^16.3.1", 14 | "phoenix-channels": "^1.0.0" 15 | } 16 | }, 17 | "node_modules/asynckit": { 18 | "version": "0.4.0", 19 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 20 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 21 | }, 22 | "node_modules/axios": { 23 | "version": "1.5.1", 24 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", 25 | "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", 26 | "dependencies": { 27 | "follow-redirects": "^1.15.0", 28 | "form-data": "^4.0.0", 29 | "proxy-from-env": "^1.1.0" 30 | } 31 | }, 32 | "node_modules/bufferutil": { 33 | "version": "4.0.7", 34 | "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", 35 | "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", 36 | "hasInstallScript": true, 37 | "dependencies": { 38 | "node-gyp-build": "^4.3.0" 39 | }, 40 | "engines": { 41 | "node": ">=6.14.2" 42 | } 43 | }, 44 | "node_modules/combined-stream": { 45 | "version": "1.0.8", 46 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 47 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 48 | "dependencies": { 49 | "delayed-stream": "~1.0.0" 50 | }, 51 | "engines": { 52 | "node": ">= 0.8" 53 | } 54 | }, 55 | "node_modules/d": { 56 | "version": "1.0.1", 57 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", 58 | "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", 59 | "dependencies": { 60 | "es5-ext": "^0.10.50", 61 | "type": "^1.0.1" 62 | } 63 | }, 64 | "node_modules/debug": { 65 | "version": "2.6.9", 66 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 67 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 68 | "dependencies": { 69 | "ms": "2.0.0" 70 | } 71 | }, 72 | "node_modules/delayed-stream": { 73 | "version": "1.0.0", 74 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 75 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 76 | "engines": { 77 | "node": ">=0.4.0" 78 | } 79 | }, 80 | "node_modules/dotenv": { 81 | "version": "16.3.1", 82 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", 83 | "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", 84 | "engines": { 85 | "node": ">=12" 86 | }, 87 | "funding": { 88 | "url": "https://github.com/motdotla/dotenv?sponsor=1" 89 | } 90 | }, 91 | "node_modules/es5-ext": { 92 | "version": "0.10.62", 93 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", 94 | "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", 95 | "hasInstallScript": true, 96 | "dependencies": { 97 | "es6-iterator": "^2.0.3", 98 | "es6-symbol": "^3.1.3", 99 | "next-tick": "^1.1.0" 100 | }, 101 | "engines": { 102 | "node": ">=0.10" 103 | } 104 | }, 105 | "node_modules/es6-iterator": { 106 | "version": "2.0.3", 107 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", 108 | "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", 109 | "dependencies": { 110 | "d": "1", 111 | "es5-ext": "^0.10.35", 112 | "es6-symbol": "^3.1.1" 113 | } 114 | }, 115 | "node_modules/es6-symbol": { 116 | "version": "3.1.3", 117 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", 118 | "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", 119 | "dependencies": { 120 | "d": "^1.0.1", 121 | "ext": "^1.1.2" 122 | } 123 | }, 124 | "node_modules/ext": { 125 | "version": "1.7.0", 126 | "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", 127 | "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", 128 | "dependencies": { 129 | "type": "^2.7.2" 130 | } 131 | }, 132 | "node_modules/ext/node_modules/type": { 133 | "version": "2.7.2", 134 | "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", 135 | "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" 136 | }, 137 | "node_modules/follow-redirects": { 138 | "version": "1.15.3", 139 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", 140 | "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", 141 | "funding": [ 142 | { 143 | "type": "individual", 144 | "url": "https://github.com/sponsors/RubenVerborgh" 145 | } 146 | ], 147 | "engines": { 148 | "node": ">=4.0" 149 | }, 150 | "peerDependenciesMeta": { 151 | "debug": { 152 | "optional": true 153 | } 154 | } 155 | }, 156 | "node_modules/form-data": { 157 | "version": "4.0.0", 158 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 159 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 160 | "dependencies": { 161 | "asynckit": "^0.4.0", 162 | "combined-stream": "^1.0.8", 163 | "mime-types": "^2.1.12" 164 | }, 165 | "engines": { 166 | "node": ">= 6" 167 | } 168 | }, 169 | "node_modules/is-typedarray": { 170 | "version": "1.0.0", 171 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 172 | "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" 173 | }, 174 | "node_modules/mime-db": { 175 | "version": "1.52.0", 176 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 177 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 178 | "engines": { 179 | "node": ">= 0.6" 180 | } 181 | }, 182 | "node_modules/mime-types": { 183 | "version": "2.1.35", 184 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 185 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 186 | "dependencies": { 187 | "mime-db": "1.52.0" 188 | }, 189 | "engines": { 190 | "node": ">= 0.6" 191 | } 192 | }, 193 | "node_modules/ms": { 194 | "version": "2.0.0", 195 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 196 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 197 | }, 198 | "node_modules/next-tick": { 199 | "version": "1.1.0", 200 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", 201 | "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" 202 | }, 203 | "node_modules/node-gyp-build": { 204 | "version": "4.6.1", 205 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", 206 | "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", 207 | "bin": { 208 | "node-gyp-build": "bin.js", 209 | "node-gyp-build-optional": "optional.js", 210 | "node-gyp-build-test": "build-test.js" 211 | } 212 | }, 213 | "node_modules/phoenix-channels": { 214 | "version": "1.0.0", 215 | "resolved": "https://registry.npmjs.org/phoenix-channels/-/phoenix-channels-1.0.0.tgz", 216 | "integrity": "sha512-NVanumwkjzxUptGKBAMQ1W9njWrJom61rNpcTvSho9Hs441Lv8AJElXdkbycX9fFccc6OJViVLhDL0L5U/HqMg==", 217 | "dependencies": { 218 | "websocket": "^1.0.24" 219 | } 220 | }, 221 | "node_modules/proxy-from-env": { 222 | "version": "1.1.0", 223 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 224 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 225 | }, 226 | "node_modules/type": { 227 | "version": "1.2.0", 228 | "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", 229 | "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" 230 | }, 231 | "node_modules/typedarray-to-buffer": { 232 | "version": "3.1.5", 233 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 234 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 235 | "dependencies": { 236 | "is-typedarray": "^1.0.0" 237 | } 238 | }, 239 | "node_modules/utf-8-validate": { 240 | "version": "5.0.10", 241 | "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", 242 | "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", 243 | "hasInstallScript": true, 244 | "dependencies": { 245 | "node-gyp-build": "^4.3.0" 246 | }, 247 | "engines": { 248 | "node": ">=6.14.2" 249 | } 250 | }, 251 | "node_modules/websocket": { 252 | "version": "1.0.34", 253 | "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", 254 | "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", 255 | "dependencies": { 256 | "bufferutil": "^4.0.1", 257 | "debug": "^2.2.0", 258 | "es5-ext": "^0.10.50", 259 | "typedarray-to-buffer": "^3.1.5", 260 | "utf-8-validate": "^5.0.2", 261 | "yaeti": "^0.0.6" 262 | }, 263 | "engines": { 264 | "node": ">=4.0.0" 265 | } 266 | }, 267 | "node_modules/yaeti": { 268 | "version": "0.0.6", 269 | "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", 270 | "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", 271 | "engines": { 272 | "node": ">=0.10.32" 273 | } 274 | } 275 | } 276 | } 277 | -------------------------------------------------------------------------------- /binance-calculator/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "binance-calculator", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "binance-calculator", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^1.8.2", 13 | "dotenv": "^16.4.7" 14 | } 15 | }, 16 | "node_modules/asynckit": { 17 | "version": "0.4.0", 18 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 19 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 20 | "license": "MIT" 21 | }, 22 | "node_modules/axios": { 23 | "version": "1.8.2", 24 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", 25 | "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", 26 | "license": "MIT", 27 | "dependencies": { 28 | "follow-redirects": "^1.15.6", 29 | "form-data": "^4.0.0", 30 | "proxy-from-env": "^1.1.0" 31 | } 32 | }, 33 | "node_modules/call-bind-apply-helpers": { 34 | "version": "1.0.2", 35 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 36 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 37 | "license": "MIT", 38 | "dependencies": { 39 | "es-errors": "^1.3.0", 40 | "function-bind": "^1.1.2" 41 | }, 42 | "engines": { 43 | "node": ">= 0.4" 44 | } 45 | }, 46 | "node_modules/combined-stream": { 47 | "version": "1.0.8", 48 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 49 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 50 | "license": "MIT", 51 | "dependencies": { 52 | "delayed-stream": "~1.0.0" 53 | }, 54 | "engines": { 55 | "node": ">= 0.8" 56 | } 57 | }, 58 | "node_modules/delayed-stream": { 59 | "version": "1.0.0", 60 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 61 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 62 | "license": "MIT", 63 | "engines": { 64 | "node": ">=0.4.0" 65 | } 66 | }, 67 | "node_modules/dotenv": { 68 | "version": "16.4.7", 69 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", 70 | "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", 71 | "license": "BSD-2-Clause", 72 | "engines": { 73 | "node": ">=12" 74 | }, 75 | "funding": { 76 | "url": "https://dotenvx.com" 77 | } 78 | }, 79 | "node_modules/dunder-proto": { 80 | "version": "1.0.1", 81 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 82 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 83 | "license": "MIT", 84 | "dependencies": { 85 | "call-bind-apply-helpers": "^1.0.1", 86 | "es-errors": "^1.3.0", 87 | "gopd": "^1.2.0" 88 | }, 89 | "engines": { 90 | "node": ">= 0.4" 91 | } 92 | }, 93 | "node_modules/es-define-property": { 94 | "version": "1.0.1", 95 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 96 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 97 | "license": "MIT", 98 | "engines": { 99 | "node": ">= 0.4" 100 | } 101 | }, 102 | "node_modules/es-errors": { 103 | "version": "1.3.0", 104 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 105 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 106 | "license": "MIT", 107 | "engines": { 108 | "node": ">= 0.4" 109 | } 110 | }, 111 | "node_modules/es-object-atoms": { 112 | "version": "1.1.1", 113 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 114 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 115 | "license": "MIT", 116 | "dependencies": { 117 | "es-errors": "^1.3.0" 118 | }, 119 | "engines": { 120 | "node": ">= 0.4" 121 | } 122 | }, 123 | "node_modules/es-set-tostringtag": { 124 | "version": "2.1.0", 125 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", 126 | "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 127 | "license": "MIT", 128 | "dependencies": { 129 | "es-errors": "^1.3.0", 130 | "get-intrinsic": "^1.2.6", 131 | "has-tostringtag": "^1.0.2", 132 | "hasown": "^2.0.2" 133 | }, 134 | "engines": { 135 | "node": ">= 0.4" 136 | } 137 | }, 138 | "node_modules/follow-redirects": { 139 | "version": "1.15.9", 140 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", 141 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", 142 | "funding": [ 143 | { 144 | "type": "individual", 145 | "url": "https://github.com/sponsors/RubenVerborgh" 146 | } 147 | ], 148 | "license": "MIT", 149 | "engines": { 150 | "node": ">=4.0" 151 | }, 152 | "peerDependenciesMeta": { 153 | "debug": { 154 | "optional": true 155 | } 156 | } 157 | }, 158 | "node_modules/form-data": { 159 | "version": "4.0.2", 160 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", 161 | "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", 162 | "license": "MIT", 163 | "dependencies": { 164 | "asynckit": "^0.4.0", 165 | "combined-stream": "^1.0.8", 166 | "es-set-tostringtag": "^2.1.0", 167 | "mime-types": "^2.1.12" 168 | }, 169 | "engines": { 170 | "node": ">= 6" 171 | } 172 | }, 173 | "node_modules/function-bind": { 174 | "version": "1.1.2", 175 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 176 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 177 | "license": "MIT", 178 | "funding": { 179 | "url": "https://github.com/sponsors/ljharb" 180 | } 181 | }, 182 | "node_modules/get-intrinsic": { 183 | "version": "1.3.0", 184 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 185 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 186 | "license": "MIT", 187 | "dependencies": { 188 | "call-bind-apply-helpers": "^1.0.2", 189 | "es-define-property": "^1.0.1", 190 | "es-errors": "^1.3.0", 191 | "es-object-atoms": "^1.1.1", 192 | "function-bind": "^1.1.2", 193 | "get-proto": "^1.0.1", 194 | "gopd": "^1.2.0", 195 | "has-symbols": "^1.1.0", 196 | "hasown": "^2.0.2", 197 | "math-intrinsics": "^1.1.0" 198 | }, 199 | "engines": { 200 | "node": ">= 0.4" 201 | }, 202 | "funding": { 203 | "url": "https://github.com/sponsors/ljharb" 204 | } 205 | }, 206 | "node_modules/get-proto": { 207 | "version": "1.0.1", 208 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 209 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 210 | "license": "MIT", 211 | "dependencies": { 212 | "dunder-proto": "^1.0.1", 213 | "es-object-atoms": "^1.0.0" 214 | }, 215 | "engines": { 216 | "node": ">= 0.4" 217 | } 218 | }, 219 | "node_modules/gopd": { 220 | "version": "1.2.0", 221 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 222 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 223 | "license": "MIT", 224 | "engines": { 225 | "node": ">= 0.4" 226 | }, 227 | "funding": { 228 | "url": "https://github.com/sponsors/ljharb" 229 | } 230 | }, 231 | "node_modules/has-symbols": { 232 | "version": "1.1.0", 233 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 234 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 235 | "license": "MIT", 236 | "engines": { 237 | "node": ">= 0.4" 238 | }, 239 | "funding": { 240 | "url": "https://github.com/sponsors/ljharb" 241 | } 242 | }, 243 | "node_modules/has-tostringtag": { 244 | "version": "1.0.2", 245 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 246 | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 247 | "license": "MIT", 248 | "dependencies": { 249 | "has-symbols": "^1.0.3" 250 | }, 251 | "engines": { 252 | "node": ">= 0.4" 253 | }, 254 | "funding": { 255 | "url": "https://github.com/sponsors/ljharb" 256 | } 257 | }, 258 | "node_modules/hasown": { 259 | "version": "2.0.2", 260 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 261 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 262 | "license": "MIT", 263 | "dependencies": { 264 | "function-bind": "^1.1.2" 265 | }, 266 | "engines": { 267 | "node": ">= 0.4" 268 | } 269 | }, 270 | "node_modules/math-intrinsics": { 271 | "version": "1.1.0", 272 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 273 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 274 | "license": "MIT", 275 | "engines": { 276 | "node": ">= 0.4" 277 | } 278 | }, 279 | "node_modules/mime-db": { 280 | "version": "1.52.0", 281 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 282 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 283 | "license": "MIT", 284 | "engines": { 285 | "node": ">= 0.6" 286 | } 287 | }, 288 | "node_modules/mime-types": { 289 | "version": "2.1.35", 290 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 291 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 292 | "license": "MIT", 293 | "dependencies": { 294 | "mime-db": "1.52.0" 295 | }, 296 | "engines": { 297 | "node": ">= 0.6" 298 | } 299 | }, 300 | "node_modules/proxy-from-env": { 301 | "version": "1.1.0", 302 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 303 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 304 | "license": "MIT" 305 | } 306 | } 307 | } 308 | --------------------------------------------------------------------------------