Przeglądaj źródła

交易记录默认添加一个截止时间

DevYK 3 lat temu
rodzic
commit
aa18c099d2

+ 4 - 1
config/dev_config.js

@@ -1,7 +1,7 @@
 const cryppt_config = {
     KEY: 'NENET_CRYPT_KEY',
     KEY_IV: 'NENET_CRYPT_IV',
-    WITHDRAW_KEY:'denet!@#$%^&2022',
+    WITHDRAW_KEY: 'denet!@#$%^&2022',
 }
 
 
@@ -25,6 +25,9 @@ const reids_token_config = {
     LAST_TOTAL_BNB_FREE: 'LAST_TOTAL_BNB_FREE',
     LAST_TOTAL_TOKEN_FREE: 'LAST_TOTAL_TOKEN_FREE',
     LAST_GAS_PRICE: 'LAST_TOKEN_GAS_PRICE',
+    WITHDRAW_QUEUE_KEY: 'WITHDRAW_QUEUE_KEY',
+    WITHDRAW_QUEUE_STATUS:'WITHDRAW_QUEUE_STATUS',
+
 }
 
 // http 埋点上报配置

+ 3 - 0
config/prd_config.js

@@ -24,6 +24,9 @@ const reids_token_config = {
     LAST_TOTAL_BNB_FREE: 'LAST_TOTAL_BNB_FREE',
     LAST_TOTAL_TOKEN_FREE: 'LAST_TOTAL_TOKEN_FREE',
     LAST_GAS_PRICE: 'LAST_TOKEN_GAS_PRICE',
+    WITHDRAW_QUEUE_KEY: 'WITHDRAW_QUEUE_KEY',
+    WITHDRAW_QUEUE_STATUS:'WITHDRAW_QUEUE_STATUS',
+    
 
 }
 

+ 2 - 0
config/test_config.js

@@ -24,6 +24,8 @@ const reids_token_config = {
     LAST_TOTAL_BNB_FREE: 'LAST_TOTAL_BNB_FREE',
     LAST_TOTAL_TOKEN_FREE: 'LAST_TOTAL_TOKEN_FREE',
     LAST_GAS_PRICE: 'LAST_TOKEN_GAS_PRICE',
+    WITHDRAW_QUEUE_KEY: 'WITHDRAW_QUEUE_KEY',
+    WITHDRAW_QUEUE_STATUS:'WITHDRAW_QUEUE_STATUS',
 }
 
 

+ 0 - 0
model/core/moralis_core.js


+ 6 - 3
model/mysql_db.js → model/db/mysql_db.js

@@ -4,9 +4,9 @@
 //https://github.com/mysqljs/mysql
 
 var mysql = require('mysql');
-var { db_config } = require('../config/config.js')
-const logger = require('./logger')
-const utils = require('./utils.js')
+var { db_config } = require('../../config/config.js')
+const logger = require('../logger')
+const utils = require('../utils.js')
 var port = db_config.mysql.PORT
 var host = db_config.mysql.HOST
 var username = db_config.mysql.USERNAME
