DevYK 2 rokov pred
rodič
commit
3c41737c1b

+ 2 - 2
config/dev_config.js

@@ -19,6 +19,7 @@ const account_config = {
     TRANSFER_GAS: true,
     FEISHU_URL: 'https://open.feishu.cn/open-apis/bot/v2/hook/18dfe21f-b1bd-46ca-a8c7-c85e1c84f02d',
     CZZ_BASEURL: "https://internal-block-payout-test.denet.me",
+    STATISTICS_URL:'https://testapi.denetme.net/denet/wallet/stat/getMoneyStat?date='
 }
 
 const reids_token_config = {
@@ -59,7 +60,7 @@ const db_config = {
         POOL_SIZE: 5,
     },
 
-    // 数据库配置
+    // 线上数据库配置
     // mysql: {
     //     DATABASE: 'denet_chain',   //数据库名称
     //     DATABASE_MY_NODE: 'bnb_block_sync',   //自建 node 存储
@@ -70,7 +71,6 @@ const db_config = {
     //     HOST: 'denet-chain-prod.csi2lctklqzg.us-east-1.rds.amazonaws.com', //host
     //     OPEN_POOL: true,
     //     POOL_SIZE: 5,
-
     // },
 
     // redis: {

+ 1 - 0
config/prd_config.js

@@ -12,6 +12,7 @@ const account_config = {
     TRANSFER_GAS: true,
     FEISHU_URL: 'https://open.feishu.cn/open-apis/bot/v2/hook/9ab2594f-3d27-4f70-a5ed-a6aee0420aa6',
     CZZ_BASEURL: "https://internal-block-payout.denet.me",
+    STATISTICS_URL:'https://api.denetme.net/denet/wallet/stat/getMoneyStat?date='
 }
 
 const cryppt_config = {

+ 1 - 0
config/test_config.js

@@ -12,6 +12,7 @@ const account_config = {
     TRANSFER_GAS: true,
     FEISHU_URL: 'https://open.feishu.cn/open-apis/bot/v2/hook/18dfe21f-b1bd-46ca-a8c7-c85e1c84f02d',
     CZZ_BASEURL: "https://internal-block-payout-test.denet.me",
+    STATISTICS_URL:'https://testapi.denetme.net/denet/wallet/stat/getMoneyStat?date='
 }
 
 const cryppt_config = {

+ 13 - 6
model/db/collect_coins_db.js

@@ -8,9 +8,14 @@ const utils = require('../utils.js')
 /**
  * 查询归集入账总金额和总消耗的 gas fee
  */
-async function query_collect_total_fee() {
-    var sql = 'select * from collect_coins_manage WHERE status=?'
-    var param = [0]
+async function query_collect_total_fee(startTime, endTime) {
+    var sql = 'select * from collect_coins_manage WHERE status=? AND update_time>=? AND update_time<=? '
+    var param = [0, startTime, endTime]
+    if (!startTime && !endTime) {
+        sql = 'select * from collect_coins_manage WHERE status=? '
+        param = [0]
+    }
+
     // sql = 'select * from collect_coins_manage'
     // param=[]
     return new Promise((resolve) => {
@@ -112,10 +117,12 @@ async function create_collect_coins_task(opts) {
 
     var gas_trx_hash = opts.gas_trx_hash ? opts.gas_trx_hash : ''
 
-    var create_withdraw_sql = 'INSERT INTO collect_coins_manage (user_address,balances,transfers,prestore_gas_fee,company_public_key,total_gas_fee,status,create_time,update_time,resposes,error_msg,chain,gas_trx_hash)' +
-        'VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)'
+    var before_gas_fee = opts.before_gas_fee ? opts.before_gas_fee : ''
+
+    var create_withdraw_sql = 'INSERT INTO collect_coins_manage (user_address,balances,transfers,prestore_gas_fee,company_public_key,total_gas_fee,status,create_time,update_time,resposes,error_msg,chain,gas_trx_hash,before_gas_fee)' +
+        'VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)'
     var chain = opts.chain
-    var create_withdraw_params = [user_address, JSON.stringify(balances), JSON.stringify(transfers), JSON.stringify(prestore_gas_free), company_public_key, total_gas_fee, status, create_time, update_time, resposes, error_msg ? error_msg : '', chain, gas_trx_hash]
+    var create_withdraw_params = [user_address, JSON.stringify(balances), JSON.stringify(transfers), JSON.stringify(prestore_gas_free), company_public_key, total_gas_fee, status, create_time, update_time, resposes, error_msg ? error_msg : '', chain, gas_trx_hash, before_gas_fee]
 
     logger.log('create_collect_coins_task create_collect_coins_task_sql', create_withdraw_sql, create_withdraw_params);
     return new Promise((resolve) => {

+ 13 - 5
model/db/withdraw_db.js

@@ -20,6 +20,9 @@ async function create_withdraw_task(task_obj) {
     }
     //提币任务创建时间
     var withdraw_create_time = utils.getTimestamp();
+
+    withdraw_create_time = utils.getCurrentDate()
+
     var from_address = task_obj.user_address
     var to_address = task_obj.receiver
     var contract_address = task_obj.contractAddress
@@ -100,7 +103,7 @@ function update_withdraw_task(withdraw_id, ret_obj) {
     if (!status)
         status = 3
     if (!update_time)
-        update_time = utils.getTimestamp()
+        update_time = utils.getCurrentDate()
     var update_withdraw_params = [status, hash, nonce, update_time, gas_price, gas_limit, ret_obj.value, ret_obj.errorMsg ? ret_obj.errorMsg : '', withdraw_id]
     return new Promise((resolve) => {
         mysql.getMySqlInstance().getConnection(function (err, connection) {
@@ -174,9 +177,14 @@ function queryWithdrawInfoFromWithdrawId(withdrawId) {
 
 
 
-function getWidthdrawTotalFee() {
-    var create_withdraw_sql = 'select * from withdraw_manage WHERE withdraw_status=? AND chain_id=? '
-    var create_withdraw_params = [2, 56]
+function getWidthdrawTotalFee(startTime, endTime) {
+    var create_withdraw_sql = 'select * from withdraw_manage WHERE withdraw_status=? AND  update_time>=? AND update_time<=? '
+    var create_withdraw_params = [2, startTime, endTime]
+
+    if (!startTime && !endTime) {
+        create_withdraw_sql = 'select * from withdraw_manage WHERE withdraw_status=? '
+        create_withdraw_params = [2]
+    }
     return new Promise((resolve) => {
         mysql.getMySqlInstance().getConnection(function (err, connection) {
             if (err) {
@@ -193,7 +201,7 @@ function getWidthdrawTotalFee() {
                         resolve(null);
                         return;
                     }
-                    logger.log('getWidthdrawTotalFee ret=', error, results);
+                    // logger.log('getWidthdrawTotalFee ret=', error, results);
                     //用完当前连接需要释放,归还给连接池
                     connection.release();
                     if (results && Array.isArray(results) && results.length > 0) {

+ 4 - 0
model/moralis_sdk.js

@@ -606,6 +606,7 @@ async function transfers(obj, my_account_all_coins, logParams) {
         logParams.results = collects
         logParams.collects = JSON.stringify(collects_mysql)
         logParams.createTime = obj.createTime
+        logParams.before_gas_fee =obj.before_gas_fee
         if (obj.address)
             logParams.user_address = obj.address
         if (t_i == my_account_all_coins.transfer_arrays.length) {
@@ -858,6 +859,8 @@ const collectCoins = async (obj) => {
 
         obj.chain = chain;
         obj.transFerGasFree = transFerGasFree;
+        if (transfer.totalGasFree)
+            obj.before_gas_fee = transfer.totalGasFree
         logParams.chain = chain
         logger.log('transfers--->', obj);
         var ret = await transfers(obj, my_account_all_coins, logParams);
@@ -1665,6 +1668,7 @@ module.exports = {
     queryCollectBalance,
     queryCompanyInfoFromId,
     getAccountAllCoins,
+    findTokenPriceItem,
 }
 
 

+ 274 - 0
model/server_data_statistics.js

@@ -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.readRedis('REDIS_ERC20_CONTRACT_DECIMALS_' + element.token_address.toLowerCase())
+                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)
+
+    //获取 total gas
+    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 //总入金所消耗的 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));  // map.get(key)可得value值。
+        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,             //今日总支出的 gas fee
+        todayCanNotWithdrawUSD: data.data.canNotWithdrawUSD,                                    //今日不可提现余额
+        todayCanWithdrawUSD: data.data.canWithdrawUSD,                                          //今日可提现余额
+        todayIncomeUSDTotal: data.data.incomeUSDTotal,                              //今日总收入
+        todayIncomeUSDFee: data.data.incomeUSDFee,                                  //今日固定收入
+        totalOutGasFee: totalCollectCoinsOut.totalGasFee + totalWithdrawOut.totalGasFee,                                                          //总支出 gas fee
+        totalWithdrawGasFee: totalWithdrawOut.totalGasFee,                                                     //总提币 gas fee
+        totalCollectCoinsGasFee: totalCollectCoinsOut.totalGasFee,                                                 //总归集 gas fee
+        totalInFee: 0,                                                              //总入金
+        totalOutFee: 0,                                                             //总出金
+        totalbalances: null,                                                        //总余额
+        ylGasBalance: 0,                                                            //预留 gas 费余额  native 总余额 - 总入金
+        slGasBalance: 0,                                                            //散落 gas 费余额  充值 0.5 gas - 使用 0.3 gas= 散落 0.2gas
+    }
+}
+module.exports = {
+    getStatisticsInfo
+}
+
+
+

+ 15 - 4
model/utils.js

@@ -2,10 +2,10 @@
 var CryptoJS = require("crypto-js");
 require('dotenv').config()
 const logger = require('./logger')
-var moment = require('moment');
 const chinaTime = require('china-time');
 
 var { cryppt_config } = require('../config/config.js')
+const moment = require('moment-timezone');
 
 function toJson(code_, obj_, errMsg_) {
     var code = code_
@@ -31,7 +31,7 @@ function decryptPrivityKey(message) {
     // var iv = 'Zh4A7bOY2ksp9oIn'
 
     var encrypted = message; //python is base64 ECB
-    var key = process.env.DENET_CRYPT_KEY 
+    var key = process.env.DENET_CRYPT_KEY
     var iv = process.env.DENET_CRYPT_IV
     if (!key || !iv) {
         logger.error('decryptPrivityKey key or iv is empty?');
@@ -158,6 +158,16 @@ function getCurrentDateFormat(format) {
     return chinaTime(format);
 }
 
+function chinaTimeMs(format, ms) {
+    return format
+        ? moment(ms).tz('Asia/Shanghai').format(format)
+        : new Date(moment(ms).tz('Asia/Shanghai').format('YYYY-MM-DD HH:mm'));
+}
+
+function getLastDay(format) {
+    return moment().subtract(1, 'day').tz('Asia/Shanghai').format(format)
+}
+
 function getTimestampToDate(tm) {
     var now = new Date(tm),
         y = now.getFullYear(),
@@ -175,7 +185,7 @@ function scientificNotationToString(param) {
         let strParam = String(param)
         let flag = /e/.test(strParam)
         if (!flag) return param
-    
+
         // 指数符号 true: 正,false: 负
         let sysbol = true
         if (/e-/.test(strParam)) {
@@ -185,7 +195,7 @@ function scientificNotationToString(param) {
         let index = Number(strParam.match(/\d+$/)[0])
         // 基数
         let basis = strParam.match(/^[\d\.]+/)[0].replace(/\./, '')
-    
+
         if (sysbol) {
             return basis.padEnd(index + 1, 0)
         } else {
@@ -214,4 +224,5 @@ module.exports = {
     scientificNotationToString,
     getTimestampToDate,
     getRedisKeyFromChain,
+    getLastDay,
 }

+ 8 - 2
test/db_test.js

@@ -8,6 +8,8 @@ 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");
 const BigNumber = require('bignumber.js')
+var utils = require('../model/utils')
+var statistics = require('../model/server_data_statistics')
 router.prefix('/test');
 router.post('/set', async (ctx) => {
     // const obj = ctx.request.body;
@@ -142,18 +144,22 @@ async function getInfo2() {
     //     console.log('total', total_gas_fee2 + total_gas_fee)
 }
 
-function getInfo3() {
+async function getInfo3() {
     // console.log('1018087452840284941787', 1018087452840284941787 / (10**18))
 
     // console.log('101000000000000000000', 101000000000000000000 / (10**18) * 0.6476)
 
     // console.log('64585000000000000000000', 64585000000000000000000 / (10**18) * 0.0005)
 
-    
+
     // console.log('1000000000000000', 1000000000000000 / (10**18) * 0.0482)
     // console.log('2410418338592426908426', 2410418338592426908426 / (10**18) * 0.2074)
     // console.log('2501561242336020120158', 2501561242336020120158 / (10**18) * 0.2074)
 
+    console.log("YYYY-MM-dd", utils.getCurrentDateFormat('YYYY-MM-DD'))
+   
+    console.error("getTotalOutGasFee", await statistics.getStatisticsInfo())
+
 }
 getInfo3()
 // getInfo2()

+ 6 - 1
test/sample.js

@@ -1,5 +1,6 @@
 var CryptoJS = require("crypto-js");
 
+
 function decryptPrivityKey(message) {
     var encrypted = message; 
     var key = process.env.DENET_CRYPT_KEY 
@@ -21,6 +22,10 @@ function decryptPrivityKey(message) {
     return de_pk
 }
 
-decryptPrivityKey('bnUvrSKmU3l7zONP+hIH1BOMhNVfIBUgEziWb2tGiUgn63FZVdzXC9E1DT+Mx3B+nqrzUAqd60I/8rLobYYl+0TSR3Ri1o0iX/hcxqs/0yg=')
+// decryptPrivityKey('bnUvrSKmU3l7zONP+hIH1BOMhNVfIBUgEziWb2tGiUgn63FZVdzXC9E1DT+Mx3B+nqrzUAqd60I/8rLobYYl+0TSR3Ri1o0iX/hcxqs/0yg=')
+
+
+
+