Ver código fonte

自查询和增加kcc/okc链

DevYK 2 anos atrás
pai
commit
99079b176f

+ 26 - 24
config/dev_config.js

@@ -18,8 +18,10 @@ const account_config = {
     TOKEN_GAS_PRICE: '10000000000',
     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",
+    // CZZ_BASEURL: "https://internal-block-payout-test.denet.me",
+    CZZ_BASEURL: "https://internal-block-payout.denet.me",
     STATISTICS_URL: 'https://testapi.denetme.net/denet/wallet/stat/getMoneyStat?date='
+    // STATISTICS_URL:'https://api.denetme.net/denet/wallet/stat/getMoneyStat?date='
 }
 
 const reids_token_config = {
@@ -47,26 +49,6 @@ const http_log_report_config = {
 // 设置数据库配置文件
 const db_config = {
     // 数据库配置
-    mysql: {
-        DATABASE: 'denet_chain',   //数据库名称
-        DATABASE_MY_NODE: 'bnb_block_sync',   //自建 node 存储
-        TABLENAME: 'user_key_manage',   //表名
-        USERNAME: 'denet',   //用户名
-        PASSWORD: 'cyber#Together_2022', //密码
-        PORT: '3306', //连接的端口
-        HOST: 'denet-test.csi2lctklqzg.us-east-1.rds.amazonaws.com', //host
-        OPEN_POOL: true,
-        POOL_SIZE: 5,
-    },
-
-    redis: {
-        PORT: 6379, // Redis port
-        HOST: "denet-test.y2slbl.clustercfg.memorydb.us-east-1.amazonaws.com", // Redis host
-        USERNAME: null, // needs Redis >= 6
-        PASSWORD: null,
-    },
-
-    // 线上数据库配置
     // mysql: {
     //     DATABASE: 'denet_chain',   //数据库名称
     //     DATABASE_MY_NODE: 'bnb_block_sync',   //自建 node 存储
@@ -74,17 +56,37 @@ const db_config = {
     //     USERNAME: 'denet',   //用户名
     //     PASSWORD: 'cyber#Together_2022', //密码
     //     PORT: '3306', //连接的端口
-    //     HOST: 'denet-chain-prod.csi2lctklqzg.us-east-1.rds.amazonaws.com', //host
+    //     HOST: 'denet-test.csi2lctklqzg.us-east-1.rds.amazonaws.com', //host
     //     OPEN_POOL: true,
     //     POOL_SIZE: 5,
     // },
 
     // redis: {
     //     PORT: 6379, // Redis port
-    //     HOST: "denet-chain-prod.y2slbl.clustercfg.memorydb.us-east-1.amazonaws.com", // Redis host
-    //     USERNAME: null,
+    //     HOST: "denet-test.y2slbl.clustercfg.memorydb.us-east-1.amazonaws.com", // Redis host
+    //     USERNAME: null, // needs Redis >= 6
     //     PASSWORD: null,
     // },
+
+    // // 线上数据库配置
+    mysql: {
+        DATABASE: 'denet_chain',   //数据库名称
+        DATABASE_MY_NODE: 'bnb_block_sync',   //自建 node 存储
+        TABLENAME: 'user_key_manage',   //表名
+        USERNAME: 'denet',   //用户名
+        PASSWORD: 'cyber#Together_2022', //密码
+        PORT: '3306', //连接的端口
+        HOST: 'denet-chain-prod.csi2lctklqzg.us-east-1.rds.amazonaws.com', //host
+        OPEN_POOL: true,
+        POOL_SIZE: 5,
+    },
+
+    redis: {
+        PORT: 6379, // Redis port
+        HOST: "denet-chain-prod.y2slbl.clustercfg.memorydb.us-east-1.amazonaws.com", // Redis host
+        USERNAME: null,
+        PASSWORD: null,
+    },
 }
 
 // 设置 moralis sdk 配置文件

+ 24 - 3
config/test_config.js

@@ -12,7 +12,8 @@ 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='
+    // CZZ_BASEURL: "https://internal-block-payout.denet.me",
+    STATISTICS_URL: 'https://testapi.denetme.net/denet/wallet/stat/getMoneyStat?date='
 }
 
 const cryppt_config = {
@@ -32,8 +33,8 @@ const reids_token_config = {
     COLLECT_CONIS_QUEUE_KEY: 'COLLECT_CONIS_QUEUE_KEY',
     LAST_COLLECT_PUBLIC_KEY: 'LAST_COLLECT_PUBLIC_LEY',
     LAST_COLLECT_TIME: 'LAST_COLLECT_TIME',
-    CHECK_CZZ_WITHDRAW_STATUS_QUEUE:'CHECK_CZZ_WITHDRAW_STATUS_QUEUE',
-    BSC_LOG_MONITORING_KEY:'BSC_LOG_MONITORING_KEY'
+    CHECK_CZZ_WITHDRAW_STATUS_QUEUE: 'CHECK_CZZ_WITHDRAW_STATUS_QUEUE',
+    BSC_LOG_MONITORING_KEY: 'BSC_LOG_MONITORING_KEY'
 }
 
 
@@ -64,6 +65,26 @@ const db_config = {
         USERNAME: null, // needs Redis >= 6
         PASSWORD: null,
     },
+
+    // // 线上数据库配置
+    // mysql: {
+    //     DATABASE: 'denet_chain',   //数据库名称
+    //     DATABASE_MY_NODE: 'bnb_block_sync',   //自建 node 存储
+    //     TABLENAME: 'user_key_manage',   //表名
+    //     USERNAME: 'denet',   //用户名
+    //     PASSWORD: 'cyber#Together_2022', //密码
+    //     PORT: '3306', //连接的端口
+    //     HOST: 'denet-chain-prod.csi2lctklqzg.us-east-1.rds.amazonaws.com', //host
+    //     OPEN_POOL: true,
+    //     POOL_SIZE: 5,
+    // },
+
+    // redis: {
+    //     PORT: 6379, // Redis port
+    //     HOST: "denet-chain-prod.y2slbl.clustercfg.memorydb.us-east-1.amazonaws.com", // Redis host
+    //     USERNAME: null,
+    //     PASSWORD: null,
+    // },
 }
 
 // 设置 moralis sdk 配置文件

+ 5 - 2
model/db/account_info_db.js

@@ -93,6 +93,9 @@ function addConnEvent() {
 
 async function getAccountBalances_(opts) {
     logger.log('getAccountBalances', opts)
+
+    opts.chain = utils.getChainNameFromChain(opts.chain)
+
     var sql_main = 'select * from '
     var sql_table_name = ' user_balance '
     var sql_where = ' WHERE '
@@ -214,12 +217,12 @@ async function getAccountBalances(opts) {
                     //     decimals: 18,
                     //     balance: '1000000000000000000000'
                     //   }
-                    var decimals = 1
+                    var decimals = 18
                     try {
                         // decimals = await redis.readRedis('REDIS_ERC20_CONTRACT_DECIMALS_' + element.token_address.toLowerCase())
                         decimals = await redis.readAppendRedis('REDIS_ERC20_CONTRACT_DECIMALS', opts.chain, element.token_address.toLowerCase())
                     } catch (error) {
-                        
+                        decimals=18
                     }
                     results.push({
                         type: 'token',

+ 43 - 0
model/db/collect_coins_db.js

@@ -16,6 +16,11 @@ async function query_collect_total_fee(startTime, endTime) {
         param = [0]
     }
 
+    if (!startTime && endTime) {
+        sql = 'select * from collect_coins_manage WHERE status=? AND update_time>=? AND update_time<=? '
+        param = [0,0,endTime]
+    }
+
     // sql = 'select * from collect_coins_manage'
     // param=[]
     return new Promise((resolve) => {
@@ -83,6 +88,43 @@ async function query_collect_hash(hash) {
     })
 }
 
+
+
+/**
+ * 查询归集的hash
+ */
+ async function query_collect_hash_list() {
+    var sql = 'select * from collect_coins_manage WHERE gas_trx_hash!=?'
+    var param = ['']
+    // sql = 'select * from collect_coins_manage'
+    // param=[]
+    return new Promise((resolve) => {
+        mysql.getMySqlInstance().getConnection(function (err, connection) {
+            if (err) {
+                logger.error('query_collect_hash_list', err)
+                logger.error('query_collect_hash_list', sql)
+                resolve(null);
+                return;
+            }
+            connection.query(
+                sql, param,
+                function selectCb(error, results) {
+                    if (error) {
+                        logger.error('query_collect_hash_list', error, sql, param)
+                        resolve(null);
+                        return;
+                    }
+                    logger.log('query_collect_hash_list ret=', error, results);
+                    //用完当前连接需要释放,归还给连接池
+                    connection.release();
+                    resolve(results
+                    );
+                }
+            );
+        })
+    })
+}
+
 /**
  * 创建一个归集任务
  * @param {*} opts 
@@ -224,4 +266,5 @@ module.exports = {
     update_collect_coins_task,
     query_collect_total_fee,
     query_collect_hash,
+    query_collect_hash_list,
 }

+ 38 - 0
model/db/remote_config_db.js

@@ -41,6 +41,43 @@ async function isPause(type) {
     })
 }
 
+/**
+ * 是否使用 moralis sdk 
+ */
+async function isUseMoralisSDK() {
+    var sql = 'select * from remote_config WHERE type=? '
+    var par = ['use_moralis_sdk']
+    logger.info('isUseMoralisSDK', sql, par)
+    return new Promise((resolve) => {
+        mysql.getMySqlInstance().getConnection(function (err, connection) {
+            if (err) {
+                logger.error('isUseMoralisSDK', err)
+                logger.error('isUseMoralisSDK', sql)
+                resolve(null);
+                return;
+            }
+            connection.query(
+                sql, par,
+                function selectCb(error, results) {
+                    if (error) {
+                        logger.error('isUseMoralisSDK', error, sql, par)
+                        resolve(1);
+                        return;
+                    }
+                    logger.log('isUseMoralisSDK ret=', error, results);
+                    //用完当前连接需要释放,归还给连接池
+                    connection.release();
+                    if (results && Array.isArray(results) && results.length > 0) {
+                        resolve(results[0].pause == 0);
+                    } else {
+                        resolve(true);
+                    }
+                }
+            );
+        })
+    })
+}
+
 
 /**
  * 是否暂停归集动作
@@ -147,5 +184,6 @@ async function isBlackList(type, chain, address) {
 module.exports = {
     isPause,
     isBlackList,
+    isUseMoralisSDK,
     tokenCollectCoinsBlacklistExist,
 }

+ 5 - 6
model/db/withdraw_db.js

@@ -30,12 +30,11 @@ async function create_withdraw_task(task_obj) {
     var type = task_obj.type
     var amount = task_obj.amount
 
-    if (chain_id == 2019)
-        switch (type) {
-            case 'erc20':
-                type = 'token'
-                break
-        }
+    switch (type) {
+        case 'erc20':
+            type = 'token'
+            break
+    }
 
     if (!from_address || !to_address) {
         return {

+ 4 - 4
model/czz.js → model/http_withdraw.js

@@ -11,12 +11,12 @@ var url = account_config.CZZ_BASEURL
 const withdraw = async (params) => {
     params.privateKey = ''
     params.toAddress = params.receiver
-    logger.info('withdraw_czz', process.env.NODE_ENV, url, ' params ', params)
+    logger.info('http-withdraw', process.env.NODE_ENV, url, ' params ', params)
     var data = { ...params }
     return new Promise(resolve => {
         axios.post(url + '/withdraw', data, { timeout: 5 * 60 * 1000 })
             .then(res => {
-                console.log('res=>', res.status, res.data);
+                logger.info('withdraw res=>', res.status, res.data);
                 resolve(res.data)
             }).catch(err => {
                 logger.error('http_request_post withdraw_czz error ', JSON.stringify(err));
@@ -30,13 +30,13 @@ const check_withdraw_status = async (params) => {
     logger.info('txn_status_czz', process.env.NODE_ENV, url, ' params ', params)
     var pars = {
         txn_hash: params.hash,
-        chain: "czz"
+        chain: params.chain
     }
     var data = pars
     return new Promise(resolve => {
         axios.post(url + '/txn_status', data, { timeout: 1 * 60 * 1000 })
             .then(res => {
-                console.log('res=>', res.status, res.data);
+                console.log('check_withdraw_status res=>', res.status, res.data);
                 resolve(res.data)
             }).catch(err => {
                 logger.error('http_request_post check_withdraw_status error ', JSON.stringify(err));

+ 82 - 63
model/moralis_sdk.js

@@ -12,7 +12,7 @@ const logger = require('./logger')
 const report = require("./report")  //导入 db.js
 const BigNumber = require('bignumber.js')
 const collect_coins_db = require('./db/collect_coins_db')
-const czz = require('./czz')
+const czz = require('./http_withdraw')
 var remote_config_db = require("../model/db/remote_config_db");
 
 /* Moralis init code */
@@ -232,6 +232,7 @@ const withdraw = async (obj) => {
 
 
 async function getAccountBalances(options) {
+    logger.log('getAccountBalances fun in', options)
     await initMasterSDK();
     if (options.chain) {
         options.chain = utils.getChainName(options.chain)
@@ -248,14 +249,15 @@ async function getAccountBalances(options) {
         chain: options.chain
     }
     logger.log('getAccountBalances :', options, balance_opts)
+    var use_moralis_sdk = await remote_config_db.isUseMoralisSDK()
     do {
         try {
             if (options.type == 'native') {
                 // result = await Moralis.Web3API.account.getNativeBalance(balance_opts);
-                result = await getBalances(balance_opts, 'native', 1)
+                result = await getBalances(balance_opts, 'native', use_moralis_sdk)
                 logger.log('getNativeBalance=', result);
             } else {
-                result = await getBalances(balance_opts, 'token', 1)
+                result = await getBalances(balance_opts, 'token', use_moralis_sdk)
                 // result = await Moralis.Web3API.account.getTokenBalances(balance_opts);
                 logger.log('getTokenBalances=', result);
             }
@@ -362,13 +364,14 @@ async function computeTransferGasFree(obj, my_account_all_coins, tokenPrices) {
                     if (element.token_address.toLowerCase() == '0x8860313deeb10a2863bc05b04b37897044edbda1'.toLowerCase()) {
                         add_gas_limit_count = 3
                     }
+                    var type = utils.getTokenTransferType(obj.chain)
 
                     var obj_20 = {
                         chain: obj.chain,
                         contractAddress: element.token_address,
                         amount: element.balance,
                         receiver: receiver_info.user_address,
-                        type: obj.chain == utils.CHAIN_NAME.czz ? 'token' : 'erc20',
+                        type: type,
                         address: obj.address,
                         usdPrice: find_transfer_item.usdPrice
                     }
@@ -383,7 +386,9 @@ async function computeTransferGasFree(obj, my_account_all_coins, tokenPrices) {
         var lastTokenPrice = await redis.readAppendRedis(reids_token_config.LAST_TOKEN_PRICE, obj.chain, '')
 
         logger.log('LAST_TOKEN_PRICE=', lastTokenPrice);
-
+        if (process.env.NODE_ENV == 'test' || process.env.NODE_ENV == 'dev') {
+            lastTokenPrice = parseInt(account_config.TOKEN_GAS_PRICE);
+        }
         if (lastTokenPrice && parseInt(lastTokenPrice) > 0) {
             tokenGasPrice = parseInt(tokenCount) * parseInt(lastTokenPrice) * (parseInt(account_config.TOKEN_GAS_LIMIT) * add_gas_limit_count);
             ret_a_gas = lastTokenPrice;
@@ -419,9 +424,15 @@ async function computeTransferGasFree(obj, my_account_all_coins, tokenPrices) {
             logger.log('LAST_BNB_PRICE=', lastBnbPrice);
             if (lastBnbPrice && parseInt(lastBnbPrice) > 0) {
                 var limitPrice = parseInt(account_config.BNB_GAS_LIMIT)
-                if (obj.chain == utils.CHAIN_NAME.czz) {
+
+                if (utils.getChainNameFromChain(obj.chain) != 'bsc') {
                     limitPrice = 40000
                 }
+                if (process.env.NODE_ENV == 'test' || process.env.NODE_ENV == 'dev') {
+                    lastBnbPrice = parseInt(account_config.BNB_GAS_PRICE);
+                }
+
+                logger.log('LAST_BNB_PRICE limitPrice =', lastBnbPrice, limitPrice);
                 nativeGasPrice = parseInt(nativeCount) * parseInt(lastBnbPrice) * limitPrice;
                 ret_a_gas = lastBnbPrice;
             } else {
@@ -528,7 +539,7 @@ async function updateNativeBalance(nativeBalance, obj) {
         do {
             //上面转账完 BNB 会减去,这里再获取一次
             // var native_ret = await Moralis.Web3API.account.getNativeBalance(temp);
-            var native_ret = await getBalances(balance_opts, 'native', 1);
+            var native_ret = await getBalances(balance_opts, 'native', 0);
             logger.log('更新余额 :', nativeBalance, native_ret, retryCount)
             if (nativeBalance != native_ret.balance && BigInt(nativeBalance) < BigInt(native_ret.balance)) {
                 return native_ret.balance;
@@ -689,12 +700,15 @@ const transfer_handle = async (obj) => {
     }
 
     try {
-        //解密
-        obj.privateKey = utils.decryptPrivityKey(obj.privateKey);
+        if (utils.getChainNameFromChain(obj.chain) == 'bsc') {
 
-        if (!obj.privateKey) {
-            logger.error('decryptPrivityKey error', obj);
-            return toJson(-1, null, "decryptPrivityKey error.");
+            //解密
+            obj.privateKey = utils.decryptPrivityKey(obj.privateKey);
+
+            if (!obj.privateKey) {
+                logger.error('decryptPrivityKey error', obj);
+                return toJson(-1, null, "decryptPrivityKey error.");
+            }
         }
     } catch (error) {
         logger.error('decryptPrivityKey error', error.toString(), JSON.stringify(obj));
@@ -845,6 +859,12 @@ const collectCoins = async (obj) => {
         if (typeof obj.tokenPrices == 'string')
             obj.tokenPrices = JSON.parse(obj.tokenPrices);
     }
+    if (process.env.NODE_ENV == 'dev' && obj.tokenPrices && Array.isArray(obj.tokenPrices.tokenPrice)) {
+        obj.tokenPrices.tokenPrice.push({
+            contract: '0xFF94950Ee8A79c52cC4B0Aa5178C8cEa48A3F3A6',
+            usdPrice: 0.12337863
+        })
+    }
     logger.log('tokenPrices=', obj.tokenPrices)
 
     obj.chain = chain;
@@ -1038,7 +1058,7 @@ async function transfer_(opts) {
     if (opts.receiver) {
         opts.receiver = utils.trim(opts.receiver)
     }
-    if (opts.chainId != utils.CHAIN_ID.czz) {
+    if (opts.chainId == utils.CHAIN_ID.bsc_testnet || opts.chainId == utils.CHAIN_ID.bsc_mainnet) {
         var options;
         // sending 0.5 DAI tokens with 18 decimals on BSC testnet
         if (opts.contractAddress) { //如果存在就是代币
@@ -1083,47 +1103,43 @@ async function transfer_(opts) {
             return ret
         }
     } else {
-        switch (opts.chainId) {
-            case utils.CHAIN_ID.czz:
-                opts.chain = 'czz'
-                switch (opts.type) {
-                    case 'erc20':
-                        opts.type = 'token'
-                        break
-                }
-                var ret = await czz.withdraw(opts)
-                if (ret && ret.data && ret.code == 0) {
-                    return {
-                        nonce: ret.data.nonce,
-                        gasPrice: {
-                            type: "BigNumber",
-                            hex: "0x" + (ret.data.gasPrice).toString(16)
-                        },
-                        gasLimit: {
-                            type: "BigNumber",
-                            hex: "0x" + (ret.data.gasLimit).toString(16)
-                        },
-                        to: ret.data.to,
-                        value: {
-                            type: "BigNumber",
-                            hex: "0x" + (ret.data.value).toString(16),
-                            number: ret.data.value
-                        },
-                        chain: opts.chain,
-                        from: ret.data.from,
-                        hash: ret.data.hash,
-                    }
-                } else if (ret && ret.data && ret.code == 1) {
-                    return {
-                        code: 1,
-                        hash: ret.data.hash,
-                        create_time: utils.getTimestamp(),
-                        lifecycle: 24 * 60 * 60 * 1000,
-                    }
-                } else {
-                    logger.error('czz withdraw error', JSON.stringify(ret), JSON.stringify(opts))
-                    throw JSON.stringify(ret)
-                }
+        if (opts.type != 'native') {
+            opts.type = 'token'
+        }
+        opts.chain = utils.getChainIdToName(opts.chainId)
+        var ret = await czz.withdraw(opts)
+        if (ret && ret.data && ret.code == 0) {
+            return {
+                nonce: ret.data.nonce,
+                gasPrice: {
+                    type: "BigNumber",
+                    hex: "0x" + (ret.data.gasPrice).toString(16)
+                },
+                gasLimit: {
+                    type: "BigNumber",
+                    hex: "0x" + (ret.data.gasLimit).toString(16)
+                },
+                to: ret.data.to,
+                value: {
+                    type: "BigNumber",
+                    hex: "0x" + (ret.data.value).toString(16),
+                    number: ret.data.value
+                },
+                chain: opts.chain,
+                from: ret.data.from,
+                hash: ret.data.hash,
+            }
+        } else if (ret && ret.data && ret.code == 1) {
+            return {
+                code: 1,
+                chain: opts.chain,
+                hash: ret.data.txn_hash,
+                create_time: utils.getTimestamp(),
+                lifecycle: 24 * 60 * 60 * 1000,
+            }
+        } else {
+            logger.error('czz withdraw error', JSON.stringify(ret), JSON.stringify(opts))
+            throw JSON.stringify(ret)
         }
     }
 }
@@ -1142,7 +1158,8 @@ async function pushChainDetailTOQueue(withdraw, request, obj) {
             var obj = JSON.parse(obj)
             var temp_obj = {
                 withdraw_id: request.withdraw_id,
-                hash: obj.hash,
+                hash: obj.data.hash,
+                chain: obj.data.chain,
                 create_time: obj.data.create_time,
                 lifecycle: obj.data.lifecycle
             }
@@ -1175,10 +1192,9 @@ const getAllTokenWithdrawInfoLists = async (obj) => {
 const getAllTotkenPrice = async (opts) => {
     try {
         logger.log('当前环境:', process.env.NODE_ENV);
-        logger.log("getAllTotkenPrice in", reids_token_config); // Prints "value"
+        // logger.log("getAllTotkenPrice in", reids_token_config); // Prints "value"
         var token_price_key = reids_token_config.TOKENPRICE;
         logger.log("getAllTotkenPrice token_price_key=", token_price_key);
-        // return await redis.readRedis(token_price_key)
         return await redis.readAppendRedis(token_price_key, opts.chain, '')
     } catch (error) {
         logger.error("getTotkenPrice=", error);
@@ -1419,11 +1435,13 @@ async function getTokenTransfersV2(opt) {
         var tryCount = 4;
         var delay = 1000
         var interval = 500
+
+        var use_moralis_sdk = await remote_config_db.isUseMoralisSDK()
         do {
             //主流币
             try {
                 logger.log('getTokenTransfersV2 account getTransactions>>>>>', options);
-                t_1 = await getTransferRecord(options, 'native', 1);
+                t_1 = await getTransferRecord(options, 'native', use_moralis_sdk);
                 logger.log('getTokenTransfersV2 native ret -->>> t_1', t_1);
                 break
             } catch (error) {
@@ -1460,7 +1478,7 @@ async function getTokenTransfersV2(opt) {
                     options.to_block = '10000000000'
                 }
                 logger.log('getTokenTransfersV2 account getTokenTransfers>>>>>', options);
-                t_2 = await getTransferRecord(options, 'token', 1);
+                t_2 = await getTransferRecord(options, 'token', use_moralis_sdk);
                 logger.log('getTokenTransfersV2 token ret -->>> t_2', t_2);
                 break
             } catch (error) {
@@ -1522,7 +1540,7 @@ async function getTokenTransfersV2(opt) {
         do {
             try {
                 logger.log('getTokenTransfersV2 getTransaction options-->>> ', options);
-                const transaction = await getTransferRecord(options, 'hash', 1);
+                const transaction = await getTransferRecord(options, 'hash', use_moralis_sdk);
                 logger.log('getTokenTransfersV2 getTransaction ret-->>> ', transaction);
                 return transaction;
             } catch (error) {
@@ -1555,6 +1573,7 @@ function convertChain(chain) {
         case utils.CHAIN_NAME.bsc_testnet:
             return 'bsc'
     }
+    return chain
 }
 
 /**
@@ -1562,12 +1581,12 @@ function convertChain(chain) {
  * @param {} opts 
  */
 async function getTransferRecord(opts, type, use_moralis_sdk_) {
-    logger.info('getTransferRecord>>>>>>>>', opts, type)
+    logger.info('getTransferRecord>>>>>>>>', opts, type, use_moralis_sdk_)
     //是否使用 moralis sdk 进行查询
     var use_moralis_sdk = use_moralis_sdk_
     var temp_opts = { ...opts }
 
-    if (temp_opts.chain == utils.CHAIN_NAME.czz) {
+    if (temp_opts.chain != utils.CHAIN_NAME.bsc_mainnet && temp_opts.chain != utils.CHAIN_NAME.bsc_testnet) {
         use_moralis_sdk = 0;
     } else if (use_moralis_sdk == 0) {
         temp_opts.chain = convertChain(temp_opts.chain)
@@ -1664,7 +1683,7 @@ async function getBalances(opts, type, use_moralis_sdk_) {
     var use_moralis_sdk = use_moralis_sdk_
     var temp_opts = { ...opts }
 
-    if (temp_opts.chain == utils.CHAIN_NAME.czz) {
+    if (temp_opts.chain != utils.CHAIN_NAME.bsc_mainnet && temp_opts.chain != utils.CHAIN_NAME.bsc_testnet) {
         use_moralis_sdk = 0;
     } else if (use_moralis_sdk == 0) {
         temp_opts.chain = convertChain(temp_opts.chain)

+ 4 - 0
model/server_data_statistics.js

@@ -681,8 +681,12 @@ async function report2FeishuTable() {
         var data = await getStatisticsInfo();
         logger.info('getStatisticsInfo', data)
         var ret = await exec(data)
+<<<<<<< HEAD
         // logger.error('数据统计 end', JSON.stringify(data))
         return ret
+=======
+        logger.error('数据统计 end','https://st94nif1cq.feishu.cn/sheets/shtcnp6zbrsep1Sz3Cvk7NXRpDg?sheet=BMjMDr',JSON.stringify(data),JSON.stringify(ret))
+>>>>>>> opt-code-2
     } catch (error) {
         logger.error('report2FeishuTable', error.toString())
     }

+ 50 - 5
model/server_data_statisticsv2.js

@@ -308,6 +308,12 @@ async function getWithdrawOutInfoV2(startTime, endTime) {
         startTime = new Date(startTime).getTime()
         endTime = new Date(endTime).getTime()
     }
+
+    if (!startTime && endTime) {
+        startTime = 0
+        endTime = new Date(endTime).getTime()
+    }
+
     var withdraw_ret = await withdraw_db.getWidthdrawTotalFee(startTime, endTime)
 
     var withDrawInfos = []
@@ -516,7 +522,7 @@ async function getStatisticsInfoV2(day) {
     var rangeData = await getServerData(startTime, endTime)
     logger.info('getServerData rangeData', rangeData)
 
-    var allData = await getServerData(null, null)
+    var allData = await getServerData(null, endTime)
     // var allData = rangeData
     logger.info('getServerData allData', allData)
 
@@ -555,6 +561,27 @@ async function getStatisticsInfoV2(day) {
 
 
 
+const request = async (url, app_token, data) => {
+    logger.info('request', url, app_token, data)
+    return new Promise(resolve => {
+        axios.post(url,
+            JSON.stringify(data),
+            {
+                timeout: 1 * 60 * 1000,
+                headers: {
+                    'Content-Type': "application/json; charset=utf-8",
+                    'Authorization': 'Bearer ' + app_token
+                }
+            })
+            .then(res => {
+                console.log('res=>', res.status, res.data);
+                resolve(res.data)
+            }).catch(err => {
+                logger.error('error ', JSON.stringify(err));
+                resolve(JSON.stringify(err))
+            });
+    })
+}
 
 
 
@@ -789,13 +816,22 @@ async function addTableRows(app_token, sheetId, endIndex) {
     })
 }
 
-async function exec(data) {
-    var app = await getFeishuToken()
-
+async function exec(data, app) {
     await insertTableRows(app.app_access_token, 'BMjMDr', 2, 3)
     return await writeTable(app.app_access_token, data)
 }
 
+
+async function notify(app, chain_id) {
+    var content = "{\"zh_cn\":{\"title\":\"出入金数据更新成功\",\"content\":[[{\"tag\":\"text\",\"text\":\"更新时间:\"},{\"tag\":\"text\",\"text\":\"" + utils.getCurrentDate() + "\"}],[{\"tag\":\"text\",\"text\":\"https://st94nif1cq.feishu.cn/sheets/shtcnp6zbrsep1Sz3Cvk7NXRpDg?sheet=BMjMDr:\"}]]}}"
+    var data = {
+        "receive_id": chain_id,
+        "content": content,
+        "msg_type": "post"
+    }
+    await request('https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=chat_id', app.app_access_token, data)
+}
+
 async function report2FeishuTable(day) {
     try {
         logger.error('数据统计 start')
@@ -803,7 +839,9 @@ async function report2FeishuTable(day) {
         var data = await getStatisticsInfoV2(day);
         // data = ''
         logger.info('getStatisticsInfo', data)
-        var ret = await exec(data)
+        var app = await getFeishuToken()
+        var ret = await exec(data, app)
+        notify(app, 'oc_9770d283cd81df887e96795ddfcd9dcd')
         logger.error('数据统计完成:', 'https://st94nif1cq.feishu.cn/sheets/shtcnp6zbrsep1Sz3Cvk7NXRpDg?sheet=BMjMDr')
         mTokenPriceCache.clear()
     } catch (error) {
@@ -812,6 +850,11 @@ async function report2FeishuTable(day) {
 }
 
 
+async function testNotify() {
+    var app = await getFeishuToken()
+    notify(app, 'oc_b159b9a53dd52206c5cf75677d0cf0ca')
+}
+
 async function test() {
     // var ret = await getStatisticsInfoV2(2)
     // logger.debug('getStatisticsInfoV2', await getStatisticsInfoV2(2), mTokenPriceCache.size)
@@ -822,7 +865,9 @@ async function test() {
 }
 // test()
 // exec()
+// testNotify()
 module.exports = {
     report2FeishuTable
+
 }
 

+ 2 - 0
model/utils.js

@@ -154,11 +154,13 @@ function getRedisKeyFromChain(chain) {
         case CHAIN_NAME.kcc_testnet:
         case CHAIN_ID.kcc_mainnet:
         case CHAIN_ID.kcc_testnet:
+        case 'kcc':
             return '_KCC'
         case CHAIN_NAME.okc_mainnet:
         case CHAIN_NAME.okc_testnet:
         case CHAIN_ID.okc_mainnet:
         case CHAIN_ID.okc_testnet:
+        case 'okc':
             return '_OKC'
         default:
             return null

+ 198 - 21
routes/sdk.js

@@ -8,7 +8,7 @@ const redis = require("../model/db/redis_db")  //导入 db.js
 const withdraw_db = require("../model/db/withdraw_db")  //导入 db.js
 const report = require("../model/report")  //导入 db.js
 const BigNumber = require('bignumber.js')
-const czz = require('../model/czz')
+const czz = require('../model/http_withdraw')
 var remote_config_db = require("../model/db/remote_config_db");
 const account_mysql = require("../model/db/account_info_db")  //导入 db.js
 var collect_coins_db = require("../model/db/collect_coins_db");
@@ -102,6 +102,18 @@ async function getCollectCoinsHash(trx_hash) {
     return ' '
 }
 
+function isExistHash(trx_hash, arrs) {
+    if (arrs && Array.isArray(arrs) && arrs.length > 0) {
+        var ret = arrs.filter(element => {
+            return element.gas_trx_hash == trx_hash
+        })
+        logger.info('isExistHash', trx_hash, ret)
+        return ret == null ? false : ret.length > 0
+    } else {
+        return false
+    }
+}
+
 
 async function filterTransfers(result) {
     try {
@@ -109,12 +121,15 @@ async function filterTransfers(result) {
             var ret = JSON.parse(result)
             if (ret.code == 0 && ret.data.total > 0) {
                 var new_ret = []
+                var filter_list = await collect_coins_db.query_collect_hash_list()
                 for (let index = 0; index < ret.data.results.length; index++) {
                     const element = ret.data.results[index];
-                    if (element.trx_hash == await getCollectCoinsHash(element.trx_hash)) {
+                    // if (element.trx_hash == await getCollectCoinsHash(element.trx_hash)) {
+                    if (isExistHash(element.trx_hash, filter_list)) {
                         logger.debug('element.trx_hash == await getCollectCoinsHash(element.trx_hash)', element)
                     } else {
                         new_ret.push(element)
+                        logger.debug('element.trx_hash != await getCollectCoinsHash(element.trx_hash)', new_ret.length)
                     }
                 }
                 return {
@@ -226,6 +241,10 @@ async function check_czz_withdraw_task() {
                 continue
             }
 
+            if (!exec_obj.hash || !exec_obj.chain) {
+                logger.error('check_withdraw_status error:', JSON.stringify(exec_obj))
+                continue
+            }
             var obj = await czz.check_withdraw_status(exec_obj)
             if (obj.code == 0) {
                 var nonce = obj.data.nonce
@@ -409,7 +428,7 @@ async function withdraw_task() {
                         logger.error('withdraw_task exectransaction err', error.toString());
                     }
                     if (tryCount < 0) {
-                        logger.error('withdraw_task getTokenTransfersV2 警告交易未更新:', JSON.stringify(options));
+                        logger.error('withdraw_task getTokenTransfersV2 40s内 警告交易未更新:', JSON.stringify(options));
                     }
                 } while (tryCount >= 0);
             }
@@ -436,8 +455,7 @@ async function withdraw_task() {
                     try {
                         curGasPrice = BigNumber(obj.data.gasPrice.hex).toNumber()
                         curGasLimit = BigNumber(obj.data.gasLimit.hex).toNumber()
-                        //不是 czz chain
-                        if (obj.data.chainId != 2019) {
+                        if (!obj.data.value.number) {
                             value = BigNumber(obj.data.value.hex).toNumber()
                         } else {
                             value = obj.data.value.number
@@ -713,6 +731,20 @@ async function timer_collect_conis_bsc_task() {
     }
 }
 
+async function timer_collect_conis_task(chain, address) {
+    var index = 0
+    var delay = 60 * 1000 * 60
+    while (1) {
+        var temp_obj = {
+            "chain": chain,
+            "address": address,
+        }
+        redis.redis_push(reids_token_config.COLLECT_CONIS_QUEUE_KEY, JSON.stringify(temp_obj))
+        await utils.sleep(delay)
+        index += 1
+    }
+}
+
 async function timer_collect_conis_czz_task() {
     var index = 0
     var delay = 60 * 1000 * 60
@@ -727,18 +759,18 @@ async function timer_collect_conis_czz_task() {
     }
 }
 
-async function timer_transfer_bsc_task() {
+async function timer_transfer_task(obj_) {
     var index = 0
     var delay = 60 * 1000 * 60
     while (1) {
-        var obj_ = {
-            "type": "erc20",
-            "contractAddress": "0xFF94950Ee8A79c52cC4B0Aa5178C8cEa48A3F3A6",
-            "amount": "123000000000000000000",
-            "chain": "bsc_testnet",
-            "receiver": "0x3B525c35DdC323B08241493f148340D89e3A73a7",
-            "withdrawId": index.toString()
-        }
+        // var obj_ = {
+        //     "type": "erc20",
+        //     "contractAddress": "0xFF94950Ee8A79c52cC4B0Aa5178C8cEa48A3F3A6",
+        //     "amount": "123000000000000000000",
+        //     "chain": "bsc_testnet",
+        //     "receiver": "0x3B525c35DdC323B08241493f148340D89e3A73a7",
+        //     "withdrawId": index.toString()
+        // }
         obj_.withdraw_id = utils.getCurrentDateFormat('YYYY-MM-DD-HH:mm:ss:SSS').toString()
         var info = await moralis.queryCompanyInfoFromId(0);
         obj_.user_address = info.user_address
@@ -849,16 +881,161 @@ router.get('/report2FeishuTable', async (ctx) => {
 // 定时任务 提币+归集
 withdraw_task();
 collect_conis_task();
-//czz 504 检查
-check_czz_withdraw_task();
+// //czz 504 检查
+// check_czz_withdraw_task();
 // bsc 监控
-bsc_log_monitoring()
+// bsc_log_monitoring()
 
 if (process.env.NODE_ENV == 'dev' || process.env.NODE_ENV == 'test') {
-    timer_transfer_bsc_task()
-    timer_transfer_czz_task()
-    timer_collect_conis_bsc_task()
-    timer_collect_conis_czz_task()
+    /*** test */
+    //bsc
+    // timer_transfer_task({
+    //     "type": "erc20",
+    //     "contractAddress": "0xFF94950Ee8A79c52cC4B0Aa5178C8cEa48A3F3A6",
+    //     "amount": "123000000000000000000",
+    //     "chain": "bsc_testnet",
+    //     "receiver": "0x39ACD9CC975D792D8160215Dc84fa00E4934F076",
+    //     "withdrawId": 5
+    // })
+    // timer_transfer_task({
+    //     "type": "native",
+    //     "amount": "100000000000000000",
+    //     "chain": "bsc_testnet",
+    //     "receiver": "0x39ACD9CC975D792D8160215Dc84fa00E4934F076",
+    //     "withdrawId": 6
+    // })
+
+    //czz
+    // timer_transfer_task({
+    // "type": "erc20",
+    // "contractAddress": "0xfb16179d5e84b0e3e7524ed61a9cf7b98d039b20",
+    // "amount": "100000000000000000000",
+    // "chain": "czz",
+    //     "receiver": "0x39ACD9CC975D792D8160215Dc84fa00E4934F076",
+    //     "withdrawId": 5
+    // })
+    // timer_transfer_task({
+    //     "type": "native",
+    //     "amount": "100000000000000000",
+    //     "chain": "czz",
+    //     "receiver": "0x39ACD9CC975D792D8160215Dc84fa00E4934F076",
+    //     "withdrawId": 6
+    // })
+
+    //kcc
+    // timer_transfer_task({
+    //     "type": "erc20",
+    //     "contractAddress": "0x9984086cb9d93dbe47c4e70890aad5454bbc2518",
+    //     "amount": "1300000000000000000000",
+    //     "chain": "kcc_testnet",
+    //     "receiver": "0x39ACD9CC975D792D8160215Dc84fa00E4934F076",
+    //     "withdrawId": 1
+    // })
+    // timer_transfer_task({
+    //     "type": "native",
+    //     "amount": "110000000000000000",
+    //     "chain": "kcc_testnet",
+    //     "receiver": "0x39ACD9CC975D792D8160215Dc84fa00E4934F076",
+    //     "withdrawId": 2
+    // })
+
+    //okc
+    // timer_transfer_task({
+    //     "type": "erc20",
+    //     "contractAddress": "0xc2BaBFb3Bd1516D138B05c7c7e316f1648E90B7C",
+    //     "amount": "1200000000000000000000",
+    //     "chain": "okc_testnet",
+    //     "receiver": "0x39ACD9CC975D792D8160215Dc84fa00E4934F076",
+    //     "withdrawId": 3
+    // })
+    // timer_transfer_task({
+    //     "type": "native",
+    //     "amount": "100000000000000000",
+    //     "chain": "okc_testnet",
+    //     "receiver": "0x39ACD9CC975D792D8160215Dc84fa00E4934F076",
+    //     "withdrawId": 4
+    // })
+
+
+    /*** main */
+    //bsc
+    // timer_transfer_task({
+    //     "type": "erc20",
+    //     "contractAddress": "0x9984086CB9d93dbe47C4e70890aAD5454bBc2518",
+    //     "amount": "123000000000000000000",
+    //     "chain": "bsc_mainnet",
+    //     "receiver": "0x0001Df2b3c3cde767343e4e54Ab083e083CD1C50",
+    //     "withdrawId": 5
+    // })
+    // timer_transfer_task({
+    //     "type": "native",
+    //     "amount": "1000000000000000",
+    //     "chain": "bsc_mainnet",
+    //     "receiver": "0x0001Df2b3c3cde767343e4e54Ab083e083CD1C50",
+    //     "withdrawId": 6
+    // })
+
+    //czz
+    // timer_transfer_task({
+    //     "type": "erc20",
+    //     "contractAddress": "0xfb16179d5e84b0e3e7524ed61a9cf7b98d039b20",
+    //     "amount": "100000000000000000000",
+    //     "chain": "czz",
+    //     "receiver": "0x0001Df2b3c3cde767343e4e54Ab083e083CD1C50",
+    //     "withdrawId": 5
+    // })
+    // timer_transfer_task({
+    //     "type": "native",
+    //     "amount": "1000000000000000",
+    //     "chain": "czz",
+    //     "receiver": "0x0001Df2b3c3cde767343e4e54Ab083e083CD1C50",
+    //     "withdrawId": 6
+    // })
+
+    //kcc
+    // timer_transfer_task({
+    //     "type": "erc20",
+    //     "contractAddress": "0x9984086cb9d93dbe47c4e70890aad5454bbc2518",
+    //     "amount": "1300000000000000000000",
+    //     "chain": "kcc_mainnet",
+    //     "receiver": "0x0001Df2b3c3cde767343e4e54Ab083e083CD1C50",
+    //     "withdrawId": 1
+    // })
+    // timer_transfer_task({
+    //     "type": "native",
+    //     "amount": "110000000000000000",
+    //     "chain": "kcc_mainnet",
+    //     "receiver": "0x0001Df2b3c3cde767343e4e54Ab083e083CD1C50",
+    //     "withdrawId": 2
+    // })
+
+    //okc
+    // timer_transfer_task({
+    //     "type": "erc20",
+    //     "contractAddress": "0x9984086CB9d93dbe47C4e70890aAD5454bBc2518",
+    //     "amount": "1200000000000000000000",
+    //     "chain": "okc_mainnet",
+    //     "receiver": "0x0001Df2b3c3cde767343e4e54Ab083e083CD1C50",
+    //     "withdrawId": 3
+    // })
+    // timer_transfer_task({
+    //     "type": "native",
+    //     "amount": "100000000000000000",
+    //     "chain": "okc_mainnet",
+    //     "receiver": "0x0001Df2b3c3cde767343e4e54Ab083e083CD1C50",
+    //     "withdrawId": 4
+    // })
+
+
+
+    // timer_collect_conis_task('okc_testnet','0x39ACD9CC975D792D8160215Dc84fa00E4934F076')
+    // timer_collect_conis_task('kcc_testnet','0x39ACD9CC975D792D8160215Dc84fa00E4934F076')
+    // timer_collect_conis_task('bsc_testnet','0x39ACD9CC975D792D8160215Dc84fa00E4934F076')
+    // timer_collect_conis_task('czz','0x39ACD9CC975D792D8160215Dc84fa00E4934F076')
+
+    // timer_collect_conis_task('okc_testnet','0x0001Df2b3c3cde767343e4e54Ab083e083CD1C50')
+    // timer_collect_conis_task('kcc_mainnet','0x0001Df2b3c3cde767343e4e54Ab083e083CD1C50')
+    // timer_collect_conis_task('bsc_testnet','0x0001Df2b3c3cde767343e4e54Ab083e083CD1C50')
 }
 
 module.exports = router

+ 1 - 1
test/withdraw_czz.js

@@ -1,4 +1,4 @@
-const withdraw_test = require('../model/czz')
+const withdraw_test = require('../model/http_withdraw')
 const router = require('koa-router')() //导入 koa-router