@@ -301,8 +301,11 @@ function queryAllUserPrivateKeyAndUserAddress() {
 //查询语句
 //SELECT * FROM user_key_manage WHERE user_address='0x049D33EEE7432DB14c50911fAE4a7C38624313aA'
 
+
+
 module.exports = {
     queryUserPrivateKeyFromUserAddress,
     queryAllUserPrivateKeyAndUserAddress,
     queryCompanyInfoFromId,
+    getMySqlInstance,
 };

+ 26 - 4
model/redis_db.js → model/db/redis_db.js

@@ -1,6 +1,6 @@
 var Redis = require('ioredis');  //导入 安装好的 redis.  npm i ioredis --save 
-var { db_config } = require('../config/config.js') // 导入位置文件
-const logger = require('./logger')
+var { db_config } = require('../../config/config.js') // 导入位置文件
+const logger = require('../logger')
 //redis 服务启动 /usr/local/bin/redis-server /usr/local/etc/redis.conf
 
 
@@ -51,11 +51,31 @@ REDIS_INSTANCE.on('error', function (err) {
 });
 
 function redis_set(key, value) {
-  logger.log("redis set=", key,value);
+  logger.log("redis set=", key, value);
   try {
     REDIS_INSTANCE.set(key, value);
   } catch (error) {
-    logger.error('redis_set error:', key,value, error)
+    logger.error('redis_set error:', key, value, error)
+    return null;
+  }
+}
+
+function redis_push(key, value) {
+  logger.log("redis_push=", key, value);
+  try {
+    REDIS_INSTANCE.rpush(key, value);
+  } catch (error) {
+    logger.error('redis_push error:', key, value, error)
+    return null;
+  }
+}
+
+function redis_pop(key) {
+  logger.log("redis_pop=", key);
+  try {
+    return REDIS_INSTANCE.lpop(key);
+  } catch (error) {
+    logger.error('redis_pop error:', key, error)
     return null;
   }
 }
@@ -91,6 +111,8 @@ async function readRedis(key) {
 
 module.exports = {
   redis_set,
+  redis_push,
+  redis_pop,
   redis_get,
   readRedis,
 }

+ 219 - 0
model/db/withdraw_db.js

@@ -0,0 +1,219 @@
+
+const mysql = require("./mysql_db")
+const logger = require('../logger')
+var { db_config } = require('../../config/config.js')
+const utils = require('../utils.js')
+/**
+ * 创建提币任务
+ * 
+ * @param {*} task_obj 
+ */
+async function create_withdraw_task(task_obj) {
+    logger.log('create_withdraw_task', task_obj)
+    // 提币 id
+    var withdraw_id = task_obj.withdraw_id;
+    if (!withdraw_id) {
+        return {
+            code: -1,
+            error: 'withdraw_id cannot be empty.'
+        }
+    }
+    //提币任务创建时间
+    var withdraw_create_time = utils.getTimestamp();
+    var from_address = task_obj.user_address
+    var to_address = task_obj.receiver
+    var contract_address = task_obj.contractAddress
+    var chain_id = parseInt(utils.getChainId(task_obj.chain))
+    var type = task_obj.type
+    var amount = task_obj.amount
+
+    if (!from_address || !to_address) {
+        return {
+            code: -1,
+            error: 'from_address and to_address cannot be empty.'
+        }
+    }
+    var create_withdraw_sql = 'INSERT INTO withdraw_manage (withdraw_id,withdraw_status,create_time,from_address,to_address,chain_id,type,contract_address,amount)' +
+        'VALUES(?,?,?,?,?,?,?,?,?)'
+    var create_withdraw_params = [withdraw_id, 0, withdraw_create_time, from_address, to_address, chain_id, type, contract_address ? contract_address : '', amount]
+
+    logger.log('create_withdraw_task create_withdraw_sql', create_withdraw_sql);
+    return new Promise((resolve) => {
+        mysql.getMySqlInstance().getConnection(function (err, connection) {
+            if (err) {
+                logger.error('create_withdraw_task', err)
+                logger.error('create_withdraw_sql', create_withdraw_sql)
+                resolve(null);
+                return;
+            }
+            connection.query(
+                create_withdraw_sql, create_withdraw_params,
+                function selectCb(error, results) {
+                    if (error) {
+                        logger.error('create_withdraw_task', error, create_withdraw_sql, create_withdraw_params)
+                        resolve(null);
+                        return;
+                    }
+                    logger.log('create_withdraw_task ret=', error, results);
+                    //用完当前连接需要释放,归还给连接池
+                    connection.release();
+                    resolve({
+                        err: error,
+                        results: results.insertId
+                    });
+                }
+            );
+        })
+    })
+
+}
+
+/**
+ * 更新提币任务
+ * @param {*} task_obj 
+ */
+function update_withdraw_task(withdraw_id, ret_obj) {
+    logger.log('update_withdraw_task', ret_obj, withdraw_id)
+    // 提币 id
+    var withdraw_id = withdraw_id;
+    if (!withdraw_id) {
+        return {
+            code: -1,
+            error: 'withdraw_id cannot be empty.'
+        }
+    }
+    var update_withdraw_sql = 'update  withdraw_manage SET withdraw_status=?,withdraw_hash=?,nonce=?,update_time=?,gas_price=?,gas_limit=?,value=?,errorMsg=? WHERE withdraw_id=?'
+
+    var status = ret_obj.withdraw_status
+    var hash = ret_obj.withdraw_hash
+    var nonce = ret_obj.nonce
+    var update_time = ret_obj.update_time
+    var gas_price = ret_obj.gas_price
+    var gas_limit = ret_obj.gas_limit
+    if (!status)
+        status = 3
+    if (!update_time)
+        update_time = utils.getTimestamp()
+    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) {
+            if (err) {
+                logger.error('update_withdraw_task', err)
+                logger.error('update_withdraw_task', update_withdraw_sql)
+                resolve(null);
+                return;
+            }
+            connection.query(
+                update_withdraw_sql, update_withdraw_params,
+                function selectCb(error, results) {
+                    if (error) {
+                        logger.error('update_withdraw_task', error, update_withdraw_sql, update_withdraw_params)
+                        resolve(null);
+                        return;
+                    }
+                    logger.log('update_withdraw_task ret=', error, results);
+                    //用完当前连接需要释放,归还给连接池
+                    connection.release();
+                    resolve({
+                        err: error,
+                        results: results
+                    });
+                }
+            );
+        })
+    })
+}
+
+function queryWithdrawInfoFromWithdrawId(withdrawId){
+    logger.log('queryWithdrawInfoFromWithdrawId', withdrawId)
+    // 提币 id
+    if (!withdrawId) {
+        return {
+            code: -1,
+            error: 'withdraw_id cannot be empty.'
+        }
+    }
+    var create_withdraw_sql = 'select * from withdraw_manage WHERE withdraw_id=?'
+    var create_withdraw_params = [withdrawId]
+    return new Promise((resolve) => {
+        mysql.getMySqlInstance().getConnection(function (err, connection) {
+            if (err) {
+                logger.error('queryWithdrawInfoFromWithdrawId', err)
+                logger.error('queryWithdrawInfoFromWithdrawId', create_withdraw_sql)
+                resolve(null);
+                return;
+            }
+            connection.query(
+                create_withdraw_sql, create_withdraw_params,
+                function selectCb(error, results) {
+                    if (error) {
+                        logger.error('queryWithdrawInfoFromWithdrawId', error, create_withdraw_sql, create_withdraw_params)
+                        resolve(null);
+                        return;
+                    }
+                    logger.log('queryWithdrawInfoFromWithdrawId ret=', error, results);
+                    //用完当前连接需要释放,归还给连接池
+                    connection.release();
+                    if (results && Array.isArray(results) && results.length > 0) {
+                        resolve(results[0]);
+                    } else {
+                        resolve(null);
+                    }
+                }
+            );
+        })
+    })
+}
+
+/**
+ * 判断该任务是否存在
+ * @param {*} withdrawId 
+ */
+function withdraw_id_exist(withdrawId) {
+    logger.log('create_withdraw_task', withdrawId)
+    // 提币 id
+    if (!withdrawId) {
+        return {
+            code: -1,
+            error: 'withdraw_id cannot be empty.'
+        }
+    }
+    var create_withdraw_sql = 'select * from withdraw_manage WHERE withdraw_id=?'
+    var create_withdraw_params = [withdrawId]
+    return new Promise((resolve) => {
+        mysql.getMySqlInstance().getConnection(function (err, connection) {
+            if (err) {
+                logger.error('withdraw_id_exist', err)
+                logger.error('withdraw_id_exist', create_withdraw_sql)
+                resolve(null);
+                return;
+            }
+            connection.query(
+                create_withdraw_sql, create_withdraw_params,
+                function selectCb(error, results) {
+                    if (error) {
+                        logger.error('withdraw_id_exist', error, create_withdraw_sql, create_withdraw_params)
+                        resolve(null);
+                        return;
+                    }
+                    logger.log('withdraw_id_exist ret=', error, results);
+                    //用完当前连接需要释放,归还给连接池
+                    connection.release();
+                    if (results && Array.isArray(results) && results.length > 0) {
+                        resolve(true);
+                    } else {
+                        resolve(false);
+                    }
+                }
+            );
+        })
+    })
+}
+
+
+module.exports = {
+    create_withdraw_task,
+    update_withdraw_task,
+    queryWithdrawInfoFromWithdrawId,
+    withdraw_id_exist
+}

+ 15 - 8
model/moralis_sdk.js

@@ -4,8 +4,8 @@ var utils = require('./utils.js');
 // var config = require('../config/config.js')(db_config,
 //     moralis_config)
 var { moralis_config, reids_token_config, account_config } = require('../config/config.js')
-const redis = require("./redis_db")  //导入 db.js
-const mysql = require("./mysql_db")
+const redis = require("./db/redis_db")  //导入 db.js
+const mysql = require("./db/mysql_db")
 const logger = require('./logger')
 const report = require("./report")  //导入 db.js
 const BigNumber = require('bignumber.js')
@@ -34,10 +34,10 @@ var secretInit = false
  */
 async function initMasterSDK() {
     logger.debug('initMasterSDK start')
-    if (masterInit){
-        logger.log('initMasterSDK',masterInit)
+    if (masterInit) {
+        logger.log('initMasterSDK', masterInit)
         return
-    } 
+    }
     await Moralis.start({ serverUrl, appId, masterKey });
     logger.debug('initMasterSDK start ok')
     masterInit = true
@@ -45,9 +45,9 @@ async function initMasterSDK() {
 
 async function initMoralisSecretSDK() {
     if (secretInit) {
-        logger.log('initMoralisSecretSDK',secretInit)
+        logger.log('initMoralisSecretSDK', secretInit)
         return
-    } 
+    }
     logger.debug('initMoralisSecretSDK start')
     await Moralis.start({ serverUrl, appId, moralisSecret });
     logger.debug('initMoralisSecretSDK start ok')
@@ -857,15 +857,22 @@ async function getTokenTransfers(opt) {
             }
             //主流币
             var t_1 = await Moralis.Web3API.account.getTransactions(options);
+            logger.debug('getTokenTransfers-->>> t_1', t_1);
             setTransfersDataType('native', t_1.result)
             //20币
+            //token 获取交易记录如果没有时间有些地址会失败
+            if (!options.to_date) {
+                options.to_date = '2099-01-01'
+            }
             var t_2 = await Moralis.Web3API.account.getTokenTransfers(options);
+            logger.debug('getTokenTransfers-->>> t_2', options, t_2);
             setTransfersDataType('token', t_2.result)
             let arr = t_1.result;
             let arr1 = t_2.result;
             if (Array.isArray(arr1) && Array.isArray(arr)) {
                 let arr2 = arr.concat(arr1);
                 t_1.result = arr2;
+                logger.debug('getTokenTransfers-->>> concat t_1', t_1);
             }
 
             //将结果排序
@@ -874,7 +881,7 @@ async function getTokenTransfers(opt) {
                 let t2 = new Date(Date.parse(b.block_timestamp))
                 return t2.getTime() - t1.getTime()
             })
-
+            logger.debug('getTokenTransfers-->>> sort t_1', t_1);
             return toJson(SUCCEED_CODE, t_1, null);
         } catch (error) {
             logger.error("getTransactions error:", error)

+ 8 - 6
model/report.js

@@ -1,8 +1,8 @@
 const axios = require('axios');
 var utils = require('./utils.js');
 var { http_log_report_config } = require('../config/config.js')
-const redis = require("./redis_db")  //导入 db.js
-const mysql = require("./mysql_db")
+const redis = require("./db/redis_db")  //导入 db.js
+const mysql = require("./db/mysql_db")
 const logger = require('./logger')
 
 //埋点文档 https://st94nif1cq.feishu.cn/docs/doccnoEvFRxdD0zy4I0MVhzCMLg#
@@ -55,18 +55,20 @@ const logReport = async (obj) => {
                         return element.to_address.toString().toLowerCase() == obj.address.toString().toLowerCase()
                     })
                     // console.log('filter results', results)
-                    if (results) {
+                    if (results && Array.isArray(results) && results.length > 0) {
                         obj.results = results
+                    } else {
+                        return
                     }
-                } 
+                }
             }
             var params = {
                 eventData: obj
             }
             params.logType = http_log_report_config.LOG_TYPE
             logger.log('transfer_record')
-            if(!obj.results){
-                logger.log('transfer_record',obj.results)
+            if (!obj.results) {
+                logger.log('transfer_record', obj.results)
                 return
             }
             http_request_post(params);

+ 2 - 2
model/timer.js

@@ -1,6 +1,6 @@
 var { moralis_config, reids_token_config, account_config, timer_config } = require('../config/config.js')
-const redis = require("./redis_db")  //导入 db.js
-const mysql = require("./mysql_db")
+const redis = require("./db/redis_db")  //导入 db.js
+const mysql = require("./db/mysql_db")
 const moralis = require("./moralis_sdk")  //导入 db.js
 var utils = require('./utils.js');
 const logger = require('./logger')

+ 19 - 3
model/utils.js

@@ -57,7 +57,7 @@ const SECRET_IV = CryptoJS.enc.Utf8.parse("68F37CFC40C330D9FAAC0A16D49C8AD5");
  * @param data
  * @returns {string}
  */
- function encrypt(data) {
+function encrypt(data) {
     if (typeof data === "object") {
         try {
             data = JSON.stringify(data);
@@ -78,7 +78,7 @@ const SECRET_IV = CryptoJS.enc.Utf8.parse("68F37CFC40C330D9FAAC0A16D49C8AD5");
 * @param data
 * @returns {string}
 */
- function decrypt(data) {
+function decrypt(data) {
     // const key = CryptoJS.enc.Hex.parse(SECRET_KEY);
     const decrypt = CryptoJS.AES.decrypt(data, SECRET_KEY, {
         mode: CryptoJS.mode.ECB,
@@ -99,10 +99,20 @@ const CHAIN_ID = {
     bsc_mainnet: '0x38'
 }
 
+const CHAIN_ID_NAME = {
+    97: 'bsc_testnet',
+    56: 'bsc_mainnet',
+}
+
 function getChainName(key) {
     return CHAIN_NAME[key];
 }
 
+
+function getChainIdToName(key) {
+    return CHAIN_ID_NAME[key];
+}
+
 function getChainId(key) {
     return CHAIN_ID[key];
 }
@@ -111,6 +121,10 @@ function sleep(time) {
     return new Promise((resolve) => setTimeout(resolve, time));
 }
 
+function getTimestamp() {
+    return new Date().getTime()
+}
+
 module.exports = {
     toJson,
     decryptPrivityKey,
@@ -120,5 +134,7 @@ module.exports = {
     CHAIN_ID,
     sleep,
     encrypt,
-    decrypt
+    decrypt,
+    getTimestamp,
+    getChainIdToName,
 }

+ 172 - 42
routes/sdk.js

@@ -4,8 +4,10 @@ var utils = require('../model/utils.js');
 var { reids_token_config, account_config } = require('../config/config.js');
 const logger = require('../model/logger.js');
 router.prefix('/sdk');
-const redis = require("../model/redis_db")  //导入 db.js
+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')
 /**
  * 获取代币价格
  * @param {*} ctx 
@@ -68,28 +70,117 @@ async function getTransfers(ctx) {
     })
 }
 
+
+
+async function getAllTokenWithdrawInfoLists(ctx) {
+    if (ctx.request == null || ctx.request.body == null) {
+        ctx.body = utils.toJson(-1, null, "request error. ");
+        return
+    }
+    ctx.body = await moralis.getAllTokenWithdrawInfoLists(ctx);
+}
+
+async function withdraw_task() {
+    var status = await redis.readRedis(reids_token_config.WITHDRAW_QUEUE_STATUS)
+    if (status && status == 1) {
+        logger.log('running...')
+        return
+    }
+    redis.redis_set(reids_token_config.WITHDRAW_QUEUE_STATUS, 1)
+
+    while (true) {
+        var exec_obj = await redis.redis_pop(reids_token_config.WITHDRAW_QUEUE_KEY)
+        try {
+            exec_obj = JSON.parse(exec_obj)
+        } catch (error) {
+            logger.log('item parse error', error);
+            break
+        }
+        logger.log('item', exec_obj);
+        if (!exec_obj) {
+            break
+        }
+        try {
+            var result = await withdraw_(exec_obj)
+            logger.log('withdraw_task=', result)
+            if (result && moralis.isTransferSucceed(result)) {
+                var obj = JSON.parse(result)
+                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 hash = obj.data.hash
+                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.errorMsg = ''
+                await withdraw_db.update_withdraw_task(exec_obj.withdraw_id, update_obj)
+            } else {
+                var update_obj = {}
+                update_obj.withdraw_status = 3
+                update_obj.errorMsg = result
+                await withdraw_db.update_withdraw_task(exec_obj.withdraw_id, update_obj)
+            }
+        } catch (error) {
+            logger.log('withdraw_task error=', error)
+        }
+    }
+    redis.redis_set(reids_token_config.WITHDRAW_QUEUE_STATUS, 0)
+}
+
 /**
- * 出金,入金交易
+ * 队列版本
  * @param {*} ctx 
  * @returns 
  */
-async function transfer(ctx) {
+async function withdrawV3(ctx) {
+    logger.log('withdrawV3')
     if (ctx.request == null || ctx.request.body == null) {
         ctx.body = utils.toJson(-1, null, "request error. ");
         return
     }
     const obj = ctx.request.body;
-    await moralis.transfer(obj).then((result) => {
-        ctx.body = result;
-    });
+    var log_obj = { ...obj }
+    logger.log('withdrawV3', log_obj)
+    var obj_ = decrypt_withdraw_content(log_obj.content)
+    // var obj_ = log_obj
+    if (obj_.withdraw_id) {
+        var isExist = await withdraw_db.withdraw_id_exist(obj_.withdraw_id)
+        if (isExist) {
+            logger.error('withdraw_id_exist', obj_.withdraw_id + ' is already in the queue.')
+            ctx.body = utils.toJson(-2, null, obj_.withdraw_id + ' is already in the queue.')
+            return
+        }
+        redis.redis_push(reids_token_config.WITHDRAW_QUEUE_KEY, JSON.stringify(obj_))
+        var info = await moralis.queryCompanyInfoFromId(0);
+        obj_.user_address = info.user_address
+        await withdraw_db.create_withdraw_task(obj_)
+        withdraw_task()
+        ctx.body = utils.toJson(0, obj_.withdraw_id, null)
+    } else {
+        return utils.toJson(-2, null, ' withdraw_id not empty.')
+    }
 }
 
-async function getAllTokenWithdrawInfoLists(ctx) {
-    if (ctx.request == null || ctx.request.body == null) {
-        ctx.body = utils.toJson(-1, null, "request error. ");
-        return
+function decrypt_withdraw_content(content) {
+    // const encryptText = utils.encrypt(log_obj);
+    const encryptText = content;
+    logger.log("加密", encryptText);
+    let decryptObj = utils.decrypt(encryptText);
+    try {
+        logger.log("解密 before", decryptObj);
+        decryptObj = JSON.parse(decryptObj);
+        console.log("解密 json parse", decryptObj);
+
+    } catch (error) {
+        logger.log("json error:", error);
+        decryptObj = null;
     }
-    ctx.body = await moralis.getAllTokenWithdrawInfoLists(ctx);
+    return decryptObj;
 }
 
 /**
@@ -118,10 +209,30 @@ async function withdrawV2(ctx) {
         })
     } catch (error) {
         logger.log("json error:", error);
-        ctx.body = utils.toJson(-1,null,error.toString());
+        ctx.body = utils.toJson(-1, null, error.toString());
     }
 }
 
+function loop_test() {
+    var obj = {
+        type: "erc20",
+        contractAddress: "0x03716F32f72c692a0B355fa04639669E3341B94e",
+        amount: "112000000000000000000",
+        chain: "bsc_testnet",
+        receiver: "0x7C7401fcc82D1e53C4090561c3e6fde80d74e317"
+    }
+
+    var obj2 = {
+        type: "erc20",
+        contractAddress: "0x03716F32f72c692a0B355fa04639669E3341B94e",
+        amount: "113000000000000000000",
+        chain: "bsc_testnet",
+        receiver: "0x741050F44196Ad4b427AC5E97beB7715FD0127E7"
+    }
+    withdraw_(obj)
+    withdraw_(obj2)
+}
+
 async function withdraw_(obj) {
     console.log("withdraw_", obj);
     var log_obj = { ...obj }
@@ -140,10 +251,9 @@ async function withdraw_(obj) {
                     var tr = moralis.getTransferGasFree('token', result)
                     log_obj.withdrawTotalGasFee = tr.totalGasFree.toString()
                 } else {
-                    var tr = moralis.getTransferGasFree('native', ret)
+                    var tr = moralis.getTransferGasFree('native', result)
                     log_obj.withdrawTotalGasFee = tr.totalGasFree.toString()
                 }
-
                 // log_obj.receiver_address_total_balance_after = await queryCollectBalance(info.user_address, utils.getChainName(obj.chain))
                 //日志上报
                 report.logReport(log_obj)
@@ -160,36 +270,51 @@ async function withdraw(ctx) {
         return
     }
     const obj = ctx.request.body;
-    var log_obj = { ...obj }
-    var info = await moralis.queryCompanyInfoFromId(0);
-    log_obj.company_address_total_balance_before = await moralis.queryCollectBalance(info.user_address, obj.chain)
-    log_obj.company_public_key = info.user_address
-    logger.log('withdraw log', log_obj,obj);
-    await moralis.withdraw(obj).then((result) => {
+    await withdraw_(obj).then(result => {
         ctx.body = result;
-        if (moralis.isTransferSucceed(result)) {
-            //提币日志上报
-            log_obj.results = result
-            log_obj.type = report.REPORT_TYPE.withdraw
-
-            //缓存当前交易的 gas 费用
-            if (result && log_obj.contractAddress) {
-                var tr = moralis.getTransferGasFree('token', result)
-                log_obj.withdrawTotalGasFee = tr.totalGasFree.toString()
-            } else {
-                var tr = moralis.getTransferGasFree('native', ret)
-                log_obj.withdrawTotalGasFee = tr.totalGasFree.toString()
-            }
-
-            // log_obj.receiver_address_total_balance_after = await queryCollectBalance(info.user_address, utils.getChainName(obj.chain))
-            //日志上报
-            report.logReport(log_obj)
-        }
-    });
+    })
 }
 
-
-
+/**
+ * 查询出金状态
+ * @param {*} ctx 
+ */
+async function getWithdrawStatus(ctx) {
+    if (ctx.request == null || ctx.request.body == null) {
+        ctx.body = utils.toJson(-1, null, "request error. ");
+        return
+    }
+    const obj = ctx.request.body;
+    var info = await withdraw_db.queryWithdrawInfoFromWithdrawId(obj.withdraw_id)
+    logger.log('getWithdrawStatus info', JSON.stringify(info))
+    if (info) {
+        // try {
+        //     var ret = await moralis.getTokenTransfers({
+        //         transaction_hash: info.withdraw_hash,
+        //         chain: utils.getChainIdToName(info.chain_id)
+        //     })
+        //     logger.log('getWithdrawStatus getTokenTransfers', ret)
+        //     info.block_timestamp = ''
+        //     if (ret) {
+        //         if (typeof ret === 'string') {
+        //             ret = JSON.parse(ret)
+        //             info.block_timestamp = ret.data.result[0].block_timestamp
+        //         }
+        //     }
+        // } catch (error) {
+        //     logger.error('getWithdrawStatus getTokenTransfers error', error)
+        // }
+        ctx.body = utils.toJson(0, {
+            withdrawId: info.withdraw_id,
+            withdrawStatus: info.withdraw_status,
+            withdrawHash: info.withdraw_hash,
+            chainId: info.chain_id,
+            transferTimestamp: info.update_time,
+        }, null)
+    } else {
+        ctx.body = utils.toJson(-1, null, obj.withdraw_id + ' id does not exist.')
+    }
+}
 
 //获取交易记录
 router.post('/getTransfers', getTransfers)
@@ -199,8 +324,13 @@ router.post('/getAllTotkenPrice', getAllTotkenPrice)
 // router.post('/transfer', transfer)
 //提现
 router.post('/withdraw', withdraw);
-//提现
+//提现鉴权-body 加密
 router.post('/withdrawV2', withdrawV2);
+//队列的形式
+router.post('/withdrawV3', withdrawV3);
+//查询出金服务
+router.post('/getWithdrawStatus', getWithdrawStatus);
+
 //获取所有地址的所要消耗的最低提取费
 router.post('/getAllTokenWithdrawInfoLists', getAllTokenWithdrawInfoLists)
 

+ 26 - 12
test/db_test.js

@@ -1,23 +1,37 @@
 const router = require('koa-router')() //导入 koa-router
-const redis = require("../model/redis_db")  //导入 db.js
-const mysql = require("../model/mysql_db")  //导入 db.js
+const redis = require("../model/db/redis_db")  //导入 db.js
+const mysql = require("../model/db/mysql_db")  //导入 db.js
 // https://github.com/luin/ioredis#readme
-const console = require('../model/logger')
+const logger = require('../model/logger')
 
 router.prefix('/test');
 router.post('/set', async (ctx) => {
-    const obj = ctx.request.body;
-    console.log("set:",obj)
-    redis.redis_set(obj.key, obj.value);
-    ctx.body = obj.key + " - "+ obj.value
+    // const obj = ctx.request.body;
+    // console.log("set:",obj)
+    // redis.redis_set(obj.key, obj.value);
+    // ctx.body = obj.key + " - "+ obj.value
+    // var arrays = [1, 2, 3, 4, 5]
+
+    for (let index = 0; index < 10; index++) {
+        redis.redis_push('WITHDRAW_QUEUE_KEY', JSON.stringify({ code: index }))
+    }
+
+    while (true) {
+        var item = await redis.redis_pop('WITHDRAW_QUEUE_KEY')
+        logger.log('item', typeof item, JSON.parse(item));
+        if (!item) {
+            break
+        }
+    }
+    logger.log('exit');
 })
 
 router.post('/get', async (ctx) => {
     const obj = ctx.request.body;
-    console.log("get:",obj)
+    console.log("get:", obj)
     await redis.redis_get(obj.key).then((result) => {
         // ctx.body = "key:" + obj.key + " \n" + "value:" + result
-        console.error('>>>>>>>>>>>>redis_get'+"key:" + obj.key + "-" + "value:" + result)
+        console.error('>>>>>>>>>>>>redis_get' + "key:" + obj.key + "-" + "value:" + result)
     });
     await redis.readRedis(obj.key).then((result) => {
         ctx.body = "readRedis key:" + obj.key + " \n" + "value:" + result
@@ -27,14 +41,14 @@ router.post('/get', async (ctx) => {
 
 router.post('/queryUserPrivateKey', async (ctx) => {
     const obj = ctx.request.body;
-    console.log("queryUserPrivateKey:",obj)
+    console.log("queryUserPrivateKey:", obj)
     // await mysql.queryUserPrivateKeyFromUserAddress(obj.userAddress).then(function (mysqlDbResp){
     //     ctx.body = "results:" +  JSON.stringify(mysqlDbResp)
     //     console.log('mysqlDbResp=', JSON.stringify(mysqlDbResp));
     // })
 
-    await mysql.queryCompanyInfoFromId(0).then(e=>{
-        ctx.body = "results:" +  JSON.stringify(e)
+    await mysql.queryCompanyInfoFromId(0).then(e => {
+        ctx.body = "results:" + JSON.stringify(e)
     })
 })
 module.exports = router

+ 32 - 3
test/test.js

@@ -1,6 +1,7 @@
 const router = require('koa-router')() //导入 koa-router
 const moralis = require("../model/moralis_sdk")  //导入 db.js
 // https://github.com/luin/ioredis#readme
+const withdraw_db = require('../model/db/withdraw_db')
 
 router.prefix('/denettest');
 const BigNumber = require('bignumber.js')
@@ -67,8 +68,7 @@ async function getTransfers(ctx) {
     var curGasPrice = BigNumber(data.gasPrice.hex)
     var curGasLimit = BigNumber(data.gasLimit.hex)
 
-    if(curGasLimit > 0)
-    {
+    if (curGasLimit > 0) {
         console.log('curGasLimit', curGasLimit.toNumber())
     }
     console.log('curGasPrice', curGasPrice.toNumber())
@@ -83,7 +83,6 @@ async function getTransfers(ctx) {
         moralis.pushCollectConisObj(obj)
     }
 
-
     ctx.body = curGasPrice + '-' + curGasLimit;
 
     // await moralis.collectCoins(obj).then((result) => {
@@ -94,6 +93,34 @@ async function getTransfers(ctx) {
 //获取交易记录
 router.post('/getTransfers', getTransfers)
 
+async function withdraw(ctx) {
+    if (ctx.request == null || ctx.request.body == null) {
+        ctx.body = utils.toJson(-1, null, "request error. ");
+        return;
+    }
+
+    const obj = ctx.request.body;
+    var temp_ob = { ...obj }
+    temp_ob.from_address = '0xxpaoifhjopiesaj'
+    temp_ob.to_address = temp_ob.receiver
+    var ret = await withdraw_db.create_withdraw_task(temp_ob);
+    ctx.body = ret;
+
+    var isExist = await withdraw_db.withdraw_id_exist(temp_ob.withdraw_id)
+    if (isExist) {
+        // [ret_obj.withdraw_status, ret_obj.withdraw_hash, ret_obj.nonce, ret_obj.update_time, ret_obj.gas_price, ret_obj.gas_limit, withdraw_id]
+        // var update_obj = {
+        //     withdraw_status: 1,
+        //     withdraw_hash: 'asdfasdf',
+        //     nonce: 0,
+        //     update_time: 12989,
+        //     gas_price: '1200000',
+        //     gas_limit: '80000'
+        // }
+        var update_obj={}
+        await withdraw_db.update_withdraw_task(temp_ob.withdraw_id, update_obj)
+    }
+}
 
 async function crypto_test(ctx) {
     if (ctx.request == null || ctx.request.body == null) {
@@ -118,5 +145,7 @@ async function crypto_test(ctx) {
 }
 router.post('/crypto_test', crypto_test)
 
+router.post('/withdraw', withdraw)
+
 module.exports = router