Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'use strict';
- module.exports = function(){
- var config = require('./config.json');
- var dConf = require('./dConf.json');
- var library = require ('./library.js');
- var nodemailer = require('nodemailer');
- var jsonfile = require('jsonfile');
- var request = require('request');
- var fs = require('fs');
- var logStr = "";
- var JsonDB = require('node-json-db');
- var db = new JsonDB("db", true, false);
- var lastInit = config.lastInit = dConf.lastInit || Date.now();
- var meta = {
- initTime: Date.now(),
- withdrawBalance: 0,
- balance: {},
- currencies: [],
- orders: {},
- recordTradeHistory : [],
- withdraw: {
- addresses: [],
- }
- };
- var metaClone = JSON.parse(JSON.stringify(meta));
- var configClone = JSON.parse(JSON.stringify(config));
- if(checkPercentage()){
- run();
- } else{
- throw new Error('Percentage is not valid!');
- }
- function run() {
- meta = metaClone;
- metaClone = JSON.parse(JSON.stringify(meta));
- config = configClone;
- configClone = JSON.parse(JSON.stringify(config));
- config.lastInit = Date.now();
- dConf.lastInit = config.lastInit;
- jsonfile.writeFileSync("./dConf.json", dConf);
- getBalance().then((balances) => {
- let exchangeCurrs = Object.keys(balances);
- console.log('balances:', balances);
- meta.initBalance = balances;
- if(exchangeCurrs.length === 1 && exchangeCurrs[0] == 'BTC') {
- console.log(`Step 1. No Currency To Exchange. Let\'s Withdraw ${meta.balance.BTC} BTC`);
- waitingForCompletion().then(()=>{
- withdrawForAll().then(onSuccess, onError);
- });
- } else {
- meta.currencies = exchangeCurrs.filter((currency) => {
- if(currency != 'BTC'){
- return currency;
- }
- });
- placeOrders().then(()=>{
- console.log('Orders was placed!');
- waitingForCompletion().then(()=>{
- console.log('Orders resolved!');
- withdrawForAll().then(()=>{
- console.log('Withdrawed!');
- onSuccess()
- }, onError);
- }, onError);
- }, onError);
- }
- function onSuccess(){
- recordHistory().then(()=>{
- writeLog();
- getUsdRate().then(function(rate){
- sendEmail(rate);
- }, sendEmail)
- }, onError);
- }
- });
- }
- /**
- * Get balances
- * @return {object} promise
- */
- function getBalance() {
- return new Promise((resolve, reject)=> {
- let balanceParams = {
- query: `command=returnAvailableAccountBalances&nonce=${Date.now()}`
- };
- library.postReq(balanceParams, (balances) => {
- console.log('balances.exchange', balances, balances.exchange['BTC']);
- if(balances.exchange) {
- meta.balance = balances.exchange;
- meta.balance['BTC'] = parseFloat(meta.balance['BTC']) > 0.05 ? parseFloat(meta.balance['BTC']) - 0.001 : 0
- console.log(`Step 1. (6) Current Balance: ${JSON.stringify(meta.balance)}`);
- resolve(meta.balance);
- } else {
- reject('Step 1. (6) Nothing to exchange');
- }
- });
- })
- }
- /**
- * Place orders
- * @return {object} Promise
- */
- function placeOrders() {
- return new Promise((resolve, reject)=> {
- iterator(meta.currencies[0], meta.currencies, newOrder, resolve);
- function newOrder(currency){
- var currencyPair = `BTC_${currency}`;
- var orderBookParams = {
- query: `https://poloniex.com/public?command=returnOrderBook¤cyPair=${currencyPair}&depth=1`
- }
- return new Promise(function(resolve, reject){
- library.getReqt(orderBookParams, (res) => {
- if(res.error){ reject(res.error) }
- var order = {
- currencyPair: currencyPair,
- rate: res.bids[0][0],
- bid: res.bids
- };
- var sellParams = {
- currencyPair,
- rate: order.bid[0][0],
- amount: meta.balance[currency]
- }
- sellParams.query = `command=sell¤cyPair=${sellParams.currencyPair}&rate=${sellParams.rate}&amount=${sellParams.amount}&nonce=${Date.now()}`;
- library.postReq(sellParams, (res) => {
- if (res.orderNumber) {
- console.log(`Step 2. Order № ${res.orderNumber} Placed For ${sellParams.currencyPair}. Rate: ${sellParams.rate}; Amount: ${sellParams.amount}`);
- meta.orders[currency.toUpperCase()] = order;
- } else {
- console.log(res);
- }
- resolve();
- });
- });
- });
- }
- })
- }
- /**
- * Waiting for the completion of all orders
- * @return {object} promise
- */
- function waitingForCompletion(){
- return new Promise((resolve, reject)=> {
- var intervalID = setInterval(function(){
- library.postReq({query: `command=returnOpenOrders¤cyPair=all&nonce=${Date.now()}`}, (res) => {
- if(!res.error) {
- var orders = [];
- for(let key in res){
- orders = orders.concat(res[key]);
- }
- console.log('Orders opened:', orders.length);
- console.log(orders);
- if(!orders.length){
- clearInterval(intervalID);
- resolve();
- }
- } else{
- if(res.error){
- console.log(res.error);
- } else{
- console.log('Not closed yet..', res.length);
- }
- }
- });
- }, 5000);
- });
- }
- /**
- * Get trade history from poloniex
- * @return {object} promise
- */
- function recordHistory() {
- return new Promise((resolve, reject)=> {
- var params = {
- query: `command=returnTradeHistory¤cyPair=all&start=${meta.initTime / 1000}&end=${Date.now()/1000}&nonce=${Date.now()}`
- }
- library.postReq(params,(res) => {
- if(!res.error){
- for(let key in res){
- for(let order of res[key]){
- console.log(`Order ${key}, Rate: ${order.rate}, Amount: ${order.amount}, Fee: ${order.fee}, Total: ${order.total} BTC`);
- }
- }
- }
- meta.recordTradeHistory.push(res);
- resolve();
- });
- });
- }
- /**
- * Withdraw all BTC to users accounts
- * @return {[type]} [description]
- */
- function withdrawForAll(){
- return new Promise(function(resolve, reject){
- var addrs = Object.keys(config.withdrawRatio);
- getUsdRate().then(function(btcRate){
- var hours = (Date.now() - lastInit) / (1000 * 60 * 60);
- var btcRate = btcRate || 600;
- var powerCosts = config.kWtHourUsdRate * config.kWHour * config.cardsCount * hours;
- var powerCostsBTC = parseFloat((powerCosts / btcRate).toFixed(8));
- getBalance().then(function(){
- var powerAccount;
- addrs.forEach(function(addr){
- if(config.withdrawRatio[addr].isPower){
- powerAccount = config.withdrawRatio[addr];
- }
- });
- if(powerAccount){
- addrs.forEach(function(addr){
- if(config.withdrawRatio[addr].isJesus){
- powerAccount.percents = 1 / meta.balance['BTC'] * powerCostsBTC * config.withdrawRatio[addr].percents;
- config.withdrawRatio[addr].percents -= powerAccount.percents;
- }
- });
- }
- iterator(addrs[0], addrs, withdraw, resolve);
- function withdraw(addr){
- return new Promise(function(resolve, reject){
- var amount = parseFloat(meta.balance['BTC']) * parseFloat(config.withdrawRatio[addr].percents);
- var params = {query: `command=withdraw¤cy=BTC&amount=${amount}&address=${addr}&nonce=${Date.now()}`}
- var withdrawStr = `Withdraw ${amount} BTC to ${addr}. (${parseFloat(config.withdrawRatio[addr].percents) * 100}% from ${meta.balance['BTC']} BTC)`
- library.postReq(params,(res) => {
- meta.withdrawBalance += amount;
- meta.withdraw.addresses.push({
- address: addr,
- amount: amount,
- percents: config.withdrawRatio[addr].percents,
- label: config.withdrawRatio[addr].label,
- success: res.response
- });
- resolve();
- });
- });
- }
- });
- });
- });
- }
- /**
- * Write meta object to log file
- * @return {object} promise
- */
- function writeLog() {
- return new Promise((resolve, reject)=> {
- console.log('Step 5. (8) Recording Log File');
- fs.access(config.logFile, fs.constants.R_OK | fs.constants.W_OK, (err) => {
- if (err) {
- fs.writeFile(config.logFile, `${JSON.stringify(meta)}\n`, 'utf-8', (err) => {
- if (!err) {
- resolve();
- } else {
- reject(err);
- }
- });
- } else {
- fs.appendFile(config.logFile, `${JSON.stringify(meta)}\n`, 'utf-8', (err) => {
- if (!err) {
- resolve();
- } else {
- reject(err);
- }
- });
- }
- });
- })
- }
- /**
- * Do "Step to step" requests
- * @param {any} fnAsync param
- * @param {array} Array of params
- * @param {function} Async function what return a promise
- * @param {function} Global promise resolver
- * @return {undefined}
- */
- function iterator(item, arr, fnAsync, resolve){
- setTimeout(function(){
- arr.shift();
- fnAsync(item).then(function(){
- if(arr[0]){
- iterator(arr[0], arr, fnAsync, resolve)
- } else{
- resolve();
- }
- }, onError);
- }, 500)
- }
- /**
- * Send meta object via E-mail
- * @return {undefined}
- */
- function sendEmail(btcRate, err){
- var transporter = nodemailer.createTransport('smtps://axbt.bots:ungdrXW9A@smtp.gmail.com');
- var data = Object.assign({}, meta);
- var totalExpected = 0;
- var hours = (Date.now() - lastInit) / (1000 * 60 * 60);
- var btcRate = btcRate || 600;
- var powerCosts = config.kWtHourUsdRate * config.kWHour * config.cardsCount * hours;
- var powerCostsBTC = parseFloat((powerCosts / btcRate).toFixed(8));
- var remainingTime = getRemainingTime(lastInit, Date.now());
- var withdrawBalance = parseFloat(meta.withdrawBalance.toFixed(8));
- var withdrawBalanceUsd = parseFloat((meta.withdrawBalance * btcRate).toFixed(2));
- var powerCostsUSD = parseFloat(powerCosts.toFixed(2));
- var deviceProfit = parseFloat((withdrawBalanceUsd / config.cardsCount).toFixed(2));
- db.push("/sessions[]", {data, hours, btcRate, powerCosts, powerCostsBTC, remainingTime, withdrawBalance, withdrawBalanceUsd, powerCostsUSD, deviceProfit, config}, true);
- var body = `
- ${err ? "ERROR: " + err : ""}
- <div style="font-size: 14px; max-width: 600px;">
- All mined coins for <b>${remainingTime.days}d. ${remainingTime.hours}h.</b> was converted to <b>${withdrawBalance} BTC (${withdrawBalanceUsd} USD)</b> and withdrawed to several accounts by static shares.
- Static number of devices is <b>${config.cardsCount}</b>, average consumption of power is <b>${config.kWHour} kW/h</b> for one device. Consumption (the power) of all devices for the last period is <b>$${powerCostsUSD} (${powerCostsBTC} BTC)</b>.
- Current profitability of one device for ${remainingTime.days}d. ${remainingTime.hours}h. is <b>${deviceProfit}$</b> without power costs and <b>${((withdrawBalanceUsd - powerCostsUSD) / config.cardsCount).toFixed(2)}$</b> with power costs.
- Current BTC/USD rate from Poloniex is <b>$${btcRate}</b>.
- </div>
- `;
- body += `
- <div style="margin: 20px 0;">${makeOrdersTable()}</div>
- `;
- makeWithdrawsTable();
- var mailOptions = {
- from: `"POLONIEX trader (JESUS)" <AXBT.bots@gmail.com>`,
- to: 'legko777@fastmail.fm, legkodymov.lev@gmail.com, toxa@a-xbt.com, 89094568777@mail.ru',
- subject: `Paid $${withdrawBalanceUsd} / ${withdrawBalance} BTC`,
- html: body
- };
- transporter.sendMail(mailOptions, function(error, info){
- console.log('Message sent: ' + (error || info.response));
- });
- function makeOrdersTable(){
- var trigger = 1;
- var table = "";
- table += `
- <h2>Exchange coins to BTC</h2>
- <table>
- <tr>
- <td style="padding: 10px; text-align: center"><b>Coin</b></td>
- <td style="padding: 10px; text-align: center"><b>Amount</b></td>
- <td style="padding: 10px; text-align: center"><b>Rate (BTC)</b></td>
- <td style="padding: 10px; text-align: center"><b>Exchanged (BTC)</b></td>
- <td style="padding: 10px; text-align: center"><b>Exchanged (USD)</b></td>
- </tr>
- `;
- for(let coinName in meta.initBalance){
- let total = parseFloat(((meta.orders[coinName] ? meta.orders[coinName].rate : 1) * meta.initBalance[coinName]).toFixed(8));
- totalExpected += total;
- table += `
- <tr style="${trigger % 2 ? "background-color: #f0f0f0" : ""}">
- <td style="padding: 10px; text-align: center">${coinName}</td>
- <td style="padding: 10px; text-align: center">${meta.initBalance[coinName]}</td>
- <td style="padding: 10px; text-align: center">${meta.orders[coinName] ? meta.orders[coinName].rate : 1}</td>
- <td style="padding: 10px; text-align: center">${total}</td>
- <td style="padding: 10px; text-align: center">${parseFloat(total * btcRate).toFixed(2)}</td>
- </tr>
- `
- trigger++;
- }
- var feesBTC = parseFloat((totalExpected - meta.withdrawBalance).toFixed(8));
- var feesUSD = parseFloat(((totalExpected - meta.withdrawBalance) * btcRate).toFixed(2));
- table += `
- <tr style="${trigger % 2 ? "background-color: #f0f0f0" : ""}">
- <td style="padding: 10px; text-align: center"><b>Formula:</b></td>
- <td style="padding: 10px; text-align: center">A</td>
- <td style="padding: 10px; text-align: center">R</td>
- <td style="padding: 10px; text-align: center">A * R</td>
- <td style="padding: 10px; text-align: center">toUSD(A * R) </td>
- </tr>
- <tr style="${trigger % 2 ? "background-color: #f0f0f0" : ""}">
- <td style="padding: 10px; text-align: center"><b>Fees:</b></td>
- <td style="padding: 10px; text-align: center">-</td>
- <td style="padding: 10px; text-align: center">-</td>
- <td style="padding: 10px; text-align: center">${feesBTC}</td>
- <td style="padding: 10px; text-align: center">${feesUSD}</td>
- </tr>
- <tr style="${trigger % 2 ? "background-color: #f0f0f0" : ""}">
- <td style="padding: 10px; text-align: center"><b>To withdraw:</b></td>
- <td style="padding: 10px; text-align: center">-</td>
- <td style="padding: 10px; text-align: center">-</td>
- <td style="padding: 10px; text-align: center"><b>${withdrawBalance}</b></td>
- <td style="padding: 10px; text-align: center"><b>${withdrawBalanceUsd}</b></td>
- </tr>
- </table>
- `;
- return table;
- }
- function makeWithdrawsTable(){
- var trigger = 1;
- body += `
- <h2>Withdraw the shares</h2>
- <table>
- <tr>
- <td style="padding: 10px; text-align: center"><b>Address</b></td>
- <td style="padding: 10px; text-align: center"><b>Share size</b></td>
- <td style="padding: 10px; text-align: center"><b>Amount BTC</b></td>
- <td style="padding: 10px; text-align: center"><b>Amount USD</b></td>
- <td style="padding: 10px; text-align: center"><b>Comment</b></td>
- </tr>
- `;
- for(let withdraw of meta.withdraw.addresses){
- body += `
- <tr style="${trigger % 2 ? "background-color: #f0f0f0" : ""}">
- <td style="padding: 10px; text-align: center">${withdraw.address}</td>
- <td style="padding: 10px; text-align: center">${(withdraw.percents * 100).toFixed(2)}%</td>
- <td style="padding: 10px; text-align: center">${parseFloat(withdraw.amount.toFixed(8))}</td>
- <td style="padding: 10px; text-align: center">${(withdraw.amount * btcRate).toFixed(2)}</td>
- <td style="padding: 10px; text-align: center">${withdraw.label}</td>
- </tr>
- `
- trigger++;
- }
- body += `</table>`;
- }
- }
- /**
- * Percentage neet do be < 100
- * @return {bool}
- */
- function checkPercentage(){
- let summ = 0;
- for (let address in config.withdrawRatio) {
- summ += config.withdrawRatio[address].percents;
- }
- console.log(summ);
- return summ > 1 ? false : true;
- }
- /**
- * Get time iterval
- * @param {number} start timestamp in milliseconds
- * @param {number} end timestamp in milliseconds
- * @return {object} {
- * days: {number} - count of full days,
- * hours: {number} - count of full hours after last day,
- * minutes: {number} - count of full minutes after last hour,
- * time: {string} - tine in hh:mm
- * }
- */
- function getRemainingTime(start, end){
- if(!start){
- return {
- hours: 0,
- minutes: 0,
- time: 0,
- days: 9999
- };
- }
- if(end - start < 1000){
- return {
- hours: 0,
- minutes: 0,
- time: 0,
- days: 0
- };
- }
- var periodInSec = (end - start) / 1000;
- var hoursFloat = periodInSec / 3600;
- var hours = parseInt(hoursFloat);
- var minutes = parseInt(60 * (hoursFloat - hours));
- var time = `${hours}:${minutes}`;
- var days = parseInt(hours / 24);
- var seconds = parseInt((60 * (hoursFloat - hours) - minutes) * 60);
- return {
- hours: hours - days * 24,
- minutes: minutes,
- time: time,
- days: days,
- seconds: seconds
- };
- }
- /**
- * Error logger
- * @param {object|string}
- * @return {undefined}
- */
- function onError(err) {
- getUsdRate().then(function(rate){
- sendEmail(rate, err);
- }, sendEmail)
- console.log(err);
- }
- function getUsdRate(){
- var url = "https://poloniex.com/public?command=returnTicker";
- return new Promise(function(resolve, reject){
- request.get(url, function(err, res, body){
- try{
- if(!err){
- var coinRate = parseFloat(JSON.parse(body)["USDT_BTC"].last);
- if(coinRate && typeof coinRate === "number" && coinRate > 0){
- resolve(coinRate.toFixed(2));
- } else{
- reject();
- }
- } else{
- reject();
- }
- } catch(e){
- console.log("poloniex", e, err);
- return reject();
- }
- });
- });
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement