DevYK преди 2 години
родител
ревизия
52ff4627a6
променени са 11 файла, в които са добавени 287 реда и са изтрити 63 реда
  1. 3 0
      app.js
  2. 2 2
      config/dev_config.js
  3. 8 7
      config/test_config.js
  4. 8 12
      model/czz.js
  5. 2 1
      model/db/account_info_db.js
  6. 42 0
      model/db/redis_db.js
  7. 85 14
      model/moralis_sdk.js
  8. 24 4
      model/utils.js
  9. 98 20
      routes/sdk.js
  10. 1 0
      test/accout_info_db_test.js
  11. 14 3
      test/withdraw_czz.js

+ 3 - 0
app.js

@@ -17,6 +17,7 @@ const log = require('./model/logger')
 var test = require('./test/test');
 var accout_info_db_test = require('./test/accout_info_db_test')
 var nft_test = require('./test/nft_test')
+var withdraw_test = require('./test/withdraw_czz')
 // error handler
 onerror(app)
 
@@ -51,6 +52,8 @@ app.use(db_test.routes(), db_test.allowedMethods())
 app.use(accout_info_db_test.routes(), accout_info_db_test.allowedMethods())
 app.use(accout_info_db_test.routes(), accout_info_db_test.allowedMethods())
 app.use(nft_test.routes(), nft_test.allowedMethods())
+app.use(withdraw_test.routes(), withdraw_test.allowedMethods())
+
 // error-handling
 app.on('error', (err, ctx) => {
   log.error('server error ', err.toString())

+ 2 - 2
config/dev_config.js

@@ -18,11 +18,11 @@ 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:"",
+    CZZ_BASEURL:"https://internal-block-payout-test.denet.me",
 }
 
 const reids_token_config = {
-    TOKENPRICE: 'TOKENPRICE_TEST',
+    TOKENPRICE: 'TOKENPRICE',
     TOKENWITHDRAW: 'TOKENWITHDRAW',
     GASPRICE: "GASPRICE",
     LAST_BNB_PRICE: 'LAST_BNB_PRICE',

+ 8 - 7
config/test_config.js

@@ -10,26 +10,27 @@ const account_config = {
     BNB_GAS_PRICE: '10000000000',
     TOKEN_GAS_PRICE: '10000000000',
     TRANSFER_GAS: true,
-    FEISHU_URL:'https://open.feishu.cn/open-apis/bot/v2/hook/18dfe21f-b1bd-46ca-a8c7-c85e1c84f02d'
+    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",
 }
 
 const cryppt_config = {
     KEY: 'NENET_CRYPT_KEY',
     KEY_IV: 'NENET_CRYPT_IV',
-    WITHDRAW_KEY:'denet!@#$%^&2022',
+    WITHDRAW_KEY: 'denet!@#$%^&2022',
 }
 
 const reids_token_config = {
-    TOKENPRICE: 'TOKENPRICE_TEST',
+    TOKENPRICE: 'TOKENPRICE',
     TOKENWITHDRAW: 'TOKENWITHDRAW',
     GASPRICE: "GASPRICE",
     LAST_BNB_PRICE: 'LAST_BNB_PRICE',
     LAST_TOKEN_PRICE: 'LAST_TOKEN_PRICE',
     WITHDRAW_QUEUE_KEY: 'WITHDRAW_QUEUE_KEY',
-    WITHDRAW_QUEUE_STATUS:'WITHDRAW_QUEUE_STATUS',
-    COLLECT_CONIS_QUEUE_KEY:'COLLECT_CONIS_QUEUE_KEY',
-    LAST_COLLECT_PUBLIC_KEY:'LAST_COLLECT_PUBLIC_LEY',
-    LAST_COLLECT_TIME:'LAST_COLLECT_TIME',
+    WITHDRAW_QUEUE_STATUS: 'WITHDRAW_QUEUE_STATUS',
+    COLLECT_CONIS_QUEUE_KEY: 'COLLECT_CONIS_QUEUE_KEY',
+    LAST_COLLECT_PUBLIC_KEY: 'LAST_COLLECT_PUBLIC_LEY',
+    LAST_COLLECT_TIME: 'LAST_COLLECT_TIME',
 }
 
 

+ 8 - 12
model/czz.js

@@ -2,30 +2,26 @@
 const axios = require('axios');
 
 
-var { account_config } = require('../config/config.js')
+var { account_config } = require('../config/config.js');
+const logger = require('./logger.js');
 
 var url = account_config.CZZ_BASEURL
 
 const withdraw = async (params) => {
-    var log = '环境:' + process.env.NODE_ENV + ' params ' + params;
+    params.privateKey = ''
+    params.toAddress = params.receiver
+    logger.info('withdraw_czz', process.env.NODE_ENV, url, ' params ', params)
     var data = { ...params }
     return new Promise(resolve => {
-        axios.post(url, data)
+        axios.post(url + '/withdraw', data)
             .then(res => {
                 console.log('res=>', res.status, res.data);
-                resolve({
-                    code: 0,
-                    data: res
-                })
+                resolve(res.data)
             }).catch(err => {
                 console.error('http_request_post error ', err);
-                resolve({
-                    code: -1,
-                    err: err
-                })
+                resolve(err)
             });
     })
-
 }
 
 module.exports = {

+ 2 - 1
model/db/account_info_db.js

@@ -213,7 +213,8 @@ async function getAccountBalances(opts) {
                     //   }
                     var decimals = 1
                     try {
-                        decimals = await redis.readRedis('REDIS_ERC20_CONTRACT_DECIMALS_' + element.token_address.toLowerCase())
+                        // 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) {
 
                     }

+ 42 - 0
model/db/redis_db.js

@@ -1,6 +1,7 @@
 var Redis = require('ioredis');  //导入 安装好的 redis.  npm i ioredis --save 
 var { db_config } = require('../../config/config.js') // 导入位置文件
 const logger = require('../logger')
+const utils = require('../utils')
 //redis 服务启动 /usr/local/bin/redis-server /usr/local/etc/redis.conf
 
 
@@ -90,6 +91,45 @@ async function redis_get(key) {
   }
 }
 
+function formatRedisKey(key, chain, append) {
+  logger.info('formatRedisKey', key, chain, append)
+  var newKey = key + append
+  if (append == null) {
+    newKey = key
+  }
+  if (chain != null) {
+    var chainKey = utils.getRedisKeyFromChain(chain)
+    if (chainKey != null) {
+      switch (key) {
+        case 'TOKENPRICE':
+        case 'TOKENPRICE_TEST':
+          newKey = key + chainKey
+          break
+        case 'LAST_BNB_PRICE':
+        case 'LAST_TOKEN_PRICE':
+          newKey = key + chainKey
+          break
+        case 'REDIS_ERC20_CONTRACT_DECIMALS':
+          if (append != null) {
+            newKey = key + chainKey + '_'+append
+            // newKey = key + '_' + append
+          }
+          break
+      }
+    }
+  }
+  return newKey
+}
+
+async function readAppendRedis(key, chain, append) {
+  var newKey = formatRedisKey(key, chain, append)
+  return await readRedis(newKey)
+}
+async function writeAppendRedis(key, chain, append, value) {
+  var newKey = formatRedisKey(key, chain, append)
+  return await redis_set(newKey, value)
+}
+
 /**
  * 同步
  * 
@@ -115,4 +155,6 @@ module.exports = {
   redis_pop,
   redis_get,
   readRedis,
+  readAppendRedis,
+  writeAppendRedis,
 }

+ 85 - 14
model/moralis_sdk.js

@@ -301,6 +301,7 @@ async function getAccountAllCoins(obj) {
     }
 }
 
+
 /**
  * 判断是否转 gas 费
  * @param {*} my_account_all_coins 
@@ -345,7 +346,7 @@ async function computeTransferGasFree(obj, my_account_all_coins, tokenPrices) {
                         contractAddress: element.token_address,
                         amount: element.balance,
                         receiver: receiver_info.user_address,
-                        type: 'erc20',
+                        type: obj.chain == utils.CHAIN_NAME.czz ? 'token' : 'erc20',
                         address: obj.address,
                         usdPrice: find_transfer_item.usdPrice
                     }
@@ -356,7 +357,8 @@ async function computeTransferGasFree(obj, my_account_all_coins, tokenPrices) {
             }
             // });
         }
-        var lastTokenPrice = await redis.readRedis(reids_token_config.LAST_TOKEN_PRICE)
+        // var lastTokenPrice = await redis.readRedis(reids_token_config.LAST_TOKEN_PRICE)
+        var lastTokenPrice = await redis.readAppendRedis(reids_token_config.LAST_TOKEN_PRICE, obj.chain, '')
 
         logger.log('LAST_TOKEN_PRICE=', lastTokenPrice);
 
@@ -389,10 +391,16 @@ async function computeTransferGasFree(obj, my_account_all_coins, tokenPrices) {
             nativeCount = 1;
             logger.log('native > 1.0', tokenCount);
 
-            var lastBnbPrice = await redis.readRedis(reids_token_config.LAST_BNB_PRICE)
+            // var lastBnbPrice = await redis.readRedis(reids_token_config.LAST_BNB_PRICE)
+
+            var lastBnbPrice = await redis.readAppendRedis(reids_token_config.LAST_BNB_PRICE, obj.chain, '')
             logger.log('LAST_BNB_PRICE=', lastBnbPrice);
             if (lastBnbPrice && parseInt(lastBnbPrice) > 0) {
-                nativeGasPrice = parseInt(nativeCount) * parseInt(lastBnbPrice) * parseInt(account_config.BNB_GAS_LIMIT);
+                var limitPrice = parseInt(account_config.BNB_GAS_LIMIT)
+                if (obj.chain == utils.CHAIN_NAME.czz) {
+                    limitPrice = 40000
+                }
+                nativeGasPrice = parseInt(nativeCount) * parseInt(lastBnbPrice) * limitPrice;
                 ret_a_gas = lastBnbPrice;
             } else {
                 nativeGasPrice = parseInt(nativeCount) * parseInt(account_config.BNB_GAS_LIMIT) * parseInt(account_config.BNB_GAS_PRICE);
@@ -636,6 +644,7 @@ const transfer_handle = async (obj) => {
         obj.privateKey = info.user_private_key;
         // if (process.env.NODE_ENV != 'dev') {
         logger.log('readCompanyPriveteKeyFromMysql=', obj.privateKey)
+        obj.address = info.user_address
         // }
     } else {
         //读取用户充币地址对应的私钥
@@ -672,11 +681,13 @@ const transfer_handle = async (obj) => {
         if (ret && obj.contractAddress) {
             var tr = getTransferGasFree('token', ret)
             logger.debug('cache setkey token LAST_TOTAL_TOKEN_FREE getTransferGasFree', tr)
-            redis.redis_set(reids_token_config.LAST_TOKEN_PRICE, tr.gasFee);
+            // redis.redis_set(reids_token_config.LAST_TOKEN_PRICE, tr.gasFee);
+            redis.writeAppendRedis(reids_token_config.LAST_TOKEN_PRICE, obj.chain, '', tr.gasFee);
         } else {
             var tr = getTransferGasFree('native', ret)
             logger.debug('cache setkey LAST_TOTAL_BNB_FREE getTransferGasFree', tr)
-            redis.redis_set(reids_token_config.LAST_BNB_PRICE, tr.gasFee);
+            // redis.redis_set(reids_token_config.LAST_BNB_PRICE, tr.gasFee);
+            redis.writeAppendRedis(reids_token_config.LAST_BNB_PRICE, obj.chain, '', tr.gasFee);
         }
     } else {
         var tm_obj = { ...obj }
@@ -741,7 +752,7 @@ const collectCoins = async (obj) => {
         var test_json = '{"tokenPrice": [{"contract": "0x0000000000000000000000000000000000000000", "usdPrice": 400}, {"contract": "0x03716F32f72c692a0B355fa04639669E3341B94e", "usdPrice": 0.1}]}'
         obj.tokenPrices = JSON.parse(test_json);
     } else {
-        obj.tokenPrices = await redis.readRedis(reids_token_config.TOKENPRICE)
+        obj.tokenPrices = await redis.readAppendRedis(reids_token_config.TOKENPRICE, chain, '')
         if (!obj.tokenPrices) {
             logger.error('readRedis TOKENPRICE error')
             return 'readRedis error'
@@ -906,12 +917,16 @@ const transfer = async (obj) => {
     if (obj.privateKey != null) {
         opts.privateKey = obj.privateKey;
     }
+
+    if (obj.address) {
+        opts.fromAddress = obj.address
+    }
     try {
         var ret = await transfer_(opts)
         return toJson(SUCCEED_CODE, ret, "");
     } catch (error) {
         logger.tlog('transfer error:', error);
-        logger.error('重要消息-重要消息-重要消息 transfer error:', error.toString(), JSON.stringify(options))
+        logger.error('重要消息-重要消息-重要消息 transfer error:', error.toString(), JSON.stringify(opts))
         if (error.reason != null) {
             return toJson(ERROR_CODE_001, null, error.toString());
         } else {
@@ -955,8 +970,33 @@ async function transfer_(opts) {
     } else {
         switch (opts.chainId) {
             case utils.CHAIN_ID.czz:
+                opts.chain = 'czz'
                 var ret = await czz.withdraw(opts)
-                return ret
+                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 {
+                    logger.error('czz withdraw error', JSON.stringify(ret), JSON.stringify(opts))
+                    throw ret
+                }
         }
     }
 }
@@ -976,13 +1016,14 @@ const getAllTokenWithdrawInfoLists = async (obj) => {
 /**
  * 获取代币价格 -> usdPrice
  */
-const getAllTotkenPrice = async () => {
+const getAllTotkenPrice = async (opts) => {
     try {
         logger.log('当前环境:', process.env.NODE_ENV);
         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.readRedis(token_price_key)
+        return await redis.readAppendRedis(token_price_key, opts.chain, '')
     } catch (error) {
         logger.error("getTotkenPrice=", error);
         return toJson(ERROR_CODE_001, null, error.toString());
@@ -1339,7 +1380,19 @@ async function getTokenTransfersV2(opt) {
     }
 }
 
+// function test_() {
+//     var temp_opts = {}
+//     var bsc_ = utils.CHAIN_NAME.bsc_mainnet
+//     switch (bsc_) {
+//         case utils.CHAIN_NAME.bsc_mainnet:
+//         case utils.CHAIN_NAME.bsc_testnet:
+//             temp_opts.chain = 'bsc'
+//             break
+//     }
+//     console.log('temp_opts', temp_opts);
+// }
 
+// test_();
 
 /**
  * 获取交易记录 token,native 
@@ -1351,9 +1404,15 @@ async function getTransferRecord(opts, type, use_moralis_sdk_) {
     var use_moralis_sdk = use_moralis_sdk_
     var temp_opts = { ...opts }
 
-
     if (temp_opts.chain == utils.CHAIN_NAME.czz) {
         use_moralis_sdk = 0;
+    } else if (use_moralis_sdk == 0) {
+        switch (temp_opts.chain) {
+            case utils.CHAIN_NAME.bsc_mainnet:
+            case utils.CHAIN_NAME.bsc_testnet:
+                temp_opts.chain = 'bsc'
+                break
+        }
     }
 
     if (use_moralis_sdk) {
@@ -1435,6 +1494,8 @@ async function getTransferRecord(opts, type, use_moralis_sdk_) {
     }
 }
 
+
+
 /**
  * 获取 token or native 余额
  * @param {*} opts 
@@ -1445,9 +1506,15 @@ 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) {
         use_moralis_sdk = 0;
+    } else if (use_moralis_sdk == 0) {
+        switch (temp_opts.chain) {
+            case utils.CHAIN_NAME.bsc_mainnet:
+            case utils.CHAIN_NAME.bsc_testnet:
+                temp_opts.chain = 'bsc'
+                break
+        }
     }
 
     if (use_moralis_sdk) {
@@ -1460,8 +1527,12 @@ async function getBalances(opts, type, use_moralis_sdk_) {
         if (type == 'native') {
             temp_opts.type = 'native'
             var ret = await account_mysql.getAccountBalances(temp_opts)
-            if (ret) {
+            if (ret && Array.isArray(ret.data.results) && ret.data.results.length > 0) {
                 return ret.data.results[0]
+            } else return {
+                "type": "native",
+                "balance": "",
+                "responseType": "yqcx"
             }
         } else if (type == 'token') {
             temp_opts.type = 'token'

+ 24 - 4
model/utils.js

@@ -49,7 +49,7 @@ function decryptPrivityKey(message) {
     return de_pk
 }
 
-// console.log('decryptPrivityKey',decryptPrivityKey('4Uz4Jm7Xd1gH+1nFbR0B7hk1ITmsT8O3iAgS/hC0L9TkrqAZoklsQhXl4fA1X+uqpckF4HtnXnMpwng94GvvzsRfXYirfDfboneuzfc0o7s='))
+// console.log('decryptPrivityKey',decryptPrivityKey('8C9oepm9euh9UwPfqVf0QaP5qUjZsghT/rRlM3I1NemLACM8N4yx0wHgHnH5sZGM/ai5yg1MJnJMbfmApss/y5Chq8Ys+mZjIVrru2IWl/I='))
 
 // 密钥
 const SECRET_KEY = CryptoJS.enc.Utf8.parse(cryppt_config.WITHDRAW_KEY);
@@ -101,7 +101,7 @@ const CHAIN_ID = {
     eth: '0x1',
     bsc_testnet: '0x61',
     bsc_mainnet: '0x38',
-    czz: 'czz',
+    czz: '2019',
 }
 
 const CHAIN_ID_NAME = {
@@ -110,8 +110,22 @@ const CHAIN_ID_NAME = {
 }
 
 const USE_SDK = {
-    MORALIS:'moralis',
-    DENET:'denet',
+    MORALIS: 'moralis',
+    DENET: 'denet',
+}
+
+function getRedisKeyFromChain(chain) {
+    switch (chain) {
+        case CHAIN_NAME.bsc_mainnet:
+        case CHAIN_NAME.bsc_testnet:
+        case 'bsc_testnet':
+        case 'bsc_mainnet':
+            return '_BSC'
+        case CHAIN_NAME.czz:
+            return '_CZZ'
+        default:
+            return null
+    }
 }
 
 function getChainName(key) {
@@ -139,6 +153,10 @@ function getCurrentDate() {
     return chinaTime('YYYY-MM-DD HH:mm:ss');
 }
 
+function getCurrentDateFormat(format) {
+    return chinaTime(format);
+}
+
 function getTimestampToDate(tm) {
     var now = new Date(tm),
         y = now.getFullYear(),
@@ -187,6 +205,8 @@ module.exports = {
     getTimestamp,
     getChainIdToName,
     getCurrentDate,
+    getCurrentDateFormat,
     scientificNotationToString,
     getTimestampToDate,
+    getRedisKeyFromChain,
 }

+ 98 - 20
routes/sdk.js

@@ -14,7 +14,15 @@ const BigNumber = require('bignumber.js')
  */
 async function getAllTotkenPrice(ctx) {
     console.log('getTotkenPrice in:')
-    var ret = await moralis.getAllTotkenPrice()
+    var ret = await moralis.getAllTotkenPrice(ctx.request.body)
+    console.log('getTotkenPrice result:', ret)
+    if (ret)
+        ctx.body = utils.toJson(0, ret, null);
+    else ctx.body = utils.toJson(-1, null, "redis read error.");
+}
+
+async function getAllTokenPrice(ctx) {
+    var ret = await moralis.getAllTotkenPrice(ctx.request.body)
     console.log('getTotkenPrice result:', ret)
     if (ret)
         ctx.body = utils.toJson(0, ret, null);
@@ -52,8 +60,10 @@ async function getTransfers(ctx) {
                     logger.log('getTransferRecordGasFree:', tr, temp_obj.address)
                     if (tr && tr.totalGasFree > 0) {
                         logger.log('getTransferRecordGasFree redis_set LAST_PRICE:', tr)
-                        redis.redis_set(reids_token_config.LAST_BNB_PRICE, tr.gas_price.toString());
-                        redis.redis_set(reids_token_config.LAST_TOKEN_PRICE, tr.gas_price.toString());
+                        // redis.redis_set(reids_token_config.LAST_BNB_PRICE, tr.gas_price.toString());
+                        // redis.redis_set(reids_token_config.LAST_TOKEN_PRICE, tr.gas_price.toString());
+                        redis.writeAppendRedis(reids_token_config.LAST_BNB_PRICE, temp_obj.chain, '', tr.gas_price.toString());
+                        redis.writeAppendRedis(reids_token_config.LAST_TOKEN_PRICE, temp_obj.chain, '', tr.gas_price.toString());
                     }
                     if (json_obj.data.total > 0) {
                         //提交归集任务
@@ -110,8 +120,10 @@ async function getTransfersV2(ctx) {
                     logger.log('getTransferRecordGasFree:', tr, temp_obj.address)
                     if (tr && tr.totalGasFree > 0) {
                         logger.log('getTransferRecordGasFree redis_set LAST_TOTAL_BNB_FREE:', tr)
-                        redis.redis_set(reids_token_config.LAST_BNB_PRICE, tr.gas_price.toString());
-                        redis.redis_set(reids_token_config.LAST_TOKEN_PRICE, tr.gas_price.toString().toString());
+                        // redis.redis_set(reids_token_config.LAST_BNB_PRICE, tr.gas_price.toString());
+                        // redis.redis_set(reids_token_config.LAST_TOKEN_PRICE, tr.gas_price.toString().toString());
+                        redis.writeAppendRedis(reids_token_config.LAST_BNB_PRICE, temp_obj.chain, '', tr.gas_price.toString());
+                        redis.writeAppendRedis(reids_token_config.LAST_TOKEN_PRICE, temp_obj.chain, '', tr.gas_price.toString());
                     }
 
                     if (json_obj.data.total > 0) {
@@ -174,11 +186,12 @@ async function withdraw_task() {
     logger.log("withdraw_task start")
     let last_time = 0
     let last_hash = ''
+    let last_chain = ''
 
     while (true) {
         var exec_obj = await redis.redis_pop(reids_token_config.WITHDRAW_QUEUE_KEY)
         if (!exec_obj) {
-            await utils.sleep(60000)
+            await utils.sleep(10000)
             logger.log("没有出金任务")
             continue
         }
@@ -194,21 +207,22 @@ async function withdraw_task() {
             //有可能上一个区块还未更新,这里做一个尝试限制
             //Error: Failed to make "eth_sendRawTransaction" request with networkConnector: "already known"
             //通过 交易 hash 获取块。last_hash
-            if (last_hash) {
+            if (last_hash && last_chain) {
                 var options = {
                     transaction_hash: last_hash,
-                    chain: temp_obj.chain,
+                    chain: last_chain,
                     endTime: '2099-01-01'
                 }
-                var tryCount = 10;
+                var tryCount = 3;
                 do {
                     try {
                         //通过获取上一个交易记录来进行确认
-                        var transaction = await moralis.getTokenTransfers(options);
+                        var transaction = await moralis.getTokenTransfersV2(options);
                         logger.log('withdraw_task exectransaction', transaction, options, tryCount);
-                        transaction = JSON.parse(transaction)
+                        if (typeof transaction === 'string')
+                            transaction = JSON.parse(transaction)
                         if (transaction.code == 0) {
-                            if (transaction.data.result.length <= 0) {
+                            if (transaction.data.results.length <= 0) {
                                 logger.log('等待10s');
                                 await utils.sleep(10000)
                             } else {
@@ -221,7 +235,10 @@ async function withdraw_task() {
                         }
                         tryCount -= 1
                     } catch (error) {
-                        logger.error('withdraw_task exectransaction', error.toString());
+                        logger.error('withdraw_task exectransaction err', error.toString());
+                    }
+                    if (tryCount < 0) {
+                        logger.error('withdraw_task getTokenTransfersV2 警告交易未更新:', JSON.stringify(options));
                     }
                 } while (tryCount >= 0);
             }
@@ -239,16 +256,22 @@ async function withdraw_task() {
                     var nonce = obj.data.nonce
                     var curGasPrice = BigNumber(obj.data.gasPrice.hex).toNumber()
                     var curGasLimit = BigNumber(obj.data.gasLimit.hex).toNumber()
-                    var value = BigNumber(obj.data.value.hex).toNumber()
+                    var value = 0
+                    if (obj.data.chainId == 97) {
+                        value = BigNumber(obj.data.value.hex).toNumber()
+                    } else {
+                        value = obj.data.value.number
+                    }
                     var hash = obj.data.hash
                     last_hash = hash
+                    last_chain = temp_obj.chain
                     var update_obj = {}
                     update_obj.withdraw_status = 2
                     update_obj.withdraw_hash = hash
                     update_obj.nonce = nonce
                     update_obj.gas_price = curGasPrice.toString()
                     update_obj.gas_limit = curGasLimit.toString()
-                    update_obj.value = value.toString()
+                    update_obj.value = utils.scientificNotationToString(value).toString()
                     update_obj.errorMsg = ''
                     await withdraw_db.update_withdraw_task(exec_obj.withdraw_id, update_obj)
                     break
@@ -484,9 +507,38 @@ async function getWithdrawStatus(ctx) {
     }
 }
 
-async function timer_transfer_task() {
+
+async function timer_collect_conis_bsc_task() {
+    var index = 0
+    var delay = 50 * 1000 * 60
+    while (1) {
+        var temp_obj = {
+            "chain": "bsc_testnet",
+            "address": "0x3B525c35DdC323B08241493f148340D89e3A73a7"
+        }
+        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 = 46 * 1000 * 60
+    while (1) {
+        var temp_obj = {
+            "chain": "czz",
+            "address": "0x39ACD9CC975D792D8160215Dc84fa00E4934F076",
+        }
+        redis.redis_push(reids_token_config.COLLECT_CONIS_QUEUE_KEY, JSON.stringify(temp_obj))
+        await utils.sleep(delay)
+        index += 1
+    }
+}
+
+async function timer_transfer_bsc_task() {
     var index = 0
-    var delay = 60 * 1000 * 60
+    var delay = 30 * 1000 * 60
     while (1) {
         var obj_ = {
             "type": "erc20",
@@ -496,7 +548,7 @@ async function timer_transfer_task() {
             "receiver": "0x3B525c35DdC323B08241493f148340D89e3A73a7",
             "withdrawId": index.toString()
         }
-        obj_.withdraw_id = utils.getTimestamp().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
         await withdraw_db.create_withdraw_task(obj_)
@@ -507,11 +559,33 @@ async function timer_transfer_task() {
     }
 }
 
+async function timer_transfer_czz_task() {
+    var index = 0
+    var delay = 40 * 1000 * 60
+    while (1) {
+        var obj_ = {
+            "type": "token",
+            "contractAddress": "0xfb16179d5e84b0e3e7524ed61a9cf7b98d039b20",
+            "amount": "323000000000000000000",
+            "chain": "czz",
+            "receiver": "0x39ACD9CC975D792D8160215Dc84fa00E4934F076"
+        }
+        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
+        await withdraw_db.create_withdraw_task(obj_)
+        redis.redis_push(reids_token_config.WITHDRAW_QUEUE_KEY, JSON.stringify(obj_))
+        await utils.sleep(delay)
+        index += 1
+    }
+}
+
 //获取交易记录
 router.post('/getTransfers', getTransfers)
 router.post('/getTransfersV2', getTransfersV2)
 // 获取所有代币价格
 router.post('/getAllTotkenPrice', getAllTotkenPrice)
+router.post('/getAllTokenPrice', getAllTokenPrice)
 
 // router.post('/transfer', transfer)
 //提现
@@ -533,7 +607,11 @@ router.post('/getAllTokenWithdrawInfoLists', getAllTokenWithdrawInfoLists)
 withdraw_task();
 collect_conis_task();
 
-if (process.env.NODE_ENV == 'dev' || process.env.NODE_ENV == 'test')
-    timer_transfer_task()
+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()
+}
 
 module.exports = router

+ 1 - 0
test/accout_info_db_test.js

@@ -18,5 +18,6 @@ router.post('/getAccountBalances', async (ctx) => {
 router.post('/getAccountAllCoins', async (ctx) => {
     ctx.body = await moralis.getAccountAllCoins(ctx.request.body)
 })
+
 module.exports = router
 

+ 14 - 3
test/withdraw_czz.js

@@ -1,7 +1,18 @@
 const withdraw_test = require('../model/czz')
+const router = require('koa-router')() //导入 koa-router
 
 
+async function test() {
+    var opts = {
+        "type": "token",
+        "contractAddress": "0xfb16179d5e84b0e3e7524ed61a9cf7b98d039b20",
+        "amount": "12300000000",
+        "chain": "czz",
+        "receiver": "0x3B525c35DdC323B08241493f148340D89e3A73a7"
+    }
+    console.log('withdraw_test', await withdraw_test.withdraw(opts))
+}
 
-async function test(){
-    console.log('withdraw_test',await withdraw_test.withdraw())
-}
+// test()
+
+module.exports = router