|
@@ -0,0 +1,274 @@
|
|
|
+const logger = require('../model/logger')
|
|
|
+var remote_config_db = require("../model/db/remote_config_db");
|
|
|
+var collect_coins_db = require("../model/db/collect_coins_db");
|
|
|
+var withdraw_db = require("../model/db/withdraw_db");
|
|
|
+var moralis = require("../model/moralis_sdk");
|
|
|
+var utils = require("../model/utils");
|
|
|
+const axios = require('axios');
|
|
|
+var { account_config } = require('../config/config.js');
|
|
|
+const { max } = require('moment');
|
|
|
+
|
|
|
+
|
|
|
+const http_request_get = async (data) => {
|
|
|
+ var host = account_config.STATISTICS_URL
|
|
|
+ var path = data
|
|
|
+ var url = host + path
|
|
|
+ logger.log('http_request_get', url)
|
|
|
+ return new Promise(response => {
|
|
|
+ axios.get(url)
|
|
|
+ .then(res => {
|
|
|
+ logger.log('res=>', res.status, res.data);
|
|
|
+ if (res.data.code == 0) {
|
|
|
+ response(res.data)
|
|
|
+ } else {
|
|
|
+ response({
|
|
|
+ code: 0,
|
|
|
+ msg: err.toString(),
|
|
|
+ data: {
|
|
|
+ canNotWithdrawUSD: '0',
|
|
|
+ canWithdrawUSD: '0',
|
|
|
+ incomeUSDTotal: '0',
|
|
|
+ incomeUSDFee: '0'
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }).catch(err => {
|
|
|
+ logger.error('http_request_get', err.toString(), url.toString());
|
|
|
+ response({
|
|
|
+ code: -1,
|
|
|
+ msg: err.toString(),
|
|
|
+ data: {
|
|
|
+ canNotWithdrawUSD: '0',
|
|
|
+ canWithdrawUSD: '0',
|
|
|
+ incomeUSDTotal: '0',
|
|
|
+ incomeUSDFee: '0'
|
|
|
+ }
|
|
|
+ })
|
|
|
+ });
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function computeAddressPrice(total_in_coins) {
|
|
|
+
|
|
|
+ for (key of total_in_coins.keys()) {
|
|
|
+ var item = total_in_coins.get(key)
|
|
|
+ var amount = item.amount
|
|
|
+ var usdPrice = item.usdPrice
|
|
|
+ if (key == '0x0000000000000000000000000000000000000000') {
|
|
|
+ item.totalUsdPrice = parseFloat(amount) / parseFloat(10 ** 18) * parseFloat(usdPrice)
|
|
|
+ } else {
|
|
|
+ var decimals = 18
|
|
|
+ try {
|
|
|
+
|
|
|
+ decimals = await redis.readAppendRedis('REDIS_ERC20_CONTRACT_DECIMALS', item.chain, key.toLowerCase())
|
|
|
+ } catch (error) {
|
|
|
+ decimals = 18
|
|
|
+ }
|
|
|
+ item.totalUsdPrice = parseFloat(amount) / parseFloat(decimals) * parseFloat(usdPrice)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+async function filterCollectCoinsLists(collect_ret, filterTypt) {
|
|
|
+ const total_in_coins = new Map();
|
|
|
+ var total_gas_fee = 0
|
|
|
+ for (let index = 0; index < collect_ret.results.length; index++) {
|
|
|
+ const element = collect_ret.results[index];
|
|
|
+ if (element.chain == null || element.chain == filterTypt) {
|
|
|
+ var before_gas_fee = element.before_gas_fee ? BigInt(element.before_gas_fee) : BigInt('0')
|
|
|
+ total_gas_fee = BigInt(element.total_gas_fee) + BigInt(before_gas_fee) + BigInt(total_gas_fee)
|
|
|
+ if (element.transfers) {
|
|
|
+ var opts = JSON.parse(element.transfers)
|
|
|
+ for (let index = 0; index < opts.length; index++) {
|
|
|
+ const transfers = opts[index];
|
|
|
+ var address = transfers.contractAddress ? transfers.contractAddress : '0x0000000000000000000000000000000000000000'
|
|
|
+ if (total_in_coins.get(address) != null) {
|
|
|
+ var ins = total_in_coins.get(address)
|
|
|
+ ins.amount = BigInt(ins.amount) + BigInt(transfers.amount)
|
|
|
+ total_in_coins.set(address, ins)
|
|
|
+ } else {
|
|
|
+ total_in_coins.set(address, {
|
|
|
+ amount: BigInt(transfers.amount),
|
|
|
+ usdPrice: transfers.usdPrice,
|
|
|
+ chain: transfers.chain,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ computeAddressPrice(total_in_coins)
|
|
|
+
|
|
|
+
|
|
|
+ try {
|
|
|
+ if (total_in_coins.size > 0) {
|
|
|
+ switch (filterTypt) {
|
|
|
+ case 'bsc_testnet':
|
|
|
+ case 'bsc_mainnet':
|
|
|
+ var price = await moralis.getAllTotkenPrice({ chain: 'bsc_testnet' })
|
|
|
+ if (typeof price === 'string') {
|
|
|
+ price = JSON.parse(price)
|
|
|
+ }
|
|
|
+ var bnbPriceItem = moralis.findTokenPriceItem('0x0000000000000000000000000000000000000000', price)
|
|
|
+ total_gas_fee = parseFloat(total_gas_fee) / parseFloat(10 ** 18) * parseFloat(bnbPriceItem.usdPrice)
|
|
|
+ logger.info('new-total_gas_fee ', total_gas_fee, bnbPriceItem)
|
|
|
+ break
|
|
|
+ case 'czz':
|
|
|
+ var price = await moralis.getAllTotkenPrice({ chain: 'czz' })
|
|
|
+ if (typeof price === 'string') {
|
|
|
+ price = JSON.parse(price)
|
|
|
+ }
|
|
|
+ var czzPriceItem = moralis.findTokenPriceItem('0x0000000000000000000000000000000000000000', price)
|
|
|
+ total_gas_fee = parseFloat(total_gas_fee) / parseFloat(10 ** 18) * parseFloat(czzPriceItem.usdPrice)
|
|
|
+ logger.info('new-total_gas_fee czz', total_gas_fee, czzPriceItem)
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ logger.error('total_gas_fee', error)
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ map: total_in_coins,
|
|
|
+ totalGasFee: total_gas_fee
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+async function getCollectCoinsOutInfo(startTime, endTime) {
|
|
|
+ var collect_ret = await collect_coins_db.query_collect_total_fee(startTime, endTime);
|
|
|
+ logger.info('getCollectCoinsOutInfo query_collect_total_fee', startTime, endTime, collect_ret)
|
|
|
+
|
|
|
+ var bsc_env
|
|
|
+ switch (process.env.NODE_ENV) {
|
|
|
+ case 'dev':
|
|
|
+ case 'test':
|
|
|
+ bsc_env = 'bsc_testnet'
|
|
|
+ break
|
|
|
+ case 'prd':
|
|
|
+ bsc_env = 'bsc_mainnet'
|
|
|
+ break
|
|
|
+ default:
|
|
|
+ bsc_env = 'bsc_mainnet'
|
|
|
+ break
|
|
|
+ }
|
|
|
+
|
|
|
+ var bsc_envnet = await filterCollectCoinsLists(collect_ret, bsc_env)
|
|
|
+ logger.info('getCollectCoinsOutInfo bsc_env', bsc_env, bsc_envnet)
|
|
|
+ var czz = await filterCollectCoinsLists(collect_ret, 'czz')
|
|
|
+ logger.info('getCollectCoinsOutInfo czz', czz)
|
|
|
+
|
|
|
+ logger.info('getCollectCoinsOutInfo total ', bsc_envnet.totalGasFee, czz.totalGasFee)
|
|
|
+ return {
|
|
|
+ bsc: bsc_envnet.map,
|
|
|
+ czz: czz.map,
|
|
|
+ totalGasFee: bsc_envnet.totalGasFee + czz.totalGasFee
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+async function getWithdrawOutInfo(startTime, endTime) {
|
|
|
+ if (startTime && endTime) {
|
|
|
+ startTime = '1655049600000'
|
|
|
+ endTime = '1655135999000'
|
|
|
+ }
|
|
|
+ var withdraw_ret = await withdraw_db.getWidthdrawTotalFee(startTime, endTime)
|
|
|
+ const withdraw_map = new Map();
|
|
|
+ for (let index = 0; index < withdraw_ret.length; index++) {
|
|
|
+ const element = withdraw_ret[index];
|
|
|
+ if (element.gas_price && element.gas_limit)
|
|
|
+ var total_gas_fee2 = (BigInt(element.gas_price) * BigInt(element.gas_limit))
|
|
|
+ if (withdraw_map.get(element.chain_id) != null) {
|
|
|
+ var ins = withdraw_map.get(element.chain_id)
|
|
|
+ withdraw_map.set(element.chain_id, BigInt(ins) + BigInt(total_gas_fee2))
|
|
|
+ } else {
|
|
|
+ withdraw_map.set(element.chain_id, BigInt(total_gas_fee2))
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ var keys = withdraw_map.keys();
|
|
|
+ var total_gas_fee = 0
|
|
|
+ for (key of keys) {
|
|
|
+ console.log(key, withdraw_map.get(key));
|
|
|
+ var value = withdraw_map.get(key)
|
|
|
+
|
|
|
+ try {
|
|
|
+ if (key == 2019) {
|
|
|
+ var price = await moralis.getAllTotkenPrice({ chain: 'czz' })
|
|
|
+ if (typeof price === 'string') {
|
|
|
+ price = JSON.parse(price)
|
|
|
+ }
|
|
|
+ var czzPriceItem = moralis.findTokenPriceItem('0x0000000000000000000000000000000000000000', price)
|
|
|
+ total_gas_fee += parseFloat(value) / parseFloat(10 ** 18) * parseFloat(czzPriceItem.usdPrice)
|
|
|
+ logger.info('new-total_gas_fee czz', total_gas_fee, czzPriceItem)
|
|
|
+ } else {
|
|
|
+ var price = await moralis.getAllTotkenPrice({ chain: 'bsc_testnet' })
|
|
|
+ if (typeof price === 'string') {
|
|
|
+ price = JSON.parse(price)
|
|
|
+ }
|
|
|
+ var bnbPriceItem = moralis.findTokenPriceItem('0x0000000000000000000000000000000000000000', price)
|
|
|
+ total_gas_fee += parseFloat(value) / parseFloat(10 ** 18) * parseFloat(bnbPriceItem.usdPrice)
|
|
|
+ logger.info('new-total_gas_fee bsc', total_gas_fee, bnbPriceItem)
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ logger.error('total_gas_fee', error)
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ totalGasFee: total_gas_fee
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ * 获取时间段总支出的 gas fee
|
|
|
+ * @param {*} startTime
|
|
|
+ * @param {*} endTime
|
|
|
+ */
|
|
|
+async function getStatisticsInfo() {
|
|
|
+
|
|
|
+ var startTime = utils.getLastDay('YYYY-MM-DD') + " 00:00:00"
|
|
|
+ var endTime = utils.getLastDay('YYYY-MM-DD') + " 23:59:59"
|
|
|
+ logger.info('getTotalOutGasFee', startTime, endTime)
|
|
|
+
|
|
|
+ var collectCoinsOut = await getCollectCoinsOutInfo(startTime, endTime)
|
|
|
+ logger.info('getCollectCoinsOutInfo collectCoinsOut', collectCoinsOut)
|
|
|
+
|
|
|
+ var withdrawOut = await getWithdrawOutInfo(startTime, endTime)
|
|
|
+ logger.info('getWithdrawOutInfo withdrawOut ', withdrawOut)
|
|
|
+
|
|
|
+ var data = await http_request_get(utils.getLastDay('YYYYMMDD'))
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ var totalCollectCoinsOut = await getCollectCoinsOutInfo(null, null)
|
|
|
+ logger.info('totalCollectCoinsOut ', totalCollectCoinsOut)
|
|
|
+
|
|
|
+ var totalWithdrawOut = await getWithdrawOutInfo(null, null)
|
|
|
+ logger.info('totalWithdrawOut ', totalWithdrawOut)
|
|
|
+
|
|
|
+ return {
|
|
|
+ todayTotalOutGasFee: collectCoinsOut.totalGasFee + withdrawOut.totalGasFee,
|
|
|
+ todayCanNotWithdrawUSD: data.data.canNotWithdrawUSD,
|
|
|
+ todayCanWithdrawUSD: data.data.canWithdrawUSD,
|
|
|
+ todayIncomeUSDTotal: data.data.incomeUSDTotal,
|
|
|
+ todayIncomeUSDFee: data.data.incomeUSDFee,
|
|
|
+ totalOutGasFee: totalCollectCoinsOut.totalGasFee + totalWithdrawOut.totalGasFee,
|
|
|
+ totalWithdrawGasFee: totalWithdrawOut.totalGasFee,
|
|
|
+ totalCollectCoinsGasFee: totalCollectCoinsOut.totalGasFee,
|
|
|
+ totalInFee: 0,
|
|
|
+ totalOutFee: 0,
|
|
|
+ totalbalances: null,
|
|
|
+ ylGasBalance: 0,
|
|
|
+ slGasBalance: 0,
|
|
|
+ }
|
|
|
+}
|
|
|
+module.exports = {
|
|
|
+ getStatisticsInfo
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|