server_data_statistics.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. const logger = require('../model/logger')
  2. var remote_config_db = require("../model/db/remote_config_db");
  3. var collect_coins_db = require("../model/db/collect_coins_db");
  4. var withdraw_db = require("../model/db/withdraw_db");
  5. var moralis = require("../model/moralis_sdk");
  6. var utils = require("../model/utils");
  7. const axios = require('axios');
  8. var { account_config } = require('../config/config.js');
  9. const { max } = require('moment');
  10. //########################################### 出入金数据统计 ########################################
  11. const http_request_get = async (data) => {
  12. var host = account_config.STATISTICS_URL
  13. var path = data
  14. var url = host + path
  15. logger.log('http_request_get', url)
  16. return new Promise(response => {
  17. axios.get(url)
  18. .then(res => {
  19. logger.log('res=>', res.status, res.data);
  20. if (res.data.code == 0) {
  21. response(res.data)
  22. } else {
  23. response({
  24. code: 0,
  25. msg: err.toString(),
  26. data: {
  27. canNotWithdrawUSD: '0',
  28. canWithdrawUSD: '0',
  29. incomeUSDTotal: '0',
  30. incomeUSDFee: '0'
  31. }
  32. })
  33. }
  34. }).catch(err => {
  35. logger.error('http_request_get', err.toString(), url.toString());
  36. response({
  37. code: -1,
  38. msg: err.toString(),
  39. data: {
  40. canNotWithdrawUSD: '0',
  41. canWithdrawUSD: '0',
  42. incomeUSDTotal: '0',
  43. incomeUSDFee: '0'
  44. }
  45. })
  46. });
  47. })
  48. }
  49. function computeAddressPrice(total_in_coins) {
  50. //计算总的价格
  51. for (key of total_in_coins.keys()) {
  52. var item = total_in_coins.get(key)
  53. var amount = item.amount
  54. var usdPrice = item.usdPrice
  55. if (key == '0x0000000000000000000000000000000000000000') {
  56. item.totalUsdPrice = parseFloat(amount) / parseFloat(10 ** 18) * parseFloat(usdPrice)
  57. } else {
  58. var decimals = 18
  59. try {
  60. // decimals = await redis.readRedis('REDIS_ERC20_CONTRACT_DECIMALS_' + element.token_address.toLowerCase())
  61. decimals = await redis.readAppendRedis('REDIS_ERC20_CONTRACT_DECIMALS', item.chain, key.toLowerCase())
  62. } catch (error) {
  63. decimals = 18
  64. }
  65. item.totalUsdPrice = parseFloat(amount) / parseFloat(decimals) * parseFloat(usdPrice)
  66. }
  67. }
  68. }
  69. async function filterCollectCoinsLists(collect_ret, filterTypt) {
  70. const total_in_coins = new Map();
  71. var total_gas_fee = 0
  72. for (let index = 0; index < collect_ret.results.length; index++) {
  73. const element = collect_ret.results[index];
  74. if (element.chain == null || element.chain == filterTypt) {
  75. var before_gas_fee = element.before_gas_fee ? BigInt(element.before_gas_fee) : BigInt('0')
  76. total_gas_fee = BigInt(element.total_gas_fee) + BigInt(before_gas_fee) + BigInt(total_gas_fee)
  77. if (element.transfers) {
  78. var opts = JSON.parse(element.transfers)
  79. for (let index = 0; index < opts.length; index++) {
  80. const transfers = opts[index];
  81. var address = transfers.contractAddress ? transfers.contractAddress : '0x0000000000000000000000000000000000000000'
  82. if (total_in_coins.get(address) != null) {
  83. var ins = total_in_coins.get(address)
  84. ins.amount = BigInt(ins.amount) + BigInt(transfers.amount)
  85. total_in_coins.set(address, ins)
  86. } else {
  87. total_in_coins.set(address, {
  88. amount: BigInt(transfers.amount), //总入金
  89. usdPrice: transfers.usdPrice,
  90. chain: transfers.chain,
  91. })
  92. }
  93. }
  94. }
  95. }
  96. }
  97. //计算总的价格
  98. computeAddressPrice(total_in_coins)
  99. //获取 total gas
  100. try {
  101. if (total_in_coins.size > 0) {
  102. switch (filterTypt) {
  103. case 'bsc_testnet':
  104. case 'bsc_mainnet':
  105. var price = await moralis.getAllTotkenPrice({ chain: 'bsc_testnet' })
  106. if (typeof price === 'string') {
  107. price = JSON.parse(price)
  108. }
  109. var bnbPriceItem = moralis.findTokenPriceItem('0x0000000000000000000000000000000000000000', price)
  110. total_gas_fee = parseFloat(total_gas_fee) / parseFloat(10 ** 18) * parseFloat(bnbPriceItem.usdPrice)
  111. logger.info('new-total_gas_fee ', total_gas_fee, bnbPriceItem)
  112. break
  113. case 'czz':
  114. var price = await moralis.getAllTotkenPrice({ chain: 'czz' })
  115. if (typeof price === 'string') {
  116. price = JSON.parse(price)
  117. }
  118. var czzPriceItem = moralis.findTokenPriceItem('0x0000000000000000000000000000000000000000', price)
  119. total_gas_fee = parseFloat(total_gas_fee) / parseFloat(10 ** 18) * parseFloat(czzPriceItem.usdPrice)
  120. logger.info('new-total_gas_fee czz', total_gas_fee, czzPriceItem)
  121. break
  122. }
  123. }
  124. } catch (error) {
  125. logger.error('total_gas_fee', error)
  126. }
  127. return {
  128. map: total_in_coins,
  129. totalGasFee: total_gas_fee //总入金所消耗的 gas fee
  130. }
  131. }
  132. async function getCollectCoinsOutInfo(startTime, endTime) {
  133. var collect_ret = await collect_coins_db.query_collect_total_fee(startTime, endTime);
  134. logger.info('getCollectCoinsOutInfo query_collect_total_fee', startTime, endTime, collect_ret)
  135. var bsc_env
  136. switch (process.env.NODE_ENV) {
  137. case 'dev':
  138. case 'test':
  139. bsc_env = 'bsc_testnet'
  140. break
  141. case 'prd':
  142. bsc_env = 'bsc_mainnet'
  143. break
  144. default:
  145. bsc_env = 'bsc_mainnet'
  146. break
  147. }
  148. var bsc_envnet = await filterCollectCoinsLists(collect_ret, bsc_env)
  149. logger.info('getCollectCoinsOutInfo bsc_env', bsc_env, bsc_envnet)
  150. var czz = await filterCollectCoinsLists(collect_ret, 'czz')
  151. logger.info('getCollectCoinsOutInfo czz', czz)
  152. logger.info('getCollectCoinsOutInfo total ', bsc_envnet.totalGasFee, czz.totalGasFee)
  153. return {
  154. bsc: bsc_envnet.map,
  155. czz: czz.map,
  156. totalGasFee: bsc_envnet.totalGasFee + czz.totalGasFee
  157. }
  158. }
  159. async function getWithdrawOutInfo(startTime, endTime) {
  160. if (startTime && endTime) {
  161. startTime = '1655049600000'
  162. endTime = '1655135999000'
  163. }
  164. var withdraw_ret = await withdraw_db.getWidthdrawTotalFee(startTime, endTime)
  165. const withdraw_map = new Map();
  166. for (let index = 0; index < withdraw_ret.length; index++) {
  167. const element = withdraw_ret[index];
  168. if (element.gas_price && element.gas_limit)
  169. var total_gas_fee2 = (BigInt(element.gas_price) * BigInt(element.gas_limit))
  170. if (withdraw_map.get(element.chain_id) != null) {
  171. var ins = withdraw_map.get(element.chain_id)
  172. withdraw_map.set(element.chain_id, BigInt(ins) + BigInt(total_gas_fee2))
  173. } else {
  174. withdraw_map.set(element.chain_id, BigInt(total_gas_fee2))
  175. }
  176. }
  177. var keys = withdraw_map.keys();
  178. var total_gas_fee = 0
  179. for (key of keys) {
  180. console.log(key, withdraw_map.get(key)); // map.get(key)可得value值。
  181. var value = withdraw_map.get(key)
  182. //获取币价
  183. try {
  184. if (key == 2019) {
  185. var price = await moralis.getAllTotkenPrice({ chain: 'czz' })
  186. if (typeof price === 'string') {
  187. price = JSON.parse(price)
  188. }
  189. var czzPriceItem = moralis.findTokenPriceItem('0x0000000000000000000000000000000000000000', price)
  190. total_gas_fee += parseFloat(value) / parseFloat(10 ** 18) * parseFloat(czzPriceItem.usdPrice)
  191. logger.info('new-total_gas_fee czz', total_gas_fee, czzPriceItem)
  192. } else {
  193. var price = await moralis.getAllTotkenPrice({ chain: 'bsc_testnet' })
  194. if (typeof price === 'string') {
  195. price = JSON.parse(price)
  196. }
  197. var bnbPriceItem = moralis.findTokenPriceItem('0x0000000000000000000000000000000000000000', price)
  198. total_gas_fee += parseFloat(value) / parseFloat(10 ** 18) * parseFloat(bnbPriceItem.usdPrice)
  199. logger.info('new-total_gas_fee bsc', total_gas_fee, bnbPriceItem)
  200. }
  201. } catch (error) {
  202. logger.error('total_gas_fee', error)
  203. }
  204. }
  205. return {
  206. totalGasFee: total_gas_fee
  207. };
  208. }
  209. /**
  210. * 获取时间段总支出的 gas fee
  211. * @param {*} startTime
  212. * @param {*} endTime
  213. */
  214. async function getStatisticsInfo() {
  215. // //今日
  216. var startTime = utils.getLastDay('YYYY-MM-DD') + " 00:00:00"
  217. var endTime = utils.getLastDay('YYYY-MM-DD') + " 23:59:59"
  218. logger.info('getTotalOutGasFee', startTime, endTime)
  219. //归集
  220. var collectCoinsOut = await getCollectCoinsOutInfo(startTime, endTime)
  221. logger.info('getCollectCoinsOutInfo collectCoinsOut', collectCoinsOut)
  222. //提币
  223. var withdrawOut = await getWithdrawOutInfo(startTime, endTime)
  224. logger.info('getWithdrawOutInfo withdrawOut ', withdrawOut)
  225. var data = await http_request_get(utils.getLastDay('YYYYMMDD'))
  226. //历史,总的
  227. //归集
  228. var totalCollectCoinsOut = await getCollectCoinsOutInfo(null, null)
  229. logger.info('totalCollectCoinsOut ', totalCollectCoinsOut)
  230. //提币
  231. var totalWithdrawOut = await getWithdrawOutInfo(null, null)
  232. logger.info('totalWithdrawOut ', totalWithdrawOut)
  233. return {
  234. todayTotalOutGasFee: collectCoinsOut.totalGasFee + withdrawOut.totalGasFee, //今日总支出的 gas fee
  235. todayCanNotWithdrawUSD: data.data.canNotWithdrawUSD, //今日不可提现余额
  236. todayCanWithdrawUSD: data.data.canWithdrawUSD, //今日可提现余额
  237. todayIncomeUSDTotal: data.data.incomeUSDTotal, //今日总收入
  238. todayIncomeUSDFee: data.data.incomeUSDFee, //今日固定收入
  239. totalOutGasFee: totalCollectCoinsOut.totalGasFee + totalWithdrawOut.totalGasFee, //总支出 gas fee
  240. totalWithdrawGasFee: totalWithdrawOut.totalGasFee, //总提币 gas fee
  241. totalCollectCoinsGasFee: totalCollectCoinsOut.totalGasFee, //总归集 gas fee
  242. totalInFee: 0, //总入金
  243. totalOutFee: 0, //总出金
  244. totalbalances: null, //总余额
  245. ylGasBalance: 0, //预留 gas 费余额 native 总余额 - 总入金
  246. slGasBalance: 0, //散落 gas 费余额 充值 0.5 gas - 使用 0.3 gas= 散落 0.2gas
  247. }
  248. }
  249. module.exports = {
  250. getStatisticsInfo
  251. }