| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042 | var router = require('koa-router')();var moralis = require('../model/moralis_sdk.js')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/db/redis_db")  //导入 db.jsconst withdraw_db = require("../model/db/withdraw_db")  //导入 db.jsconst report = require("../model/report")  //导入 db.jsconst BigNumber = require('bignumber.js')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.jsvar collect_coins_db = require("../model/db/collect_coins_db");var stat2 = require('../model/server_data_statisticsv2')/**  * 获取代币价格 * @param {*} ctx  */async function getAllTotkenPrice(ctx) {    console.log('getTotkenPrice in:')    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);    else ctx.body = utils.toJson(-1, null, "redis read error.");}/** * 获取交易记录 * @param {*} ctx  */async function getTransfers(ctx) {    const obj = ctx.request.body;    console.log("getTransfers body", obj);    if (!obj.chain)//默认 bsc 币安链        obj.chain = 'bsc_mainnet'    var temp_obj = { ...obj }    var index = 0    await moralis.getTokenTransfers(obj).then((result) => {        logger.log('getTransfers response', 'index=' + index, result)        ctx.body = result;        if (result) {            //提交归集任务 native 能获取到 gas 、token 无法获取到 gas 费            try {                if (temp_obj.address && moralis.isTransferSucceed(result)) {                    var log_obj = { ...obj }                    log_obj.results = result                    log_obj.type = report.REPORT_TYPE.transfer_record                    //埋点日志上报-入金检查                    report.logReport(log_obj)                    var json_obj = JSON.parse(result);                    //缓存当前交易的 gas 费用                    var tr = moralis.getTransferRecordGasFree('native', json_obj, temp_obj.address)                    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.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) {                        //提交归集任务                        if (temp_obj.address) {                            logger.log('pushCollectConisObj>>>', temp_obj.address)                            redis.redis_push(reids_token_config.COLLECT_CONIS_QUEUE_KEY, JSON.stringify(temp_obj))                        }                    }                    if (json_obj.data.total > 0) {                        //提交归集任务                        if (temp_obj.address) {                            logger.log('pushCollectConisObj>>>', temp_obj.address)                            redis.redis_push(reids_token_config.COLLECT_CONIS_QUEUE_KEY, JSON.stringify(temp_obj))                        }                    }                }            } catch (error) {                console.error('pushCollectConisObj error=', error)            }        }    })}async function getCollectCoinsHash(trx_hash) {    var ret = await collect_coins_db.query_collect_hash(trx_hash);    if (ret && Array.isArray(ret) && ret.length > 0) {        return 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 {        if (typeof result === 'string') {            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 (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 {                    code: ret.code,                    data: {                        total: new_ret.length,                        results: new_ret,                        errMsg: ''                    }                }            } else {                return result            }        }    } catch (error) {        logger.error('filterTransfers', error.toString())        return result    }}/** * 获取交易记录 * @param {*} ctx  */async function getTransfersV2(ctx) {    const obj = ctx.request.body;    console.log("getTransfers body", obj);    if (!obj.chain)//默认 bsc 币安链        obj.chain = 'bsc_mainnet'    var temp_obj = { ...obj }    var index = 0    var result = await moralis.getTokenTransfersV2(obj)    // await moralis.getTokenTransfersV2(obj).then((result) => {    logger.log('getTokenTransfersV2 response', 'index=' + index, result)    ctx.body = await filterTransfers(result);    if (result) {        //提交归集任务 native 能获取到 gas 、token 无法获取到 gas 费        try {            if (temp_obj.address && moralis.isTransferSucceed(result)) {                var log_obj = { ...obj }                log_obj.results = result                log_obj.type = report.REPORT_TYPE.transfer_record                //埋点日志上报-入金检查                report.logReport(log_obj)                var json_obj = JSON.parse(result);                //缓存当前交易的 gas 费用                var tr = moralis.getTransferRecordGasFree('native', json_obj, temp_obj.address)                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.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) {                    //提交归集任务                    if (temp_obj.address) {                        logger.log('pushCollectConisObj>>>', temp_obj.address)                        redis.redis_push(reids_token_config.COLLECT_CONIS_QUEUE_KEY, JSON.stringify(temp_obj))                    }                }            }        } catch (error) {            console.error('pushCollectConisObj error=', error)        }    }    // })}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 check_czz_withdraw_task() {    while (true) {        var exec_obj;        try {            exec_obj = await redis.redis_pop(reids_token_config.CHECK_CZZ_WITHDRAW_STATUS_QUEUE)            logger.log("check_czz_withdraw_task redis_pop", exec_obj)            if (!exec_obj) {                logger.log("没有 czz hash check")                await utils.sleep(2 * 60 * 1000)                continue            }            exec_obj = JSON.parse(exec_obj)            if (utils.getTimestamp() - exec_obj.create_time > exec_obj.lifecycle) {                logger.error('已过期 check_czz_withdraw_task :', JSON.stringify(exec_obj))                var update_obj = {}                update_obj.withdraw_status = 3                update_obj.withdraw_hash = ''                update_obj.nonce = -1                update_obj.gas_price = ''                update_obj.gas_limit = ''                update_obj.value = '0'                update_obj.errorMsg = 'czz timeout'                await withdraw_db.update_withdraw_task(exec_obj.withdraw_id, update_obj)                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                var curGasPrice = obj.data.gasPrice.toString()                var curGasLimit = obj.data.gasLimit.toString()                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 = utils.scientificNotationToString(obj.data.value).toString()                update_obj.errorMsg = ''                await withdraw_db.update_withdraw_task(exec_obj.withdraw_id, update_obj)            } else {                redis.redis_push(reids_token_config.CHECK_CZZ_WITHDRAW_STATUS_QUEUE, JSON.stringify(exec_obj))            }            await utils.sleep(2 * 60 * 1000)        } catch (error) {            if (exec_obj)                logger.error('check_czz_withdraw_task error', error.toString(), JSON.stringify(exec_obj))            else                logger.error('check_czz_withdraw_task error', error.toString())        }    }}async function collect_conis_task() {    logger.log("collect_conis_task start")    var last_address = ' ';    var last_time = utils.getTimestamp();    while (true) {        var isPause = 0        try {            isPause = await remote_config_db.isPause('collect_coins')            if (isPause) {                logger.error("collect_conis_task pause")                await utils.sleep(60000)                continue            }        } catch (error) {            logger.error("collect_conis_task isPause error", error.toString())        }        var start_time = utils.getTimestamp()        var exec_obj = await redis.redis_pop(reids_token_config.COLLECT_CONIS_QUEUE_KEY)        if (!exec_obj) {            logger.log("没有归集任务")            await utils.sleep(30000)            continue        }        try {            exec_obj = JSON.parse(exec_obj)            logger.log('collect_conis_task exec item>>>>', exec_obj);            try {                //是否是黑名单                var isBlackList = await remote_config_db.isBlackList('collect_coins', exec_obj.chain, exec_obj.address)                if (isBlackList) {                    logger.error('collect_conis_task isBlackList', JSON.stringify(exec_obj));                    continue                }            } catch (error) {                logger.error('collect_conis_task isBlackList error', JSON.stringify(exec_obj));            }            if (last_address && exec_obj.address && last_address == exec_obj.address && utils.getTimestamp() - last_time < 2 * 60 * 1000) {                logger.info('collect coins wait...');                await utils.sleep(60000)            }            //开始收集用户地址里面的币到归集地址            var ret = await moralis.collectCoins(exec_obj)            logger.log('collect_conis_task ret =', exec_obj, ret)            try {                var ret_obj = JSON.parse(ret)                if (ret_obj.code == 0) {                    logger.log('触发归集 delay collect_conis_task ret =', exec_obj, ret)                    last_address = exec_obj.address                }            } catch (error) { }        } catch (error) {            logger.error('collect_conis_task error', error.toString());        }        logger.log("collect_conis_task cost-time", utils.getTimestamp() - start_time, exec_obj)        last_time = utils.getTimestamp()    }}async function withdraw_task() {    logger.log("withdraw_task start")    let last_time = 0    let last_hash = ''    let last_chain = ''    while (true) {        var isPause = 0        try {            isPause = await remote_config_db.isPause('withdraw')            logger.info("withdraw_task pause", isPause)            if (isPause) {                logger.error("withdraw_task pause")                await utils.sleep(60000)                continue            }        } catch (error) {            logger.error("withdraw_task isPause error", error.toString())        }        var exec_obj = await redis.redis_pop(reids_token_config.WITHDRAW_QUEUE_KEY)        if (!exec_obj) {            await utils.sleep(10000)            logger.log("没有出金任务")            continue        }        try {            exec_obj = JSON.parse(exec_obj)        } catch (error) {            logger.error('withdraw_task item parse error', error);            continue        }        try {            logger.info('withdraw exec obj', exec_obj)            //是否是黑名单            var isBlackList = await remote_config_db.isBlackList('withdraw', exec_obj.chain, exec_obj.receiver)            if (isBlackList) {                var update_obj = {}                update_obj.withdraw_status = 3                update_obj.errorMsg = 'blackList'                await withdraw_db.update_withdraw_task(exec_obj.withdraw_id, update_obj)                logger.error('withdraw_task isBlackList', JSON.stringify(exec_obj));                continue            }        } catch (error) {            logger.error('withdraw_task isBlackList error', JSON.stringify(exec_obj));        }        var temp_obj = { ...exec_obj }        if (utils.getTimestamp() - last_time < 60000) {            //有可能上一个区块还未更新,这里做一个尝试限制            //Error: Failed to make "eth_sendRawTransaction" request with networkConnector: "already known"            //通过 交易 hash 获取块。last_hash            if (last_hash && last_chain) {                var options = {                    transaction_hash: last_hash,                    chain: last_chain,                    endTime: '2099-01-01'                }                var tryCount = 3;                do {                    try {                        //通过获取上一个交易记录来进行确认                        var transaction = await moralis.getTokenTransfersV2(options);                        logger.log('withdraw_task exectransaction', transaction, options, tryCount);                        if (typeof transaction === 'string')                            transaction = JSON.parse(transaction)                        if (transaction.code == 0) {                            if (transaction.data.results.length <= 0) {                                logger.log('等待10s');                                await utils.sleep(10000)                            } else {                                logger.log('等待5s');                                await utils.sleep(5000)                                break                            }                        } else {                            break                        }                        tryCount -= 1                    } catch (error) {                        logger.error('withdraw_task exectransaction err', error.toString());                    }                    if (tryCount < 0) {                        logger.error('withdraw_task getTokenTransfersV2 40s内 警告交易未更新:', JSON.stringify(options));                    }                } while (tryCount >= 0);            }        }        //如果失败重试一次        var tryCount = 1;        for (let index = 0; index < 1 + tryCount; index++) {            var result;            var obj;            var curGasPrice = 0;            var curGasLimit = 0;            var value = 0            var nonce = -1            try {                result = await withdraw_({ ...temp_obj })                last_time = utils.getTimestamp()                logger.log('withdraw_task withdraw_ =', result, last_time)                if (result && moralis.getTransferCode(result) == 0) {                    if (typeof result === 'string') {                        obj = JSON.parse(result)                    }                    nonce = obj.data.nonce                    try {                        curGasPrice = BigNumber(obj.data.gasPrice.hex).toNumber()                        curGasLimit = BigNumber(obj.data.gasLimit.hex).toNumber()                        if (!obj.data.value.number) {                            value = BigNumber(obj.data.value.hex).toNumber()                        } else {                            value = obj.data.value.number                        }                    } catch (error) {                        logger.error('BigNumber toNumber error')                    }                    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()                    try {                        update_obj.value = utils.scientificNotationToString(value).toString()                    } catch (error) {                        logger.error('scientificNotationToString error')                    }                    update_obj.errorMsg = ''                    await withdraw_db.update_withdraw_task(exec_obj.withdraw_id, update_obj)                    break                } else if (result && moralis.getTransferCode(result) == 1) {                    moralis.pushChainDetailTOQueue(1, exec_obj, result);                    break                } else {                    logger.error('withdraw_task withdraw_ error=', result, JSON.stringify(temp_obj))                    if (index < 1 + tryCount && result.includes('eth_sendRawTransaction')) {                        logger.error('try withdraw_:', JSON.stringify(temp_obj), index)                        await utils.sleep(3000)                        continue                    }                    var update_obj = {}                    update_obj.withdraw_status = 3                    if (typeof result === 'string') {                        try {                            result = JSON.parse(result)                            update_obj.errorMsg = result.errMsg                        } catch (error) {                            logger.error('withdraw_task=', result)                        }                    }                    await withdraw_db.update_withdraw_task(exec_obj.withdraw_id, update_obj)                    break                }            } catch (error) {                var update_obj = {}                update_obj.withdraw_status = 3                update_obj.errorMsg = error.toString()                await withdraw_db.update_withdraw_task(exec_obj.withdraw_id, update_obj)                if (result)                    logger.error('withdraw_task error=', error.toString(), JSON.stringify(temp_obj), JSON.stringify(result))                else {                    logger.error('withdraw_task error=', error.toString(), JSON.stringify(temp_obj))                }                break            }        }    }    logger.log("withdraw_task end")}/** * 队列版本 * @param {*} ctx  * @returns  */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;    var log_obj = { ...obj }    logger.log('withdrawV3', log_obj)    var obj_ = decrypt_withdraw_content(log_obj.content)    obj_.withdraw_id = obj_.withdrawId;    // obj_.withdraw_id = utils.getTimestamp().toString();    // 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        }        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_))        // withdraw_task()        ctx.body = utils.toJson(0, obj_.withdraw_id, null)    } else {        return utils.toJson(-2, null, ' withdraw_id not empty.')    }}async function withdrawV3Test(ctx) {    logger.log('withdrawV3Test')    if (ctx.request == null || ctx.request.body == null) {        ctx.body = utils.toJson(-1, null, "request error. ");        return    }    const obj = ctx.request.body;    // for (let index = 0; index < 10; index++) {    var log_obj = { ...obj }    logger.log('withdrawV3', log_obj)    var obj_ = decrypt_withdraw_content(log_obj.content)    obj_.withdraw_id = utils.getCurrentDateFormat('YYYY-MM-DD-HH:mm:ss:SSS').toString()    // 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_)        ctx.body = utils.toJson(0, obj_.withdraw_id, null)    } else {        return utils.toJson(-2, null, ' withdraw_id not empty.')    }    // }}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.error("json error:", error);        decryptObj = null;    }    return decryptObj;}/** *  * @param {鉴权版本} ctx  */async function withdrawV2(ctx) {    if (ctx.request == null || ctx.request.body == null) {        ctx.body = utils.toJson(-1, null, "request error. ");        return    }    const obj = ctx.request.body;    var log_obj = { ...obj }    // const encryptText = utils.encrypt(log_obj);    const encryptText = log_obj.content;    logger.log("加密", encryptText);    let decryptObj = utils.decrypt(encryptText);    try {        logger.log("解密 before", decryptObj);        decryptObj = JSON.parse(decryptObj);        // console.log("解密 json parse", decryptObj);        await withdraw_(decryptObj).then(result => {            ctx.body = result;        })    } catch (error) {        logger.error("json error:", error);        ctx.body = utils.toJson(-1, null, error.toString());    }}async function withdraw_(obj) {    console.log("withdraw_", obj);    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);    return new Promise((resolve) => {        moralis.withdraw(obj).then((result) => {            if (moralis.getTransferCode(result) == 0) {                //提币日志上报                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', result)                    log_obj.withdrawTotalGasFee = tr.totalGasFree.toString()                }                //日志上报                report.logReport(log_obj)            }            resolve(result)        });    })}//出金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;    await withdraw_(obj).then(result => {        ctx.body = result;    })}/** * 查询出金状态 * @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.withdrawId)    logger.log('getWithdrawStatus info', JSON.stringify(info))    if (info) {        if (info.withdraw_status != 3) {            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(0, {                withdrawId: info.withdraw_id,                withdrawStatus: info.withdraw_status,                withdrawHash: info.withdraw_hash,                chainId: info.chain_id,                transferTimestamp: info.update_time,                errorMsg: info.errorMsg            }, info.errorMsg)        }    } else {        ctx.body = utils.toJson(-1, null, obj.withdraw_id + ' id does not exist.')    }}async function timer_collect_conis_bsc_task() {    var index = 0    var delay = 60 * 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_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    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_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()        // }        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    }}async function timer_transfer_czz_task() {    var index = 0    var delay = 60 * 1000 * 60    while (1) {        var obj_ = {            "type": "erc20",            "contractAddress": "0xfb16179d5e84b0e3e7524ed61a9cf7b98d039b20",            "amount": "100000000000000000000",            "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    }}async function checkout_taxhash(exec_obj) {    logger.info('bsc_log_monitoring exec start:', exec_obj)    var delay = 60 * 1000    try {        if (typeof exec_obj === 'string')            exec_obj = JSON.parse(exec_obj)    } catch (error) {        logger.error('bsc_log_monitoring:', error)    }    var tryCount = 5    do {        if (tryCount == 0) {            logger.error('数据在5分钟未更新', JSON.stringify(exec_obj))            break        }        if (exec_obj.transactionHash) {            var ret = await account_mysql.getAccountTransactions({                type: 'only_hash',                transaction_hash: exec_obj.transactionHash            })            if (ret && ret.code == 0 && ret.data.total > 0) {                break            }        }        --tryCount        logger.debug('getAccountTransactions', tryCount, exec_obj)        await utils.sleep(delay)    } while (tryCount >= 0);}async function bsc_log_monitoring() {    while (1) {        var exec_obj = await redis.redis_pop(reids_token_config.BSC_LOG_MONITORING_KEY)        if (!exec_obj) {            await utils.sleep(10000)            logger.log("no new check tasks")            continue        }        try {            checkout_taxhash(exec_obj)        } catch (error) {            logger.error("checkout_taxhash", error.toString())        }    }}//获取交易记录router.post('/getTransfers', getTransfers)router.post('/getTransfersV2', getTransfersV2)// 获取所有代币价格router.post('/getAllTotkenPrice', getAllTotkenPrice)router.post('/getAllTokenPrice', getAllTokenPrice)// router.post('/transfer', transfer)//提现router.post('/withdraw', withdraw);//提现鉴权-body 加密router.post('/withdrawV2', withdrawV2);//队列的形式router.post('/withdrawV3', withdrawV3);// if (process.env.NODE_ENV == 'dev' || process.env.NODE_ENV == 'test') {router.post('/withdrawV3Test', withdrawV3Test);// }//查询出金服务router.post('/getWithdrawStatus', getWithdrawStatus);//获取所有地址的所要消耗的最低提取费router.post('/getAllTokenWithdrawInfoLists', getAllTokenWithdrawInfoLists)router.get('/report2FeishuTable', async (ctx) => {    stat2.report2FeishuTable(1)    ctx.body = 'ok'})// // 定时任务 提币+归集withdraw_task();collect_conis_task();// //czz 504 检查check_czz_withdraw_task();// bsc 监控bsc_log_monitoring()if (process.env.NODE_ENV == 'dev' || process.env.NODE_ENV == 'test') {    /*** 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
 |