|
@@ -7,6 +7,7 @@ var utils = require('./utils.js');
|
|
|
var { moralis_config, reids_token_config, account_config } = require('../config/config.js')
|
|
|
const redis = require("./db/redis_db") //导入 db.js
|
|
|
const mysql = require("./db/mysql_db")
|
|
|
+const account_mysql = require("../model/db/account_info_db") //导入 db.js
|
|
|
const logger = require('./logger')
|
|
|
const report = require("./report") //导入 db.js
|
|
|
const BigNumber = require('bignumber.js')
|
|
@@ -233,10 +234,10 @@ async function getAccountBalances(options) {
|
|
|
try {
|
|
|
if (options.type == 'native') {
|
|
|
// result = await Moralis.Web3API.account.getNativeBalance(balance_opts);
|
|
|
- result = await getBalances(balance_opts,'native')
|
|
|
+ result = await getBalances(balance_opts, 'native')
|
|
|
logger.log('getNativeBalance=', result);
|
|
|
} else {
|
|
|
- result = await getBalances(balance_opts,'token')
|
|
|
+ result = await getBalances(balance_opts, 'token')
|
|
|
// result = await Moralis.Web3API.account.getTokenBalances(balance_opts);
|
|
|
logger.log('getTokenBalances=', result);
|
|
|
}
|
|
@@ -481,7 +482,7 @@ async function updateNativeBalance(nativeBalance, obj) {
|
|
|
do {
|
|
|
//上面转账完 BNB 会减去,这里再获取一次
|
|
|
// var native_ret = await Moralis.Web3API.account.getNativeBalance(temp);
|
|
|
- var native_ret = await getBalances(balance_opts,'native');
|
|
|
+ var native_ret = await getBalances(balance_opts, 'native');
|
|
|
logger.log('更新余额 :', nativeBalance, native_ret, retryCount)
|
|
|
if (nativeBalance != native_ret.balance && BigInt(nativeBalance) < BigInt(native_ret.balance)) {
|
|
|
return native_ret.balance;
|
|
@@ -1041,7 +1042,6 @@ async function getTokenTransfers(opt) {
|
|
|
try {
|
|
|
logger.log('getTokenTransfers account getTransactions>>>>>', options);
|
|
|
t_1 = await Moralis.Web3API.account.getTransactions(options);
|
|
|
- // t_1 = await getTransferRecord(options, 'native');
|
|
|
logger.log('getTokenTransfers native ret -->>> t_1', t_1);
|
|
|
setTransfersDataType('native', t_1.result)
|
|
|
break
|
|
@@ -1069,8 +1069,7 @@ async function getTokenTransfers(opt) {
|
|
|
options.to_block = '10000000000'
|
|
|
}
|
|
|
logger.log('getTokenTransfers account getTokenTransfers>>>>>', options);
|
|
|
- // t_2 = await Moralis.Web3API.account.getTokenTransfers(options);
|
|
|
- t_2 = await getTransferRecord(options, 'token');
|
|
|
+ t_2 = await Moralis.Web3API.account.getTokenTransfers(options);
|
|
|
logger.log('getTokenTransfers token ret -->>> t_2', t_2);
|
|
|
setTransfersDataType('token', t_2.result)
|
|
|
break
|
|
@@ -1098,7 +1097,7 @@ async function getTokenTransfers(opt) {
|
|
|
if (Array.isArray(arr1) && Array.isArray(arr)) {
|
|
|
let arr2 = arr.concat(arr1);
|
|
|
t_1.result = arr2;
|
|
|
- logger.log('getTokenTransfers-->>>concat t_1', t_1,t_1.result.length);
|
|
|
+ logger.log('getTokenTransfers-->>>concat t_1', t_1, t_1.result.length);
|
|
|
if (t_1.total != null) {
|
|
|
t_1.total = t_1.result.length
|
|
|
logger.log('getTokenTransfers-->>>concat total', t_1.total);
|
|
@@ -1123,8 +1122,7 @@ async function getTokenTransfers(opt) {
|
|
|
try {
|
|
|
logger.log('transaction_hash getTransaction options-->>> ', options);
|
|
|
//native
|
|
|
- // const transaction = await Moralis.Web3API.native.getTransaction(options);
|
|
|
- const transaction = await getTransferRecord(options, 'hash');
|
|
|
+ const transaction = await Moralis.Web3API.native.getTransaction(options);
|
|
|
var arr = [];
|
|
|
if (transaction)
|
|
|
arr.push(transaction)
|
|
@@ -1146,25 +1144,268 @@ async function getTokenTransfers(opt) {
|
|
|
|
|
|
|
|
|
|
|
|
+//获取交易记录
|
|
|
+//hash 0xe09ba3a4c9f7a8902e01af68d0f1f91906f3f7db1195227e61c45c0e86b2630a
|
|
|
+async function getTokenTransfersV2(opt) {
|
|
|
+ await initMasterSDK();
|
|
|
+ logger.log("fun getTokenTransfersV2 in ", opt);
|
|
|
+ const options = {};
|
|
|
+ options.type = 'all';
|
|
|
+ options.chain = 'bsc_mainnet';
|
|
|
+
|
|
|
+ if (opt.chain != null) {
|
|
|
+ options.chain = utils.getChainName(opt.chain);
|
|
|
+ logger.log('getTokenTransfersV2 getChainName =', options.chain);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (opt.order != null) {
|
|
|
+ options.order = opt.order;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (opt.startTime != null) {
|
|
|
+ options.from_date = opt.startTime;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (opt.endTime != null) {
|
|
|
+ options.to_date = opt.endTime;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (opt.from_block != null) {
|
|
|
+ options.from_block = opt.from_block;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (opt.to_block != null) {
|
|
|
+ options.to_block = opt.to_block;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (opt.transaction_hash) {
|
|
|
+ options.transaction_hash = opt.transaction_hash;
|
|
|
+ options.type = 'transaction_hash';
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ logger.log('getTokenTransfersV2 >>>>>', options);
|
|
|
+ if (options.type == 'all') {//查询主流币和 20 币所有的交易
|
|
|
+
|
|
|
+ if (opt.address != null) {
|
|
|
+ options.address = opt.address;
|
|
|
+ } else {
|
|
|
+ logger.error('getTokenTransfersV2 error please check address parameter is ok ?', options);
|
|
|
+ return toJson(ERROR_CODE_001, null, "please check address parameter is ok ?");
|
|
|
+ }
|
|
|
+
|
|
|
+ var t_1
|
|
|
+ var t_2
|
|
|
+
|
|
|
+ // Error: Request failed with status code 524
|
|
|
+ // 做一次重试
|
|
|
+ var tryCount = 4;
|
|
|
+ var delay = 1000
|
|
|
+ var interval = 500
|
|
|
+ do {
|
|
|
+ //主流币
|
|
|
+ try {
|
|
|
+ logger.log('getTokenTransfersV2 account getTransactions>>>>>', options);
|
|
|
+ t_1 = await getTransferRecord(options, 'native', 1);
|
|
|
+ logger.log('getTokenTransfersV2 native ret -->>> t_1', t_1);
|
|
|
+ break
|
|
|
+ } catch (error) {
|
|
|
+ if (tryCount == 1) {
|
|
|
+ t_1 = await getTransferRecord(options, 'native', 0);
|
|
|
+ if (t_1) {
|
|
|
+ logger.error('sync-node-native-data', JSON.stringify(t_1))
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ logger.error('sync-node-native-data error', JSON.stringify(options))
|
|
|
+ }
|
|
|
+ logger.error("getTokenTransfersV2 error:", '主流币:', error.toString(), JSON.stringify(options))
|
|
|
+ return toJson(ERROR_CODE_001, null, error.toString());
|
|
|
+ }
|
|
|
+ tryCount -= 1;
|
|
|
+ await utils.sleep(delay)
|
|
|
+ delay += interval
|
|
|
+ }
|
|
|
+ } while (tryCount >= 1);
|
|
|
+
|
|
|
+ // Error: Request failed with status code 524
|
|
|
+ tryCount = 4
|
|
|
+ delay = 1000
|
|
|
+ interval = 500
|
|
|
+ do {
|
|
|
+ //20币
|
|
|
+ try {
|
|
|
+ //token 获取交易记录如果没有时间有些地址会失败
|
|
|
+ if (!options.to_block) {
|
|
|
+ options.to_block = '10000000000'
|
|
|
+ }
|
|
|
+ logger.log('getTokenTransfersV2 account getTokenTransfers>>>>>', options);
|
|
|
+ t_2 = await getTransferRecord(options, 'token', 1);
|
|
|
+ logger.log('getTokenTransfersV2 token ret -->>> t_2', t_2);
|
|
|
+ break
|
|
|
+ } catch (error) {
|
|
|
+ if (tryCount == 1) {
|
|
|
+ t_2 = await getTransferRecord(options, 'token', 0);
|
|
|
+ if (t_2) {
|
|
|
+ logger.error('sync-node-token-data', JSON.stringify(t_2))
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ logger.error('sync-node-token-data error', JSON.stringify(options))
|
|
|
+ }
|
|
|
+ logger.error("getTokenTransfersV2 error:", 'token币:', error.toString(), JSON.stringify(options))
|
|
|
+ return toJson(ERROR_CODE_001, null, error.toString());
|
|
|
+ }
|
|
|
+ tryCount -= 1;
|
|
|
+ await utils.sleep(delay)
|
|
|
+ delay += interval
|
|
|
+ }
|
|
|
+ } while (tryCount >= 1);
|
|
|
+
|
|
|
+ //异常
|
|
|
+ if (t_2 && t_2.data.total > 0 && Array.isArray(t_2.data.results) && t_2.data.results.length <= 0) {
|
|
|
+ logger.error('getTokenTransfersV2 token 数据异常 -->>>', t_2.toString(), JSON.stringify(options));
|
|
|
+ return toJson(ERROR_CODE_001, null, 'token 数据异常.');
|
|
|
+ }
|
|
|
+
|
|
|
+ //排序组合
|
|
|
+ try {
|
|
|
+ let arr = t_1.data.results;
|
|
|
+ let arr1 = t_2.data.results;
|
|
|
+ if (Array.isArray(arr1) && Array.isArray(arr)) {
|
|
|
+ let arr2 = arr.concat(arr1);
|
|
|
+ t_1.data.results = arr2;
|
|
|
+ logger.log('getTokenTransfersV2-->>>concat t_1', t_1, t_1.data.results.length);
|
|
|
+ if (t_1.data.total != null) {
|
|
|
+ t_1.data.total = t_1.data.results.length
|
|
|
+ logger.log('getTokenTransfersV2-->>>concat total', t_1.data.total);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //将结果排序
|
|
|
+ t_1.data.results.sort((a, b) => {
|
|
|
+ let t1 = new Date(Date.parse(a.block_timestamp))
|
|
|
+ let t2 = new Date(Date.parse(b.block_timestamp))
|
|
|
+ return t2.getTime() - t1.getTime()
|
|
|
+ })
|
|
|
+ logger.log('getTokenTransfersV2-->>> sort t_1', t_1);
|
|
|
+ return toJson(SUCCEED_CODE, t_1.data, null);
|
|
|
+ } catch (error) {
|
|
|
+ logger.error("getTokenTransfersV2 排序组合 error :", error.toString(), JSON.stringify(options), JSON.stringify(t_1), JSON.stringify(t_2))
|
|
|
+ return toJson(ERROR_CODE_001, null, error.toString());
|
|
|
+ }
|
|
|
+ } else if (options.type == 'transaction_hash') {//根据哈希查询
|
|
|
+ var tryCount = 2
|
|
|
+ do {
|
|
|
+ try {
|
|
|
+ logger.log('getTokenTransfersV2 getTransaction options-->>> ', options);
|
|
|
+ const transaction = await getTransferRecord(options, 'hash', 1);
|
|
|
+ logger.log('getTokenTransfersV2 getTransaction ret-->>> ', transaction);
|
|
|
+ return transaction;
|
|
|
+ } catch (error) {
|
|
|
+ if (tryCount == 1) {
|
|
|
+ logger.error("native getTokenTransfersV2 error:", error.toString(), JSON.stringify(options))
|
|
|
+ var transaction = await getTransferRecord(options, 'hash', 0);
|
|
|
+ if (transaction) {
|
|
|
+ logger.error('sync-node-hash-data', JSON.stringify(transaction))
|
|
|
+ logger.log('getTokenTransfersV2 getTransaction ret-->>> ', transaction);
|
|
|
+ return transaction;
|
|
|
+ }
|
|
|
+ return toJson(ERROR_CODE_001, null, error.toString());
|
|
|
+ }
|
|
|
+ tryCount -= 1;
|
|
|
+ }
|
|
|
+ } while (tryCount >= 1);
|
|
|
+ } else {
|
|
|
+ return toJson(ERROR_CODE_001, null, "This type is not supported.");;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 获取交易记录 token,native
|
|
|
* @param {} opts
|
|
|
*/
|
|
|
-async function getTransferRecord(opts, type) {
|
|
|
- logger.info('getTransferRecord>>>>>>>>',opts,type)
|
|
|
+async function getTransferRecord(opts, type, use_moralis_sdk_) {
|
|
|
+ logger.info('getTransferRecord>>>>>>>>', opts, type)
|
|
|
//是否使用 moralis sdk 进行查询
|
|
|
- var use_moralis_sdk = 1
|
|
|
+ var use_moralis_sdk = use_moralis_sdk_
|
|
|
var temp_opts = { ...opts }
|
|
|
if (use_moralis_sdk) {
|
|
|
+ var results = []
|
|
|
if (type == 'native') {
|
|
|
- return await Moralis.Web3API.account.getTransactions(temp_opts)
|
|
|
+ var ret = await Moralis.Web3API.account.getTransactions(temp_opts)
|
|
|
+ if (ret.total > 0 && Array.isArray(ret.result) && ret.result.length > 0) {
|
|
|
+ for (let index = 0; index < ret.result.length; index++) {
|
|
|
+ const element = ret.result[index];
|
|
|
+ results.push({
|
|
|
+ type: 'native',
|
|
|
+ from_address: element.from_address,
|
|
|
+ to_address: element.to_address,
|
|
|
+ token_address: null,
|
|
|
+ block_number: element.block_number,
|
|
|
+ value: element.value,
|
|
|
+ gas: element.gas,
|
|
|
+ gas_price: element.gas_price,
|
|
|
+ block_timestamp: element.block_timestamp,
|
|
|
+ trx_hash: element.hash,
|
|
|
+ responseType:'moralis'
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
} else if (type == 'token') {
|
|
|
- return await Moralis.Web3API.account.getTokenTransfers(temp_opts);
|
|
|
+ var ret = await Moralis.Web3API.account.getTokenTransfers(temp_opts);
|
|
|
+ if (ret.total > 0 && Array.isArray(ret.result) && ret.result.length > 0) {
|
|
|
+ for (let index = 0; index < ret.result.length; index++) {
|
|
|
+ const element = ret.result[index];
|
|
|
+ results.push({
|
|
|
+ type: 'token',
|
|
|
+ from_address: element.from_address,
|
|
|
+ to_address: element.to_address,
|
|
|
+ token_address: element.address,
|
|
|
+ block_number: element.block_number,
|
|
|
+ value: element.value,
|
|
|
+ block_timestamp: element.block_timestamp,
|
|
|
+ trx_hash: element.transaction_hash,
|
|
|
+ responseType:'moralis'
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
} else if (type == 'hash') {
|
|
|
- return await Moralis.Web3API.native.getTransaction(temp_opts);
|
|
|
+ var ret = await Moralis.Web3API.native.getTransaction(temp_opts);
|
|
|
+ if (ret)
|
|
|
+ results.push({
|
|
|
+ type: 'hash',
|
|
|
+ from_address: ret.from_address,
|
|
|
+ to_address: ret.to_address,
|
|
|
+ token_address: null,
|
|
|
+ block_number: ret.block_number,
|
|
|
+ value: ret.value,
|
|
|
+ gas: ret.gas,
|
|
|
+ gas_price: ret.gas_price,
|
|
|
+ block_timestamp: ret.block_timestamp,
|
|
|
+ trx_hash: ret.hash,
|
|
|
+ responseType:'moralis'
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ code: 0,
|
|
|
+ data: {
|
|
|
+ total: results.length,
|
|
|
+ results: results
|
|
|
+ },
|
|
|
+ errMsg: null,
|
|
|
}
|
|
|
} else { //使用自建节点缓存 mysql 查询
|
|
|
-
|
|
|
+ if (type == 'native') {
|
|
|
+ temp_opts.type = 'native'
|
|
|
+ return await account_mysql.getAccountTransactions(temp_opts)
|
|
|
+ } else if (type == 'token') {
|
|
|
+ temp_opts.type = 'token'
|
|
|
+ return await account_mysql.getAccountTransactions(temp_opts)
|
|
|
+ } else if (type == 'hash') {
|
|
|
+ temp_opts.type = 'hash'
|
|
|
+ return await account_mysql.getAccountTransactions(temp_opts)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1173,7 +1414,7 @@ async function getTransferRecord(opts, type) {
|
|
|
* @param {*} opts
|
|
|
*/
|
|
|
async function getBalances(opts, type) {
|
|
|
- logger.info('getBalances>>>>>>>>',opts,type)
|
|
|
+ logger.info('getBalances>>>>>>>>', opts, type)
|
|
|
//是否使用 moralis sdk 进行查询
|
|
|
var use_moralis_sdk = 1
|
|
|
var temp_opts = { ...opts }
|
|
@@ -1192,6 +1433,7 @@ async function getBalances(opts, type) {
|
|
|
module.exports = {
|
|
|
transfer,
|
|
|
getTokenTransfers,
|
|
|
+ getTokenTransfersV2,
|
|
|
toJson,
|
|
|
getAllTokenWithdrawInfoLists,
|
|
|
getAllTotkenPrice,
|