|
@@ -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')
|
|
@@ -27,13 +27,19 @@ var isExecCollect = false;
|
|
|
var masterInit = false
|
|
|
var secretInit = false
|
|
|
|
|
|
-
|
|
|
// 对 shib 做限制
|
|
|
const SHIB_AMOUNT_LIMIT = 20000
|
|
|
const SHIB_AMOUNT_FEE_LIMIT = 10000
|
|
|
const SHIB_ADDRESS = '0x2859e4544C4bB03966803b044A93563Bd2D0DD4D'
|
|
|
|
|
|
|
|
|
+
|
|
|
+// logger.log('Moralis.settings',Moralis)
|
|
|
+// Moralis.settings.setAPIRateLimit({
|
|
|
+// anonymous:10, authenticated:20, windowMs:60000
|
|
|
+// })
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 初始化 moralis
|
|
|
* https://st94nif1cq.feishu.cn/docs/doccnNxG2UwHPCdZXbywgbdy13f#
|
|
@@ -175,7 +181,7 @@ async function getAccountBalances(options) {
|
|
|
return aar;
|
|
|
}
|
|
|
} catch (error) {
|
|
|
- logger.error('getAccountBalances error:', error)
|
|
|
+ logger.error('getBalances error:', error.toString(), JSON.stringify(options))
|
|
|
return null
|
|
|
}
|
|
|
|
|
@@ -226,10 +232,8 @@ async function computeTransferGasFree(obj, my_account_all_coins, tokenPrices) {
|
|
|
var receiver_info = await queryCompanyInfoFromId(0);
|
|
|
//得到 20 币 满足 1美刀的 count
|
|
|
if (Array.isArray(my_account_all_coins.other) && my_account_all_coins.other.length > 0) {
|
|
|
-
|
|
|
for (let index = 0; index < my_account_all_coins.other.length; index++) {
|
|
|
const element = my_account_all_coins.other[index];
|
|
|
- // }
|
|
|
// my_account_all_coins.other.forEach(element => {
|
|
|
logger.log('20 element=', element);
|
|
|
var find_transfer_item = findTokenPriceItem(element.token_address, tokenPrices);
|
|
@@ -243,10 +247,10 @@ async function computeTransferGasFree(obj, my_account_all_coins, tokenPrices) {
|
|
|
|
|
|
if (find_transfer_item) {
|
|
|
var total_all_usdprice = calculate_total_usdprice(element.balance, element.decimals, find_transfer_item.usdPrice);
|
|
|
- logger.debug('findTokenPriceItem ret=', element.token_address, find_transfer_item, total_all_usdprice);
|
|
|
+ logger.log('findTokenPriceItem ret=', element.token_address, find_transfer_item, total_all_usdprice);
|
|
|
if (find_transfer_item && total_all_usdprice > 1.0) {
|
|
|
tokenCount += 1;
|
|
|
- logger.debug('token > 1.0', tokenCount, element.token_address);
|
|
|
+ logger.log('token > 1.0', tokenCount, element.token_address);
|
|
|
|
|
|
var obj_20 = {
|
|
|
chain: obj.chain,
|
|
@@ -259,7 +263,7 @@ async function computeTransferGasFree(obj, my_account_all_coins, tokenPrices) {
|
|
|
transfer_obj.push(obj_20)
|
|
|
}
|
|
|
} else {
|
|
|
- logger.log('findTokenPriceItem error=', element);
|
|
|
+ logger.log('findTokenPriceItem not fount =', element);
|
|
|
}
|
|
|
// });
|
|
|
}
|
|
@@ -280,17 +284,17 @@ async function computeTransferGasFree(obj, my_account_all_coins, tokenPrices) {
|
|
|
//计算 native 是否满足 1美刀
|
|
|
logger.log('isTransferGasFree token count:', tokenCount);
|
|
|
var nativeAllBalance = 0;
|
|
|
- if (my_account_all_coins.native.balance)
|
|
|
+ if (my_account_all_coins.native && my_account_all_coins.native.balance)
|
|
|
nativeAllBalance = my_account_all_coins.native.balance
|
|
|
var nativeCount = 0
|
|
|
var nativePriceItem = findTokenPriceItem('0x0000000000000000000000000000000000000000', tokenPrices);//todo 线上环境需要换
|
|
|
- logger.debug('native nativePriceItem=', nativePriceItem, nativeAllBalance);
|
|
|
+ logger.log('native nativePriceItem=', nativePriceItem, nativeAllBalance);
|
|
|
if (nativePriceItem) {
|
|
|
var total_all_usdprice = calculate_total_usdprice(nativeAllBalance, '18', nativePriceItem.usdPrice);
|
|
|
- logger.debug('native total_all_usdprice=', total_all_usdprice);
|
|
|
+ logger.log('native total_all_usdprice=', total_all_usdprice);
|
|
|
if (total_all_usdprice > 1.0) {
|
|
|
nativeCount = 1;
|
|
|
- logger.debug('native > 1.0', tokenCount);
|
|
|
+ logger.log('native > 1.0', tokenCount);
|
|
|
|
|
|
var lastBnbFree = await redis.readRedis(reids_token_config.LAST_TOTAL_BNB_FREE)
|
|
|
logger.log('LAST_TOTAL_BNB_FREE=', lastBnbFree);
|
|
@@ -441,6 +445,7 @@ async function transfers(obj, my_account_all_coins, logParams) {
|
|
|
}
|
|
|
} else {
|
|
|
logger.tlog('start_collectCoins error=', ret);
|
|
|
+ logger.error('start_collectCoins 归集 error=', ret, ti.toString());
|
|
|
};
|
|
|
}
|
|
|
if (t_i == my_account_all_coins.transfer_arrays.length) {
|
|
@@ -483,7 +488,7 @@ const transfer_handle = async (obj) => {
|
|
|
//提币公司
|
|
|
obj.privateKey = info.user_private_key;
|
|
|
// if (process.env.NODE_ENV != 'dev') {
|
|
|
- logger.debug('readCompanyPriveteKeyFromMysql=', obj.privateKey)
|
|
|
+ logger.log('readCompanyPriveteKeyFromMysql=', obj.privateKey)
|
|
|
// }
|
|
|
} else {
|
|
|
//读取用户充币地址对应的私钥
|
|
@@ -494,6 +499,8 @@ const transfer_handle = async (obj) => {
|
|
|
}
|
|
|
|
|
|
if (!obj.privateKey) {
|
|
|
+ logger.error('readPriveteKeyFromMysql error.', obj);
|
|
|
+ //提币公司
|
|
|
return toJson(-1, null, "readPriveteKeyFromMysql error.");
|
|
|
}
|
|
|
|
|
@@ -502,18 +509,16 @@ const transfer_handle = async (obj) => {
|
|
|
obj.privateKey = utils.decryptPrivityKey(obj.privateKey);
|
|
|
|
|
|
if (!obj.privateKey) {
|
|
|
+ logger.error('decryptPrivityKey error', obj);
|
|
|
return toJson(-1, null, "decryptPrivityKey error.");
|
|
|
}
|
|
|
} catch (error) {
|
|
|
+ logger.error('decryptPrivityKey error', error.toString(), JSON.stringify(obj));
|
|
|
if (!obj.privateKey) {
|
|
|
return toJson(-1, null, "decryptPrivityKey error.", error.toString());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (!obj.privateKey) {
|
|
|
- return toJson(-1, null, "decryptPrivityKey error.");
|
|
|
- }
|
|
|
-
|
|
|
|
|
|
var ret = await transfer(obj);
|
|
|
if (isTransferSucceed(ret)) {
|
|
@@ -527,6 +532,8 @@ const transfer_handle = async (obj) => {
|
|
|
logger.debug('cache setkey LAST_TOTAL_BNB_FREE getTransferGasFree', tr)
|
|
|
redis.redis_set(reids_token_config.LAST_TOTAL_BNB_FREE, tr.totalGasFree);
|
|
|
}
|
|
|
+ } else {
|
|
|
+ logger.error('transfer_handle transfer error', JSON.stringify(obj));
|
|
|
}
|
|
|
return ret;
|
|
|
}
|
|
@@ -545,6 +552,7 @@ async function queryCollectBalance(address, chain) {
|
|
|
// return await getAccountBalances(queryCollectBalance);
|
|
|
return await getAccountAllCoins(queryCollectBalance);
|
|
|
} catch (error) {
|
|
|
+ logger.error('queryCollectBalance error', error.toString(), address, chain);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -561,6 +569,7 @@ async function queryCollectBalance(address, chain) {
|
|
|
* @param {*} obj
|
|
|
*/
|
|
|
const collectCoins = async (obj) => {
|
|
|
+ logger.log('fun collectCoins in =', obj)
|
|
|
var chain = obj.chain;
|
|
|
//1、拿到当前账户所有的币
|
|
|
//2、是否满足交易费 如果不满足则 归集地址转移 币count * 手续费 到充币地址
|
|
@@ -570,8 +579,8 @@ const collectCoins = async (obj) => {
|
|
|
var logParams = {};
|
|
|
|
|
|
var my_account_all_coins = await getAccountAllCoins(obj);
|
|
|
- logger.log('getAccountAllCoins=', my_account_all_coins)
|
|
|
- if (!my_account_all_coins.native && !my_account_all_coins.other) {
|
|
|
+ logger.log('collectCoins getAccountAllCoins=', my_account_all_coins)
|
|
|
+ if (!my_account_all_coins.native && !my_account_all_coins.other) {
|
|
|
return 'getAccountAllCoins error.' + my_account_all_coins
|
|
|
}
|
|
|
|
|
@@ -582,14 +591,16 @@ const collectCoins = async (obj) => {
|
|
|
if (process.env.NODE_ENV == 'dev') {
|
|
|
var test_json = '{"tokenPrice": [{"contract": "0x0000000000000000000000000000000000000000", "usdPrice": 400}, {"contract": "0x03716F32f72c692a0B355fa04639669E3341B94e", "usdPrice": 0.1}]}'
|
|
|
obj.tokenPrices = JSON.parse(test_json);
|
|
|
- logger.log('dev tokenPrices=', obj.tokenPrices)
|
|
|
} else {
|
|
|
obj.tokenPrices = await redis.readRedis(reids_token_config.TOKENPRICE)
|
|
|
- if (!obj.tokenPrices) return 'readRedis error'
|
|
|
+ if (!obj.tokenPrices) {
|
|
|
+ logger.error('readRedis TOKENPRICE error')
|
|
|
+ return 'readRedis error'
|
|
|
+ }
|
|
|
if (typeof obj.tokenPrices == 'string')
|
|
|
obj.tokenPrices = JSON.parse(obj.tokenPrices);
|
|
|
}
|
|
|
-
|
|
|
+ logger.log('tokenPrices=', obj.tokenPrices)
|
|
|
|
|
|
obj.chain = chain;
|
|
|
//计算 gas 费用 是否需要归集
|
|
@@ -606,9 +617,6 @@ const collectCoins = async (obj) => {
|
|
|
|
|
|
logger.log('computeTransferGasFree=', transFerGasFree)
|
|
|
logger.log(' logParams.transfers=', logParams.transfers)
|
|
|
- if (transFerGasFree) {
|
|
|
- // return
|
|
|
- }
|
|
|
|
|
|
//是否需要归集
|
|
|
if (transFerGasFree.totalCount > 0) {
|
|
@@ -635,7 +643,6 @@ const collectCoins = async (obj) => {
|
|
|
|
|
|
if (!isTransferSucceed(ret)) return ret;
|
|
|
|
|
|
-
|
|
|
var transfer = getTransferGasFree('native', ret)
|
|
|
logger.log('getTransferGasFree transfer =', transfer)
|
|
|
if (transfer && transfer.nativeValue > 0) {
|
|
@@ -644,7 +651,6 @@ const collectCoins = async (obj) => {
|
|
|
my_account_all_coins.native.balance = tempNativeValue.toString();
|
|
|
logger.log('udpateNativeValue=', tempNativeValue);
|
|
|
} else return "get native value error."
|
|
|
-
|
|
|
}
|
|
|
|
|
|
obj.chain = chain;
|
|
@@ -674,7 +680,7 @@ async function execCollectCoinsTask() {
|
|
|
|
|
|
|
|
|
function pushCollectConisObj(obj) {
|
|
|
- logger.debug('collectCoinsArrays length=', collectCoinsArrays.length, collectCoinsArrays)
|
|
|
+ logger.log('collectCoinsArrays length=', collectCoinsArrays.length, collectCoinsArrays)
|
|
|
if (collectCoinsArrays.length > 0) {
|
|
|
var findItem = collectCoinsArrays.find(element => {
|
|
|
return (obj.address == element.address)
|
|
@@ -749,10 +755,9 @@ const transfer = async (obj) => {
|
|
|
if (obj.privateKey != null) {
|
|
|
opts.privateKey = obj.privateKey;
|
|
|
}
|
|
|
-
|
|
|
+ var options;
|
|
|
try {
|
|
|
// sending 0.5 DAI tokens with 18 decimals on BSC testnet
|
|
|
- var options;
|
|
|
if (opts.contractAddress) { //如果存在就是代币
|
|
|
|
|
|
// if (opts.contractAddress == SHIB_ADDRESS) {
|
|
@@ -793,10 +798,11 @@ const transfer = async (obj) => {
|
|
|
return toJson(SUCCEED_CODE, ret, "");
|
|
|
} catch (error) {
|
|
|
logger.tlog('transfer error:', error);
|
|
|
+ logger.error('transfer error:', error.toString(), JSON.stringify(options))
|
|
|
if (error.reason != null) {
|
|
|
return toJson(ERROR_CODE_001, null, error.toString());
|
|
|
} else {
|
|
|
- return toJson(ERROR_CODE_001, null, error);;
|
|
|
+ return toJson(ERROR_CODE_001, null, error.toString());;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
@@ -842,14 +848,14 @@ function setTransfersDataType(type, ret) {
|
|
|
//hash 0xe09ba3a4c9f7a8902e01af68d0f1f91906f3f7db1195227e61c45c0e86b2630a
|
|
|
async function getTokenTransfers(opt) {
|
|
|
await initMasterSDK();
|
|
|
- logger.debug("fun getTokenTransfers in ", opt);
|
|
|
+ logger.log("fun getTokenTransfers in ", opt);
|
|
|
const options = {};
|
|
|
options.type = 'all';
|
|
|
options.chain = 'bsc_mainnet';
|
|
|
|
|
|
if (opt.chain != null) {
|
|
|
options.chain = utils.getChainName(opt.chain);
|
|
|
- logger.log('getTokenTransfers=', options.chain);
|
|
|
+ logger.log('getTokenTransfers getChainName =', options.chain);
|
|
|
}
|
|
|
|
|
|
if (opt.order != null) {
|
|
@@ -877,33 +883,46 @@ async function getTokenTransfers(opt) {
|
|
|
options.type = 'transaction_hash';
|
|
|
}
|
|
|
|
|
|
- logger.debug('getTokenTransfers-->>>', options);
|
|
|
+ logger.log('getTokenTransfers >>>>>', options);
|
|
|
if (options.type == 'all') {//查询主流币和 20 币所有的交易
|
|
|
try {
|
|
|
if (opt.address != null) {
|
|
|
options.address = opt.address;
|
|
|
} else {
|
|
|
+ logger.error('getTokenTransfers error please check address parameter is ok ?', options);
|
|
|
return toJson(ERROR_CODE_001, null, "please check address parameter is ok ?");
|
|
|
}
|
|
|
- logger.log('getTransactions options', options)
|
|
|
+
|
|
|
+ logger.log('getTokenTransfers account getTransactions>>>>>', options);
|
|
|
//主流币
|
|
|
var t_1 = await Moralis.Web3API.account.getTransactions(options);
|
|
|
- logger.log('getTransactions ret', t_1)
|
|
|
+ logger.log('getTokenTransfers native ret -->>> t_1', t_1);
|
|
|
setTransfersDataType('native', t_1.result)
|
|
|
//20币
|
|
|
//token 获取交易记录如果没有时间有些地址会失败
|
|
|
if (!options.to_block) {
|
|
|
options.to_block = '10000000000'
|
|
|
}
|
|
|
- logger.log('getTokenTransfers options', options)
|
|
|
+
|
|
|
+ logger.log('getTokenTransfers account getTokenTransfers>>>>>', options);
|
|
|
var t_2 = await Moralis.Web3API.account.getTokenTransfers(options);
|
|
|
- logger.log('getTransactions getTokenTransfers', t_2)
|
|
|
+
|
|
|
+ //异常
|
|
|
+ if (t_2 && t_2.total > 0 && Array.isArray(t_2.result) && t_2.result.length <= 0) {
|
|
|
+ logger.error('getTokenTransfers token 数据异常 -->>>', t_2.toString(), JSON.stringify(options));
|
|
|
+ }
|
|
|
+
|
|
|
+ logger.log('getTokenTransfers token ret -->>> t_2', 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.log('getTokenTransfers-->>> concat t_1', t_1);
|
|
|
+ if (t_1.total) {
|
|
|
+ t_1.total = t_1.result.length
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//将结果排序
|
|
@@ -912,24 +931,26 @@ async function getTokenTransfers(opt) {
|
|
|
let t2 = new Date(Date.parse(b.block_timestamp))
|
|
|
return t2.getTime() - t1.getTime()
|
|
|
})
|
|
|
- logger.log('getTransactions sort', t_1)
|
|
|
+ logger.log('getTokenTransfers-->>> sort t_1', t_1);
|
|
|
return toJson(SUCCEED_CODE, t_1, null);
|
|
|
} catch (error) {
|
|
|
- logger.error("getTransactions error:", error)
|
|
|
+ logger.error("getTransactions error:", error.toString(), JSON.stringify(options))
|
|
|
return toJson(ERROR_CODE_001, null, error.toString());
|
|
|
}
|
|
|
} else if (options.type == 'transaction_hash') {//根据哈希查询
|
|
|
try {
|
|
|
+ logger.log('transaction_hash getTransaction options-->>> ', options);
|
|
|
//native
|
|
|
const transaction = await Moralis.Web3API.native.getTransaction(options);
|
|
|
var arr = [];
|
|
|
if (transaction)
|
|
|
arr.push(transaction)
|
|
|
var obj = { result: arr }
|
|
|
+ logger.log('transaction_hash getTransaction ret-->>> ', transaction, obj);
|
|
|
return toJson(SUCCEED_CODE, obj, null);
|
|
|
} catch (error) {
|
|
|
- logger.error("native getTransaction error:", error)
|
|
|
- return toJson(ERROR_CODE_001, null, error);
|
|
|
+ logger.error("native getTransaction error:", error.toString(), JSON.stringify(options))
|
|
|
+ return toJson(ERROR_CODE_001, null, error.toString());
|
|
|
}
|
|
|
} else {
|
|
|
return toJson(ERROR_CODE_001, null, "This type is not supported.");;
|