utils.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. 'use strict'
  2. var CryptoJS = require("crypto-js");
  3. require('dotenv').config()
  4. const logger = require('./logger')
  5. const chinaTime = require('china-time');
  6. var { cryppt_config } = require('../config/config.js')
  7. const moment = require('moment-timezone');
  8. function toJson(code_, obj_, errMsg_) {
  9. var code = code_
  10. var data = obj_
  11. var errMsg = errMsg_
  12. let jopt = { code, data, errMsg };
  13. return JSON.stringify(jopt)
  14. }
  15. function decryptJson(message, key) {
  16. }
  17. /**
  18. *
  19. * @param {*} crypt_key 密文
  20. * @param {*} message 待解密的内容 U2FsdGVkX18zHfDE3lO2yVxk2lMCEiwjrzYo1ZbHqfriFapZWXqLhczs9J0cN9EnvQR64GLRzYDgzMuAr9U1C0LZjA5mV4cSAZeBOrY8KNY09+BhTDetb2/43bIwiFR6
  21. */
  22. function decryptPrivityKey(message) {
  23. // var encrypted = 'Zc4v3uJgPY+BVg/IrDLA4aIk9ko/UrgjAtBTLqymdMAvmqdp1GttRjkBgNNNTyxA+3ThbIGlM0INeeHGicYVbLea4ymkty8gd30rZXQ4yYQ='; //python is base64 ECB
  24. // var key = '0IPmaec1o9FQCqGN'//key used in Python
  25. // var iv = 'Zh4A7bOY2ksp9oIn'
  26. var encrypted = message; //python is base64 ECB
  27. var key = process.env.DENET_CRYPT_KEY
  28. var iv = process.env.DENET_CRYPT_IV
  29. if (!key || !iv) {
  30. logger.error('decryptPrivityKey key or iv is empty?');
  31. return null;
  32. }
  33. logger.log('encrypted=', encrypted);
  34. // logger.log('decryptPrivityKey key= iv=', key, iv);
  35. key = CryptoJS.enc.Utf8.parse(key);
  36. // var decrypted = CryptoJS.AES.decrypt(encrypted, key, {mode:CryptoJS.mode.ECB});
  37. iv = CryptoJS.enc.Utf8.parse(iv)
  38. var decrypted = CryptoJS.AES.decrypt(encrypted, key, { iv: iv, mode: CryptoJS.mode.CBC });
  39. var de_pk = decrypted.toString(CryptoJS.enc.Utf8);
  40. // logger.log('decrypted==', de_pk);
  41. return de_pk
  42. }
  43. // console.log('decryptPrivityKey 1',decryptPrivityKey('8C9oepm9euh9UwPfqVf0QaP5qUjZsghT/rRlM3I1NemLACM8N4yx0wHgHnH5sZGM/ai5yg1MJnJMbfmApss/y5Chq8Ys+mZjIVrru2IWl/I='))
  44. // console.log('decryptPrivityKey 2',decryptPrivityKey('4Uz4Jm7Xd1gH+1nFbR0B7hk1ITmsT8O3iAgS/hC0L9TkrqAZoklsQhXl4fA1X+uqpckF4HtnXnMpwng94GvvzsRfXYirfDfboneuzfc0o7s='))
  45. // console.log('decryptPrivityKey 3',decryptPrivityKey('mNSzG6qmijKGldl4EJ9qViv4L5nWjkxR66Xd6E31OS3wiYY55aCfL8w0eYM3GC8bkNTFpQf'))
  46. // 密钥
  47. const SECRET_KEY = CryptoJS.enc.Utf8.parse(cryppt_config.WITHDRAW_KEY);
  48. // 密钥偏移量
  49. const SECRET_IV = CryptoJS.enc.Utf8.parse("68F37CFC40C330D9FAAC0A16D49C8AD5");
  50. /**
  51. * 加密方法
  52. * @param data
  53. * @returns {string}
  54. */
  55. function encrypt(data) {
  56. if (typeof data === "object") {
  57. try {
  58. data = JSON.stringify(data);
  59. } catch (error) {
  60. console.log("encrypt error:", error);
  61. }
  62. }
  63. const dataHex = CryptoJS.enc.Utf8.parse(data);
  64. const encrypted = CryptoJS.AES.encrypt(dataHex, SECRET_KEY, {
  65. mode: CryptoJS.mode.ECB,
  66. padding: CryptoJS.pad.Pkcs7
  67. });
  68. return encrypted.ciphertext.toString();
  69. }
  70. /**
  71. * 解密方法
  72. * @param data
  73. * @returns {string}
  74. */
  75. function decrypt(data) {
  76. // const key = CryptoJS.enc.Hex.parse(SECRET_KEY);
  77. const decrypt = CryptoJS.AES.decrypt(data, SECRET_KEY, {
  78. mode: CryptoJS.mode.ECB,
  79. padding: CryptoJS.pad.Pkcs7
  80. });
  81. return CryptoJS.enc.Utf8.stringify(decrypt).toString();
  82. }
  83. const CHAIN_NAME = {
  84. eth: 'eth',
  85. bsc_testnet: 'bsc testnet',
  86. bsc_mainnet: 'bsc',
  87. czz: 'czz',
  88. kcc_testnet: 'kcc_testnet',
  89. kcc_mainnet: 'kcc_mainnet',
  90. okc_testnet: 'okc_testnet',
  91. okc_mainnet: 'okc_mainnet',
  92. ethf: 'ethf'
  93. }
  94. const CHAIN_TOKEN_TYPE = {
  95. bsc_testnet: 'erc20',
  96. bsc_mainnet: 'erc20',
  97. czz: 'czz',
  98. kcc_testnet: 'kcc_testnet',
  99. kcc_mainnet: 'kcc_mainnet',
  100. okc_testnet: 'okc_testnet',
  101. okc_mainnet: 'okc_mainnet',
  102. ethf: 'ethf'
  103. }
  104. const CHAIN_ID = {
  105. eth: '0x1',
  106. bsc_testnet: '0x61',
  107. // bsc_mainnet: '0x38',
  108. bsc_mainnet: '56',
  109. czz: '2019',
  110. kcc_testnet: '322',
  111. kcc_mainnet: '321',
  112. okc_testnet: '65',
  113. okc_mainnet: '66',
  114. ethf: '513100'
  115. }
  116. const CHAIN_ID_NAME = {
  117. 97: 'bsc_testnet',
  118. 56: 'bsc',
  119. 2019: 'czz',
  120. 65: 'okc',
  121. 66: 'okc',
  122. 321: 'kcc',
  123. 322: 'kcc',
  124. '0x38': 'bsc',
  125. 513100: 'ethf'
  126. }
  127. const USE_SDK = {
  128. MORALIS: 'moralis',
  129. DENET: 'denet',
  130. }
  131. function getRedisKeyFromChain(chain) {
  132. switch (chain) {
  133. case CHAIN_NAME.bsc_mainnet:
  134. case CHAIN_NAME.bsc_testnet:
  135. case 'bsc_testnet':
  136. case 'bsc_mainnet':
  137. case '97':
  138. case '56':
  139. return '_BSC'
  140. case CHAIN_NAME.czz:
  141. case CHAIN_ID.czz:
  142. return '_CZZ'
  143. case CHAIN_NAME.kcc_mainnet:
  144. case CHAIN_NAME.kcc_testnet:
  145. case CHAIN_ID.kcc_mainnet:
  146. case CHAIN_ID.kcc_testnet:
  147. case 'kcc':
  148. return '_KCC'
  149. case CHAIN_NAME.okc_mainnet:
  150. case CHAIN_NAME.okc_testnet:
  151. case CHAIN_ID.okc_mainnet:
  152. case CHAIN_ID.okc_testnet:
  153. case 'okc':
  154. return '_OKC'
  155. default:
  156. return '_' + chain.toUpperCase()
  157. }
  158. }
  159. function getChainNameFromChain(chain) {
  160. logger.info('getChainNameFromChain', chain)
  161. switch (chain) {
  162. case CHAIN_NAME.bsc_mainnet:
  163. case CHAIN_NAME.bsc_testnet:
  164. case 'bsc_testnet':
  165. case 'bsc_mainnet':
  166. case '97':
  167. case '56':
  168. return 'bsc'
  169. case CHAIN_NAME.czz:
  170. case CHAIN_ID.czz:
  171. return 'czz'
  172. case CHAIN_NAME.kcc_mainnet:
  173. case CHAIN_NAME.kcc_testnet:
  174. case CHAIN_ID.kcc_mainnet:
  175. case CHAIN_ID.kcc_testnet:
  176. return 'kcc'
  177. case CHAIN_NAME.okc_mainnet:
  178. case CHAIN_NAME.okc_testnet:
  179. case CHAIN_ID.okc_mainnet:
  180. case CHAIN_ID.okc_testnet:
  181. return 'okc'
  182. case CHAIN_ID.ethf:
  183. case 'ethf':
  184. return 'ethf'
  185. default:
  186. return null
  187. }
  188. }
  189. function getTokenTransferType(chain) {
  190. switch (chain) {
  191. case CHAIN_NAME.bsc_mainnet:
  192. case CHAIN_NAME.bsc_testnet:
  193. case 'bsc_testnet':
  194. case 'bsc_mainnet':
  195. case '97':
  196. case '56':
  197. return 'erc20'
  198. default:
  199. return 'token'
  200. }
  201. }
  202. function trim(str) {
  203. try {
  204. return str.replace(/(^\s*)|(\s*$)/g, "");
  205. } catch (error) {
  206. logger.error('trim error', error.toString())
  207. return str
  208. }
  209. }
  210. function getChainName(key) {
  211. return CHAIN_NAME[key];
  212. }
  213. function getChainIdToName(key) {
  214. return CHAIN_ID_NAME[key];
  215. }
  216. function getChainId(key) {
  217. return CHAIN_ID[key];
  218. }
  219. function sleep(time) {
  220. return new Promise((resolve) => setTimeout(resolve, time));
  221. }
  222. function getTimestamp() {
  223. return new Date().getTime()
  224. }
  225. function contain(str, char) {
  226. try {
  227. return str.indexOf(char) != -1
  228. } catch (error) {
  229. logger.error()
  230. return false
  231. }
  232. }
  233. function getCurrentDate() {
  234. return chinaTime('YYYY-MM-DD HH:mm:ss');
  235. }
  236. function getCurrentDateFormat(format) {
  237. return chinaTime(format);
  238. }
  239. function chinaTimeMs(ms) {
  240. return moment(ms).tz('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss');
  241. }
  242. function getLastDay(day, format) {
  243. return day ?
  244. moment().subtract(day, 'day').tz('Asia/Shanghai').format(format) :
  245. moment().subtract(1, 'day').tz('Asia/Shanghai').format(format)
  246. }
  247. function getTimestampToDate(tm) {
  248. var now = new Date(tm),
  249. y = now.getFullYear(),
  250. m = now.getMonth() + 1,
  251. d = now.getDate();
  252. return y + '-' + (m < 10 ? '0' + m : m) + '-' + (d < 10 ? '0' + d : d) + 'T' + now.toTimeString().substr(0, 8) + '.000Z';
  253. }
  254. /**
  255. * @description 科学计数法转为string
  256. * @param {string, number} param
  257. */
  258. function scientificNotationToString(param) {
  259. try {
  260. let strParam = String(param)
  261. let flag = /e/.test(strParam)
  262. if (!flag) return param
  263. // 指数符号 true: 正,false: 负
  264. let sysbol = true
  265. if (/e-/.test(strParam)) {
  266. sysbol = false
  267. }
  268. // 指数
  269. let index = Number(strParam.match(/\d+$/)[0])
  270. // 基数
  271. let basis = strParam.match(/^[\d\.]+/)[0].replace(/\./, '')
  272. if (sysbol) {
  273. return basis.padEnd(index + 1, 0)
  274. } else {
  275. return basis.padStart(index + basis.length, 0).replace(/^0/, '0.')
  276. }
  277. } catch (error) {
  278. return param.toString()
  279. }
  280. }
  281. module.exports = {
  282. toJson,
  283. decryptPrivityKey,
  284. getChainName,
  285. getChainId,
  286. CHAIN_NAME,
  287. CHAIN_ID,
  288. USE_SDK,
  289. sleep,
  290. encrypt,
  291. decrypt,
  292. getTimestamp,
  293. getChainIdToName,
  294. getCurrentDate,
  295. getCurrentDateFormat,
  296. scientificNotationToString,
  297. getTimestampToDate,
  298. getRedisKeyFromChain,
  299. trim,
  300. getLastDay,
  301. chinaTimeMs,
  302. contain,
  303. getTokenTransferType,
  304. getChainNameFromChain,
  305. }