Pārlūkot izejas kodu

接入日志埋点

DevYK 3 gadi atpakaļ
vecāks
revīzija
70a2600a60
8 mainītis faili ar 337 papildinājumiem un 15 dzēšanām
  1. 10 1
      config/dev_config.js
  2. 10 0
      config/prd_config.js
  3. 11 0
      config/test_config.js
  4. 87 6
      model/moralis_sdk.js
  5. 91 0
      model/report.js
  6. 94 8
      package-lock.json
  7. 1 0
      package.json
  8. 33 0
      routes/sdk.js

+ 10 - 1
config/dev_config.js

@@ -25,6 +25,14 @@ const reids_token_config = {
     LAST_TOTAL_TOKEN_FREE: 'LAST_TOTAL_TOKEN_FREE',
     LAST_GAS_PRICE: 'LAST_TOKEN_GAS_PRICE',
 }
+
+// http 埋点上报配置
+const http_log_report_config = {
+    HOST: 'https://testapi.piaoquantv.com',
+    PATH: '/log-center/statistics/uploadLogFromFrontend',
+    LOG_TYPE: 150,
+}
+
 // 设置数据库配置文件
 const db_config = {
     // 数据库配置
@@ -82,6 +90,7 @@ module.exports = {
     reids_token_config,
     account_config,
     timer_config,
-    logger_config
+    logger_config,
+    http_log_report_config,
 }
 

+ 10 - 0
config/prd_config.js

@@ -25,6 +25,15 @@ const reids_token_config = {
     LAST_GAS_PRICE: 'LAST_TOKEN_GAS_PRICE',
 
 }
+
+// http 埋点上报配置
+const http_log_report_config = {
+    HOST: 'https://api.piaoquantv.com',
+    PATH: '/log-center/statistics/uploadLogFromFrontend',
+    LOG_TYPE: 106,
+}
+
+
 // 设置数据库配置文件
 const db_config = {
     // 数据库配置
@@ -67,5 +76,6 @@ module.exports = {
     account_config,
     timer_config,
     logger_config,
+    http_log_report_config,
 }
 

+ 11 - 0
config/test_config.js

@@ -24,6 +24,16 @@ const reids_token_config = {
     LAST_TOTAL_TOKEN_FREE: 'LAST_TOTAL_TOKEN_FREE',
     LAST_GAS_PRICE: 'LAST_TOKEN_GAS_PRICE',
 }
+
+
+// http 埋点上报配置
+const http_log_report_config = {
+    HOST: 'https://testapi.piaoquantv.com',
+    PATH: '/log-center/statistics/uploadLogFromFrontend',
+    LOG_TYPE: 106,
+}
+
+
 // 设置数据库配置文件
 const db_config = {
     mysql: {
@@ -66,5 +76,6 @@ module.exports = {
     account_config,
     timer_config,
     logger_config,
+    http_log_report_config,
 }
 

+ 87 - 6
model/moralis_sdk.js

@@ -7,7 +7,7 @@ var { moralis_config, reids_token_config, account_config } = require('../config/
 const redis = require("./redis_db")  //导入 db.js
 const mysql = require("./mysql_db")
 const logger = require('./logger')
-
+const report = require("./report")  //导入 db.js
 const BigNumber = require('bignumber.js')
 /* Moralis init code */
 var serverUrl = moralis_config.SERVER_URL;
@@ -134,8 +134,6 @@ const withdraw = async (obj) => {
 
 
 
-
-
 async function getAccountBalances(options) {
     await initMasterSDK();
     if (options.chain) {
@@ -310,6 +308,7 @@ async function computeTransferGasFree(obj, my_account_all_coins, tokenPrices) {
         totalCount: ret_total_count, //一共归集次数
         aGasPrice: ret_a_gas, //单个 gas 费用
         get_service_charge: service_charge,//是否需要服务费
+        transfer_obj: transfer_obj,
     };
 }
 
@@ -363,11 +362,12 @@ async function updateNativeBalance(nativeBalance, obj) {
 }
 
 //20 and native 归集
-async function transfers(obj, my_account_all_coins) {
-
+async function transfers(obj, my_account_all_coins, logParams) {
     // 优化后的归集
     if (my_account_all_coins && my_account_all_coins.transfer_arrays && Array.isArray(my_account_all_coins.transfer_arrays) && my_account_all_coins.transfer_arrays.length > 0) {
         var t_i = 0;
+        var totalGasFee = 0;
+        var collects = []
         for (let index = 0; index < my_account_all_coins.transfer_arrays.length; index++) {
             var ti = my_account_all_coins.transfer_arrays[index]
             logger.tlog('ti=', ti)
@@ -383,11 +383,34 @@ async function transfers(obj, my_account_all_coins) {
             if (isTransferSucceed(ret)) {
                 logger.tlog('start_collectCoins  respose...', ret);
                 t_i += 1
+
+                collects.push(ret);
+                //缓存当前交易的 gas 费用
+                if (ret && ti.contractAddress) {
+                    var tr = getTransferGasFree('token', ret)
+                    // tr.totalGasFree
+                    totalGasFee += parseInt(tr.totalGasFree);
+                } else {
+                    var tr = getTransferGasFree('native', ret)
+                    // tr.totalGasFree
+                    totalGasFee += parseInt(tr.totalGasFree);
+                }
             } else {
                 logger.tlog('start_collectCoins  error=', ret);
             };
         }
         if (t_i == my_account_all_coins.transfer_arrays.length) {
+            //日志埋点-归集全部所花费的 gas 费用
+            logParams.collectCoinsTotalGasFee = totalGasFee.toString();
+            logger.log('归集日志上报:', logParams);
+            logParams.type = report.REPORT_TYPE.collect_coins
+            //日志埋点-归集的响应
+            logParams.results = collects
+            var info = await queryCompanyInfoFromId(0);
+            logParams.receiver_address_total_balance_after = await queryCollectBalance(info.user_address, obj.chain)
+            //日志埋点-日志上报
+            report.logReport(logParams)
+
             return toJson(0, null, '所有币归集成功.');
         } else {
             return toJson(-1, null, '归集失败.');
@@ -465,6 +488,25 @@ const transfer_handle = async (obj) => {
 }
 
 
+async function queryCollectBalance(address, chain) {
+    // var t_chain = utils.getChainName(chain)
+
+    try {
+        var queryCollectBalance = {
+            address: address,
+            chain: chain
+        }
+        logger.log('queryCollectBalance', queryCollectBalance)
+        // 查询归集地址余额
+        // return await getAccountBalances(queryCollectBalance);
+        return await getAccountAllCoins(queryCollectBalance);
+    } catch (error) {
+        return 0;
+    }
+
+}
+
+
 
 /**
  * 用户充币地址的币转移到归集地址
@@ -479,7 +521,15 @@ const collectCoins = async (obj) => {
     //1、拿到当前账户所有的币
     //2、是否满足交易费 如果不满足则 归集地址转移 币count * 手续费 到充币地址
     //3、遍历所有币,开始转移到归集地址
+
+    // 日志上报的参数
+    var logParams = {};
+
     var my_account_all_coins = await getAccountAllCoins(obj);
+
+    //埋点日志-转账之前的充币地址余额
+    logParams.addressBalances = { ...my_account_all_coins };
+
     logger.log('collectCoins=', my_account_all_coins)
     //得到币价格
     if (process.env.NODE_ENV == 'dev') {
@@ -497,11 +547,33 @@ const collectCoins = async (obj) => {
     obj.chain = chain;
     //计算 gas 费用 是否需要归集
     var transFerGasFree = await computeTransferGasFree(obj, my_account_all_coins, obj.tokenPrices);
+
+    //埋点日志- 需要归集的 native token
+    if (transFerGasFree.transfer_obj && Array.isArray(transFerGasFree.transfer_obj)) {
+        logParams.transfers = []
+        for (let index = 0; index < transFerGasFree.transfer_obj.length; index++) {
+            const element = transFerGasFree.transfer_obj[index];
+            logParams.transfers.push({ ...element })
+        }
+    }
+
     logger.log('computeTransferGasFree=', transFerGasFree)
+    logger.log(' logParams.transfers=', logParams.transfers)
     if (transFerGasFree) {
         // return
     }
 
+    // var infos = await queryCompanyInfoFromId(0);
+
+    // var temp_obj = { ...obj }
+    // temp_obj.address = infos.user_address;
+    // temp_obj.chain = chain;
+
+    // var tempCollectBalance = await queryCollectBalance(infos.user_address, chain)
+
+    // var tempCollectBalance = await getAccountAllCoins(temp_obj);
+    // logger.log('tempCollectBalance', tempCollectBalance)
+
     //是否需要归集
     if (transFerGasFree.totalCount > 0) {
         //需要转移 gas 费 
@@ -516,12 +588,18 @@ const collectCoins = async (obj) => {
                 // address: account_config.WELLET_PUBLIC_KEY, //todo 正式环境需要替换从 mysql read
                 address: info.user_address, //todo 正式环境需要替换从 mysql read
             }
+            //埋点日志-预存 gas 付费
+            logParams.prestore_gas_fee = { ...obj_wd };
+
+            logParams.receiver_address_total_balance_before = await queryCollectBalance(info.user_address, chain)
+            logParams.company_public_key = info.user_address
             logger.log('开始充值 gas ', obj_wd)
             var ret = await withdraw(obj_wd)
             logger.log('充值完成 gas ', ret)
 
             if (!isTransferSucceed(ret)) return ret;
 
+
             var transfer = getTransferGasFree('native', ret)
             logger.log('getTransferGasFree transfer =', transfer)
             if (transfer && transfer.nativeValue > 0) {
@@ -536,7 +614,7 @@ const collectCoins = async (obj) => {
         obj.chain = chain;
         obj.transFerGasFree = transFerGasFree;
         logger.log('transfers--->', obj);
-        var ret = await transfers(obj, my_account_all_coins);
+        var ret = await transfers(info, my_account_all_coins, logParams);
         logger.log('归集结果=', ret);
         return ret;
     }
@@ -816,6 +894,9 @@ module.exports = {
     isTransferSucceed,
     getTransferRecordGasFree,
     pushCollectConisObj,
+    getTransferGasFree,
+    queryCollectBalance,
+    queryCompanyInfoFromId,
 }
 
 

+ 91 - 0
model/report.js

@@ -0,0 +1,91 @@
+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 logger = require('./logger')
+
+//埋点文档 https://st94nif1cq.feishu.cn/docs/doccnoEvFRxdD0zy4I0MVhzCMLg#
+//测试环境阿里 https://sls.console.aliyun.com/lognext/project/wqsd-longvideo-frontend-log-test/logsearch/denet-event-log
+
+const REPORT_TYPE = {
+    transfer_record: 'transfer_record',
+    collect_coins: 'collect_coins',
+    withdraw: 'withdraw'
+}
+
+
+const http_request_post = async (params) => {
+    var data = {
+        baseInfo: {},
+        params: {
+            eventData: JSON.stringify(params.eventData),
+            logType: params.logType,
+        },
+    }
+
+    var host = http_log_report_config.HOST
+    var path = http_log_report_config.PATH
+    var url = host + path
+    logger.log('http_request_post', JSON.stringify(data), url)
+    axios.post(url, data)
+        .then(res => {
+            logger.log('res=>', res);
+        }).catch(err => {
+            logger.error('http_request_post', err);
+        });
+}
+
+/**
+ * 日志埋点上报
+ * @param {*} obj 
+ */
+const logReport = async (obj) => {
+    switch (obj.type) {
+        case REPORT_TYPE.transfer_record:
+            var results;
+            if (obj.results) {
+                var rets = JSON.parse(obj.results)
+                if (rets.code == 0 && rets.data && rets.data.result) {
+                    results = rets.data.result.filter(element => {
+                        console.log('filter', element, obj.address)
+                        return element.to_address.toString().toLowerCase() == obj.address.toString().toLowerCase()
+                    })
+                    console.log('filter results', results)
+                    if (results) {
+                        obj.results = results
+                    }
+                }
+            }
+            var params = {
+                eventData: obj
+            }
+            params.logType = http_log_report_config.LOG_TYPE
+            logger.log('transfer_record')
+            http_request_post(params);
+            break
+
+        case REPORT_TYPE.collect_coins:
+            logger.log('collect_coins')
+            var params = {
+                eventData: obj
+            }
+            params.logType = http_log_report_config.LOG_TYPE
+            http_request_post(params);
+            break
+
+        case REPORT_TYPE.withdraw:
+            logger.log('withdraw')
+            var params = {
+                eventData: obj
+            }
+            params.logType = http_log_report_config.LOG_TYPE
+            http_request_post(params);
+            break
+    }
+}
+
+module.exports = {
+    logReport,
+    REPORT_TYPE,
+}

+ 94 - 8
package-lock.json

@@ -8,6 +8,7 @@
       "name": "denet-node-server",
       "version": "0.1.0",
       "dependencies": {
+        "axios": "^0.27.2",
         "bignumber.js": "^9.0.2",
         "crypto-js": "^4.1.1",
         "debug": "^4.1.1",
@@ -1725,6 +1726,11 @@
         "wrappy": "1"
       }
     },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+    },
     "node_modules/atob": {
       "version": "2.1.2",
       "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz",
@@ -1738,11 +1744,12 @@
       }
     },
     "node_modules/axios": {
-      "version": "0.26.1",
-      "resolved": "https://registry.npmmirror.com/axios/-/axios-0.26.1.tgz",
-      "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
+      "version": "0.27.2",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-0.27.2.tgz",
+      "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
       "dependencies": {
-        "follow-redirects": "^1.14.8"
+        "follow-redirects": "^1.14.9",
+        "form-data": "^4.0.0"
       }
     },
     "node_modules/babel-runtime": {
@@ -4496,6 +4503,17 @@
       "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
       "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
     },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
     "node_modules/commander": {
       "version": "2.20.3",
       "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
@@ -5396,6 +5414,14 @@
         "node": ">= 6"
       }
     },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/delegates/-/delegates-1.0.0.tgz",
@@ -6601,6 +6627,19 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/fragment-cache": {
       "version": "0.2.1",
       "resolved": "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz",
@@ -10138,6 +10177,14 @@
         "crypto-js": "4.1.1"
       }
     },
+    "node_modules/moralis/node_modules/axios": {
+      "version": "0.26.1",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-0.26.1.tgz",
+      "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
+      "dependencies": {
+        "follow-redirects": "^1.14.8"
+      }
+    },
     "node_modules/ms": {
       "version": "2.1.2",
       "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
@@ -16998,6 +17045,11 @@
         }
       }
     },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+    },
     "atob": {
       "version": "2.1.2",
       "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz",
@@ -17005,11 +17057,12 @@
       "dev": true
     },
     "axios": {
-      "version": "0.26.1",
-      "resolved": "https://registry.npmmirror.com/axios/-/axios-0.26.1.tgz",
-      "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
+      "version": "0.27.2",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-0.27.2.tgz",
+      "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
       "requires": {
-        "follow-redirects": "^1.14.8"
+        "follow-redirects": "^1.14.9",
+        "form-data": "^4.0.0"
       }
     },
     "babel-runtime": {
@@ -19269,6 +19322,14 @@
       "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
       "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
     },
+    "combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
     "commander": {
       "version": "2.20.3",
       "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
@@ -19985,6 +20046,11 @@
         "vm2": "^3.9.8"
       }
     },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+    },
     "delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/delegates/-/delegates-1.0.0.tgz",
@@ -20957,6 +21023,16 @@
         "for-in": "^1.0.1"
       }
     },
+    "form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      }
+    },
     "fragment-cache": {
       "version": "0.2.1",
       "resolved": "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz",
@@ -23845,6 +23921,16 @@
         "uuid": "^8.3.2",
         "ws": "^8.3.0",
         "xmlhttprequest": "1.8.0"
+      },
+      "dependencies": {
+        "axios": {
+          "version": "0.26.1",
+          "resolved": "https://registry.npmmirror.com/axios/-/axios-0.26.1.tgz",
+          "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
+          "requires": {
+            "follow-redirects": "^1.14.8"
+          }
+        }
       }
     },
     "ms": {

+ 1 - 0
package.json

@@ -9,6 +9,7 @@
     "test": "echo \"Error: no test specified\" && exit 1"
   },
   "dependencies": {
+    "axios": "^0.27.2",
     "bignumber.js": "^9.0.2",
     "crypto-js": "^4.1.1",
     "debug": "^4.1.1",

+ 33 - 0
routes/sdk.js

@@ -5,6 +5,7 @@ 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 report = require("../model/report")  //导入 db.js
 /**
  * 获取代币价格
  * @param {*} ctx 
@@ -34,10 +35,18 @@ async function getTransfers(ctx) {
 
     await moralis.getTokenTransfers(obj).then((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)
@@ -95,8 +104,32 @@ async function withdraw(ctx) {
         return
     }
     const obj = ctx.request.body;
+    var log_obj = { ...obj }
+    var info = await moralis.queryCompanyInfoFromId(0);
+    log_obj.receiver_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);
     await moralis.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)
+        }
+
     });
 }