|
@@ -159,7 +159,7 @@ async function getAccountAllCoins(obj) {
|
|
* 判断是否转 gas 费
|
|
* 判断是否转 gas 费
|
|
* @param {*} my_account_all_coins
|
|
* @param {*} my_account_all_coins
|
|
*/
|
|
*/
|
|
-async function computeTransferGasFree(my_account_all_coins, tokenPrices) {
|
|
|
|
|
|
+async function computeTransferGasFree(obj, my_account_all_coins, tokenPrices) {
|
|
var totalCount = 0;
|
|
var totalCount = 0;
|
|
var tokenCount = 0;
|
|
var tokenCount = 0;
|
|
var tokenGasPrice = 0;
|
|
var tokenGasPrice = 0;
|
|
@@ -171,7 +171,7 @@ async function computeTransferGasFree(my_account_all_coins, tokenPrices) {
|
|
|
|
|
|
//需要转账的数组对象
|
|
//需要转账的数组对象
|
|
var transfer_obj = [];
|
|
var transfer_obj = [];
|
|
-
|
|
|
|
|
|
+ var receiver_info = await queryCompanyInfoFromId(0);
|
|
//得到 20 币 满足 1美刀的 count
|
|
//得到 20 币 满足 1美刀的 count
|
|
if (Array.isArray(my_account_all_coins.other) && my_account_all_coins.other.length > 0) {
|
|
if (Array.isArray(my_account_all_coins.other) && my_account_all_coins.other.length > 0) {
|
|
my_account_all_coins.other.forEach(element => {
|
|
my_account_all_coins.other.forEach(element => {
|
|
@@ -183,6 +183,16 @@ async function computeTransferGasFree(my_account_all_coins, tokenPrices) {
|
|
if (find_transfer_item && total_all_usdprice > 1.0) {
|
|
if (find_transfer_item && total_all_usdprice > 1.0) {
|
|
tokenCount += 1;
|
|
tokenCount += 1;
|
|
logger.debug('token > 1.0', tokenCount, element.token_address);
|
|
logger.debug('token > 1.0', tokenCount, element.token_address);
|
|
|
|
+
|
|
|
|
+ var obj_20 = {
|
|
|
|
+ chain: obj.chain,
|
|
|
|
+ contractAddress: element.token_address,
|
|
|
|
+ amount: element.balance,
|
|
|
|
+ receiver: receiver_info.user_address,
|
|
|
|
+ type: 'erc20',
|
|
|
|
+ address: obj.address,
|
|
|
|
+ }
|
|
|
|
+ transfer_obj.push(obj_20)
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
logger.log('findTokenPriceItem error=', element);
|
|
logger.log('findTokenPriceItem error=', element);
|
|
@@ -223,9 +233,21 @@ async function computeTransferGasFree(my_account_all_coins, tokenPrices) {
|
|
nativeGasPrice = parseInt(nativeCount) * parseInt(account_config.BNB_GAS_LIMIT) * parseInt(account_config.BNB_GAS_PRICE);
|
|
nativeGasPrice = parseInt(nativeCount) * parseInt(account_config.BNB_GAS_LIMIT) * parseInt(account_config.BNB_GAS_PRICE);
|
|
}
|
|
}
|
|
ret_a_gas = account_config.BNB_GAS_PRICE;
|
|
ret_a_gas = account_config.BNB_GAS_PRICE;
|
|
|
|
+
|
|
|
|
+ var real_native_amount = BigInt(nativeAllBalance) - BigInt(nativeGasPrice) - BigInt(tokenGasPrice);
|
|
|
|
+ var obj_native = {
|
|
|
|
+ chain: obj.chain,
|
|
|
|
+ amount: real_native_amount.toString(),
|
|
|
|
+ receiver: receiver_info.user_address,
|
|
|
|
+ type: 'native',
|
|
|
|
+ address: obj.address,
|
|
|
|
+ }
|
|
|
|
+ transfer_obj.push(obj_native)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ logger.log('transfer obj=', transfer_obj)
|
|
|
|
+
|
|
//计算所有币转账所需要的 gas
|
|
//计算所有币转账所需要的 gas
|
|
totalCount = nativeCount + tokenCount;
|
|
totalCount = nativeCount + tokenCount;
|
|
// var gasPrice = await redis.readRedis(reids_token_config.GASPRICE);
|
|
// var gasPrice = await redis.readRedis(reids_token_config.GASPRICE);
|
|
@@ -237,6 +259,9 @@ async function computeTransferGasFree(my_account_all_coins, tokenPrices) {
|
|
var service_charge = 0;
|
|
var service_charge = 0;
|
|
logger.log('total2Gas', total2Gas);
|
|
logger.log('total2Gas', total2Gas);
|
|
|
|
|
|
|
|
+ //需要转账的 obj
|
|
|
|
+ my_account_all_coins.transfer_arrays = transfer_obj
|
|
|
|
+
|
|
//如果当前的钱不够 gas
|
|
//如果当前的钱不够 gas
|
|
if (nativeAllBalance < total2Gas) {
|
|
if (nativeAllBalance < total2Gas) {
|
|
if (tokenCount > 0) {//出现 token 需要转移手续费
|
|
if (tokenCount > 0) {//出现 token 需要转移手续费
|
|
@@ -303,118 +328,146 @@ async function updateNativeBalance(nativeBalance, obj) {
|
|
|
|
|
|
//20 and native 归集
|
|
//20 and native 归集
|
|
async function transfers(obj, my_account_all_coins) {
|
|
async function transfers(obj, my_account_all_coins) {
|
|
- var address = obj.address;
|
|
|
|
- var chain = obj.chain;
|
|
|
|
- var tokenPrices = obj.tokenPrices;
|
|
|
|
- logger.log('tokenPrices=', tokenPrices, my_account_all_coins);
|
|
|
|
-
|
|
|
|
- var nativeValue = my_account_all_coins.native.balance;
|
|
|
|
-
|
|
|
|
- if (!my_account_all_coins || !tokenPrices) return 'error.'
|
|
|
|
|
|
|
|
- logger.log(' my_account_all_coins.other.lenth=', my_account_all_coins.other.length);
|
|
|
|
-
|
|
|
|
- var isUpdateNativeBalance = 0;
|
|
|
|
-
|
|
|
|
- //token 归集
|
|
|
|
- if (my_account_all_coins.other && Array.isArray(my_account_all_coins.other) && my_account_all_coins.other.length > 0) {
|
|
|
|
- var available = Array.isArray(tokenPrices.tokenPrice) && tokenPrices.tokenPrice.length > 0
|
|
|
|
- if (!available) return -1;
|
|
|
|
- for (let i = 0; i < my_account_all_coins.other.length; ++i) {
|
|
|
|
- var transfer_item = my_account_all_coins.other[i];
|
|
|
|
- if (my_account_all_coins.other[i].token_address != null) {
|
|
|
|
- var find_transfer_item = findTokenPriceItem(transfer_item.token_address, tokenPrices);
|
|
|
|
- //todo 计算 token 币价格 * token美元单价
|
|
|
|
- if (find_transfer_item && calculate_total_usdprice(transfer_item.balance, transfer_item.decimals, find_transfer_item.usdPrice) > 1.0) {
|
|
|
|
- var info = await queryCompanyInfoFromId(0);
|
|
|
|
- var obj_20 = {
|
|
|
|
- chain: obj.chain,
|
|
|
|
- contractAddress: transfer_item.token_address,
|
|
|
|
- amount: transfer_item.balance,
|
|
|
|
- receiver: info.user_address,
|
|
|
|
- type: 'erc20',
|
|
|
|
- address: address,
|
|
|
|
- }
|
|
|
|
- logger.log('start_collectCoins erc20:', obj_20);
|
|
|
|
- logger.log('calculate_total_usdprice 20', calculate_total_usdprice(transfer_item.balance, transfer_item.decimals, '0.1'));
|
|
|
|
- isUpdateNativeBalance = 1;
|
|
|
|
- var ret = await start_collectCoins(obj_20)
|
|
|
|
- logger.log('start_collectCoins erc20 respose...', ret);
|
|
|
|
-
|
|
|
|
- //更新 native 金额
|
|
|
|
- if (!isTransferSucceed(ret)) return ret;
|
|
|
|
-
|
|
|
|
- var transfer = getTransferGasFree('token', ret)
|
|
|
|
- if (transfer && transfer.totalGasFree > 0) {
|
|
|
|
- logger.log('start_collectCoins 20 tempNativeValue=', my_account_all_coins.native.balance)
|
|
|
|
- var tempNativeValue = reduceNativeValue(nativeValue, transfer.totalGasFree)
|
|
|
|
- my_account_all_coins.native.balance = tempNativeValue.toString();
|
|
|
|
- logger.log('start_collectCoins 20 udpateNativeValue=', tempNativeValue);
|
|
|
|
- } else return "get native value error."
|
|
|
|
- } else {
|
|
|
|
- logger.error('find_transfer_item error.', transfer_item);
|
|
|
|
- }
|
|
|
|
|
|
+ // 优化后的归集
|
|
|
|
+ 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;
|
|
|
|
+ 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)
|
|
|
|
+ var ret = await start_collectCoins(ti)
|
|
|
|
+ //更新 native 金额
|
|
|
|
+ if (isTransferSucceed(ret)) {
|
|
|
|
+ logger.tlog('start_collectCoins respose...', ret);
|
|
|
|
+ t_i += 1
|
|
} else {
|
|
} else {
|
|
- logger.error('token Must be greater than a dollar.', transfer_item.balance, transfer_item.decimals);
|
|
|
|
- // return toJson(-1, null, 'token Must be greater than a dollar.');
|
|
|
|
- }
|
|
|
|
|
|
+ logger.tlog('start_collectCoins error=', ret);
|
|
|
|
+ t_err.push(ret)
|
|
|
|
+ };
|
|
}
|
|
}
|
|
- }
|
|
|
|
-
|
|
|
|
- //native 归集
|
|
|
|
- if (my_account_all_coins.native) {
|
|
|
|
- logger.log('查询本地余额参数=', obj)
|
|
|
|
- if (obj.chain) {
|
|
|
|
- obj.chain = utils.getChainName(obj.chain)
|
|
|
|
|
|
+ if(t_i == my_account_all_coins.transfer_arrays.length){
|
|
|
|
+ return toJson(0, null, '所有币归集成功.');
|
|
|
|
+ }else {
|
|
|
|
+ return toJson(-1, null, '归集失败.');
|
|
}
|
|
}
|
|
-
|
|
|
|
- obj.chain = chain;
|
|
|
|
- logger.log('查询本地余额 after', my_account_all_coins.native)
|
|
|
|
- var find_native_item = findTokenPriceItem('0x0000000000000000000000000000000000000000', tokenPrices);
|
|
|
|
- //todo 计算 token 币价格 * token美元单价
|
|
|
|
- if (find_native_item) {
|
|
|
|
- var nativeCoins = calculate_total_usdprice(my_account_all_coins.native.balance, '18', find_native_item.usdPrice);
|
|
|
|
- logger.log('start_collectCoins nativeCoins:', nativeCoins, obj);
|
|
|
|
- logger.log('start_collectCoins obj:', obj);
|
|
|
|
- logger.log('start_collectCoins native.balance:', my_account_all_coins.native.balance);
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- if (nativeCoins > 1.0) {
|
|
|
|
- logger.log('native.balance', my_account_all_coins.native.balance)
|
|
|
|
- logger.log('aGasPrice', obj.transFerGasFree.aGasPrice)
|
|
|
|
- logger.log('gasLimint', account_config.BNB_GAS_LIMIT)
|
|
|
|
- // var gasPrice = BigInt(obj.transFerGasFree.aGasPrice);
|
|
|
|
-
|
|
|
|
- var gasPrice = BigInt(account_config.BNB_GAS_PRICE);
|
|
|
|
- var gasLimit = BigInt(account_config.BNB_GAS_LIMIT);
|
|
|
|
- var nativeBalance = BigInt(my_account_all_coins.native.balance);
|
|
|
|
-
|
|
|
|
- logger.log('native.balance>>>', nativeBalance)
|
|
|
|
- logger.log('aGasPrice>>>', gasPrice)
|
|
|
|
- logger.log('gasLimint>>>', gasLimit)
|
|
|
|
-
|
|
|
|
- var real_native_amount = nativeBalance - gasPrice * gasLimit;
|
|
|
|
- logger.log('start_collectCoins native amount:', real_native_amount.toString());
|
|
|
|
- var info = await queryCompanyInfoFromId(0);
|
|
|
|
- obj = {
|
|
|
|
- chain: chain,
|
|
|
|
- amount: real_native_amount.toString(),
|
|
|
|
- receiver: info.user_address,
|
|
|
|
- type: 'native',
|
|
|
|
- address: address,
|
|
|
|
- }
|
|
|
|
- logger.log('start_collectCoins native:', obj);
|
|
|
|
- logger.log('calculate_total_usdprice native', nativeCoins, find_native_item);
|
|
|
|
- return await start_collectCoins(obj)
|
|
|
|
- } else {
|
|
|
|
- logger.error('native Must be greater than a dollar.', obj);
|
|
|
|
- return toJson(-1, null, 'native Must be greater than a dollar.');
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- logger.error('native Must be greater than a dollar.', obj);
|
|
|
|
- return toJson(-1, null, 'native Must be greater than a dollar.');
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ } else {
|
|
|
|
+ return toJson(-1, null, 'transfer conditions are not met.');
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //v0.1 版本归集
|
|
|
|
+ // var address = obj.address;
|
|
|
|
+ // var chain = obj.chain;
|
|
|
|
+ // var tokenPrices = obj.tokenPrices;
|
|
|
|
+ // logger.log('tokenPrices=', tokenPrices, my_account_all_coins);
|
|
|
|
+
|
|
|
|
+ // var nativeValue = my_account_all_coins.native.balance;
|
|
|
|
+
|
|
|
|
+ // if (!my_account_all_coins || !tokenPrices) return 'error.'
|
|
|
|
+
|
|
|
|
+ // logger.log(' my_account_all_coins.other.lenth=', my_account_all_coins.other.length);
|
|
|
|
+
|
|
|
|
+ // var isUpdateNativeBalance = 0;
|
|
|
|
+
|
|
|
|
+ // //token 归集
|
|
|
|
+ // if (my_account_all_coins.other && Array.isArray(my_account_all_coins.other) && my_account_all_coins.other.length > 0) {
|
|
|
|
+ // var available = Array.isArray(tokenPrices.tokenPrice) && tokenPrices.tokenPrice.length > 0
|
|
|
|
+ // if (!available) return -1;
|
|
|
|
+ // for (let i = 0; i < my_account_all_coins.other.length; ++i) {
|
|
|
|
+ // var transfer_item = my_account_all_coins.other[i];
|
|
|
|
+ // if (my_account_all_coins.other[i].token_address != null) {
|
|
|
|
+ // var find_transfer_item = findTokenPriceItem(transfer_item.token_address, tokenPrices);
|
|
|
|
+ // //todo 计算 token 币价格 * token美元单价
|
|
|
|
+ // if (find_transfer_item && calculate_total_usdprice(transfer_item.balance, transfer_item.decimals, find_transfer_item.usdPrice) > 1.0) {
|
|
|
|
+ // var info = await queryCompanyInfoFromId(0);
|
|
|
|
+ // var obj_20 = {
|
|
|
|
+ // chain: obj.chain,
|
|
|
|
+ // contractAddress: transfer_item.token_address,
|
|
|
|
+ // amount: transfer_item.balance,
|
|
|
|
+ // receiver: info.user_address,
|
|
|
|
+ // type: 'erc20',
|
|
|
|
+ // address: address,
|
|
|
|
+ // }
|
|
|
|
+ // logger.log('start_collectCoins erc20:', obj_20);
|
|
|
|
+ // logger.log('calculate_total_usdprice 20', calculate_total_usdprice(transfer_item.balance, transfer_item.decimals, '0.1'));
|
|
|
|
+ // isUpdateNativeBalance = 1;
|
|
|
|
+ // var ret = await start_collectCoins(obj_20)
|
|
|
|
+ // logger.log('start_collectCoins erc20 respose...', ret);
|
|
|
|
+
|
|
|
|
+ // //更新 native 金额
|
|
|
|
+ // if (!isTransferSucceed(ret)) return ret;
|
|
|
|
+
|
|
|
|
+ // var transfer = getTransferGasFree('token', ret)
|
|
|
|
+ // if (transfer && transfer.totalGasFree > 0) {
|
|
|
|
+ // logger.log('start_collectCoins 20 tempNativeValue=', my_account_all_coins.native.balance)
|
|
|
|
+ // var tempNativeValue = reduceNativeValue(nativeValue, transfer.totalGasFree)
|
|
|
|
+ // my_account_all_coins.native.balance = tempNativeValue.toString();
|
|
|
|
+ // logger.log('start_collectCoins 20 udpateNativeValue=', tempNativeValue);
|
|
|
|
+ // } else return "get native value error."
|
|
|
|
+ // } else {
|
|
|
|
+ // logger.error('find_transfer_item error.', transfer_item);
|
|
|
|
+ // }
|
|
|
|
+ // } else {
|
|
|
|
+ // logger.error('token Must be greater than a dollar.', transfer_item.balance, transfer_item.decimals);
|
|
|
|
+ // // return toJson(-1, null, 'token Must be greater than a dollar.');
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
+
|
|
|
|
+ // //native 归集
|
|
|
|
+ // if (my_account_all_coins.native) {
|
|
|
|
+ // logger.log('查询本地余额参数=', obj)
|
|
|
|
+ // if (obj.chain) {
|
|
|
|
+ // obj.chain = utils.getChainName(obj.chain)
|
|
|
|
+ // }
|
|
|
|
+
|
|
|
|
+ // obj.chain = chain;
|
|
|
|
+ // logger.log('查询本地余额 after', my_account_all_coins.native)
|
|
|
|
+ // var find_native_item = findTokenPriceItem('0x0000000000000000000000000000000000000000', tokenPrices);
|
|
|
|
+ // //todo 计算 token 币价格 * token美元单价
|
|
|
|
+ // if (find_native_item) {
|
|
|
|
+ // var nativeCoins = calculate_total_usdprice(my_account_all_coins.native.balance, '18', find_native_item.usdPrice);
|
|
|
|
+ // logger.log('start_collectCoins nativeCoins:', nativeCoins, obj);
|
|
|
|
+ // logger.log('start_collectCoins obj:', obj);
|
|
|
|
+ // logger.log('start_collectCoins native.balance:', my_account_all_coins.native.balance);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // if (nativeCoins > 1.0) {
|
|
|
|
+ // logger.log('native.balance', my_account_all_coins.native.balance)
|
|
|
|
+ // logger.log('aGasPrice', obj.transFerGasFree.aGasPrice)
|
|
|
|
+ // logger.log('gasLimint', account_config.BNB_GAS_LIMIT)
|
|
|
|
+ // // var gasPrice = BigInt(obj.transFerGasFree.aGasPrice);
|
|
|
|
+
|
|
|
|
+ // var gasPrice = BigInt(account_config.BNB_GAS_PRICE);
|
|
|
|
+ // var gasLimit = BigInt(account_config.BNB_GAS_LIMIT);
|
|
|
|
+ // var nativeBalance = BigInt(my_account_all_coins.native.balance);
|
|
|
|
+
|
|
|
|
+ // logger.log('native.balance>>>', nativeBalance)
|
|
|
|
+ // logger.log('aGasPrice>>>', gasPrice)
|
|
|
|
+ // logger.log('gasLimint>>>', gasLimit)
|
|
|
|
+
|
|
|
|
+ // var real_native_amount = nativeBalance - gasPrice * gasLimit;
|
|
|
|
+ // logger.log('start_collectCoins native amount:', real_native_amount.toString());
|
|
|
|
+ // var info = await queryCompanyInfoFromId(0);
|
|
|
|
+ // obj = {
|
|
|
|
+ // chain: chain,
|
|
|
|
+ // amount: real_native_amount.toString(),
|
|
|
|
+ // receiver: info.user_address,
|
|
|
|
+ // type: 'native',
|
|
|
|
+ // address: address,
|
|
|
|
+ // }
|
|
|
|
+ // logger.log('start_collectCoins native:', obj);
|
|
|
|
+ // logger.log('calculate_total_usdprice native', nativeCoins, find_native_item);
|
|
|
|
+ // return await start_collectCoins(obj)
|
|
|
|
+ // } else {
|
|
|
|
+ // logger.error('native Must be greater than a dollar.', obj);
|
|
|
|
+ // return toJson(-1, null, 'native Must be greater than a dollar.');
|
|
|
|
+ // }
|
|
|
|
+ // } else {
|
|
|
|
+ // logger.error('native Must be greater than a dollar.', obj);
|
|
|
|
+ // return toJson(-1, null, 'native Must be greater than a dollar.');
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -507,9 +560,13 @@ const collectCoins = async (obj) => {
|
|
if (typeof obj.tokenPrices == 'string')
|
|
if (typeof obj.tokenPrices == 'string')
|
|
obj.tokenPrices = JSON.parse(obj.tokenPrices);
|
|
obj.tokenPrices = JSON.parse(obj.tokenPrices);
|
|
|
|
|
|
|
|
+ obj.chain = chain;
|
|
//计算 gas 费用 是否需要归集
|
|
//计算 gas 费用 是否需要归集
|
|
- var transFerGasFree = await computeTransferGasFree(my_account_all_coins, obj.tokenPrices);
|
|
|
|
|
|
+ var transFerGasFree = await computeTransferGasFree(obj, my_account_all_coins, obj.tokenPrices);
|
|
logger.log('computeTransferGasFree=', transFerGasFree)
|
|
logger.log('computeTransferGasFree=', transFerGasFree)
|
|
|
|
+ if (transFerGasFree) {
|
|
|
|
+ // return
|
|
|
|
+ }
|
|
|
|
|
|
//是否需要归集
|
|
//是否需要归集
|
|
if (transFerGasFree.totalCount > 0) {
|
|
if (transFerGasFree.totalCount > 0) {
|