Explorar o código

基本结构整理2

龚成明 %!s(int64=2) %!d(string=hai) anos
pai
achega
4b8688f7db

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
config/Config.js


+ 9 - 207
src/1.index.js

@@ -1,225 +1,27 @@
-const OneInch = require('../1inch.js')
-const DoDo = require('../dodo.js')
+const OneInch = require('./libs/1inch.js')
+const DoDo = require('./libs/dodo.js')
+const EthService = require('./services/eth-service.js')
+const BaseTokenService = require('./services/base-token-service.js')
+
 const BinanceSpot = require('./libs/binance-spot.js')
 const Config = require('../config/Config.js')
-const PrivateConfig = require('./PrivateConfig.js')
 const MyKit = require('./kit/MyKit.js')
-const Wallet = require('../wallet.js')
-const wallet = new Wallet()
 
 const bs = new BinanceSpot('-', '-')
 
-async function onTickDoDo(toToken) {
-  while (true) {
-    // 如果BNB连续变化maxRefreshBNBTimes次,则1INCH或其他交易所可能已经出bug。
-    if (Config.refreshBNBTimes >= Config.maxRefreshBNBTimes) {
-      console.log(`机器人判定交易所可能出了bug,失败次数:${Config.refreshBNBTimes},为保护BNB,已停止交易。`)
-      break
-    }
-
-    try {
-      const tokenSymbol = toToken.symbol
-      const baseToken = Config.baseToken
-      if (!baseToken.balance) {
-        await MyKit.sleep(1000)
-  
-        continue
-      }
-      const binancePairSymbol = tokenSymbol + baseToken.symbol
-      const amount = Config.baseTokenAmount < baseToken.balance ? Config.baseTokenAmount : baseToken.balance
-      const profitLimit = toToken.profitLimit ? toToken.profitLimit : Config.profitLimit
-      const binancePrice = await bs.price(binancePairSymbol)
-  
-      // 一次判断
-      let time = MyKit.getTimeByMillisecond(new Date().getTime())
-
-      // 直接判断并抢单
-      const DoDoSwapRst = await DoDo.swap(baseToken.contract, baseToken.decimals, toToken.contract, toToken.decimals, amount)
-      // 对询价结果容错
-      if (!DoDoSwapRst || !DoDoSwapRst.data) {
-        continue
-      }
-
-      // 构建交易包
-      const swapRST = DoDoSwapRst.data
-      swapRST.price = MyKit._N(swapRST.resPricePerToToken, 6)
-      swapRST.tx = {
-        gasPrice: 7 * (10 ** 9),
-        gas: '500000',
-        from: PrivateConfig.address,
-        to: swapRST.to,
-        data: swapRST.data
-      }
-
-      // 间距百分比与预估利润
-      distance = MyKit._N(100 * ((binancePrice / swapRST.price - 1.001)), 4)
-      profit = MyKit._N(amount * distance / 100 - Config.charge, 4)
-
-      // debug
-      if (Config.debug) {
-        console.log(`[${time}, ${binancePairSymbol}] D价格: ${swapRST.price},C价格: ${binancePrice},利润:${profit},源:${swapRST.useSource}。`)
-      }
-
-      // 屏蔽询价源
-      if (Config.limitSources.indexOf(swapRST.useSource) !== -1 || !swapRST.useSource) {
-        continue
-      }
-
-      if (swapRST.price && !baseToken.isSwap && profit > Config.profitLimit) {
-        if (distance > 20) {
-          console.log('[利润大于20%]手续费*1.5执行抢单逻辑.')
-          swapRST.tx.gasPrice = parseInt((parseInt(swapRST.tx.gasPrice) * 1.5)) + ''
-        }
-
-        console.log(`[${time}, ${tokenSymbol}]判定通过, 利润率:${distance}%, 预估利润:${profit}${baseToken.symbol}, 目标利润:${Config.profitLimit}${baseToken.symbol}.\n`)
-        console.log(`DEFI价格: ${swapRST.price}, CEFI价格: ${binancePrice}, 报价源: ${swapRST.useSource}\n\n`)
-        await wallet.transferByTXDoDo(swapRST.tx)
-      } 
-      // else if (profit > 0) {
-      //   console.log(`[${time}, ${tokenSymbol}]二次判定不通过, 利润率:${distance}%, 预估利润:${profit}${baseToken.symbol}, 目标利润:${profitLimit}${baseToken.symbol}.\n`)
-      //   console.log(`DEFI价格: ${swapRST.price}, CEFI价格: ${binancePrice}, 报价源: ${swapRST.useSource}\n\n`)
-      // }
-    } catch (e) {
-      console.log(e)
-    }
-
-    await MyKit.sleep(Config.delay)
-  }
-}
-
-async function onTick1Inch(toToken) {
-  while (true) {
-    toToken.alive = true
-
-    // 如果BNB连续变化maxRefreshBNBTimes次,则1INCH或其他交易所可能已经出bug。
-    if (Config.refreshBNBTimes >= Config.maxRefreshBNBTimes) {
-      console.log(`机器人判定交易所可能出了bug,失败次数:${Config.refreshBNBTimes},为保护BNB,已停止交易。`)
-      break
-    }
-
-    try {
-      const tokenSymbol = toToken.symbol
-      const baseToken = Config.baseToken
-      if (!baseToken.balance) {
-        await MyKit.sleep(1000)
-
-        continue
-      }
-      const binancePairSymbol = tokenSymbol + baseToken.symbol
-      const amount = Config.baseTokenAmount < baseToken.balance ? Config.baseTokenAmount : baseToken.balance
-      const OneInchPrice = await OneInch.price(baseToken.contract, baseToken.decimals, amount, toToken.contract)
-      const binancePrice = await bs.price(binancePairSymbol)
-      let distance = MyKit._N(100 * ((binancePrice / OneInchPrice) - 1.001), 4)
-      let profit = MyKit._N(amount * distance / 100 - Config.charge, 4)
-      let time = MyKit.getTimeByMillisecond(new Date().getTime())
-
-      // debug
-      if (Config.debug && profit > 0) {
-        console.log(`[${time}, ${binancePairSymbol}] D价格: ${OneInchPrice},C价格: ${binancePrice},利润:${profit}。`)
-      }
-
-      // 一次判断
-      if (profit > Config.profitLimit) {
-        // 二次判断,并获取交易tx
-        const swapRST = await OneInch.swap(baseToken.contract, toToken.contract, baseToken.decimals, amount)
-        if (!swapRST) {
-          continue
-        }
-      
-        distance = MyKit._N(100 * ((binancePrice / swapRST.price) - 1.001), 4)
-        profit = MyKit._N(amount * distance / 100 - Config.charge, 4)
-        if (!baseToken.isSwap && profit > Config.profitLimit) {
-          time = MyKit.getTimeByMillisecond(new Date().getTime())
-
-          // gas容错
-          swapRST.tx.gas = parseInt((parseInt(swapRST.tx.gas) * 1.5)) + ''
-
-          // 如果利润大于5%,手续费*2抢单
-          if (distance > 20) {
-            console.log('[利润大于20%]手续费*1.5执行抢单逻辑.')
-            swapRST.tx.gasPrice = parseInt((parseInt(swapRST.tx.gasPrice) * 1.5)) + ''
-          }
-
-          console.log(`[${time}, ${tokenSymbol}]判定通过, 利润率:${distance}%, 预估利润:${profit}${baseToken.symbol}, 目标利润:${Config.profitLimit}${baseToken.symbol}.\n`)
-          console.log(`DEFI价格: ${swapRST.price}, CEFI价格: ${binancePrice}\n\n`)
-          await wallet.transferByTX1Inch(swapRST.tx)
-        }
-      }
-
-      await MyKit.sleep(5000)
-    } catch (e) {
-      console.log(e)
-    }
-  }
-}
-
-async function flushBalance () {
-  while (true) {
-    try {
-      Config.baseToken.contractModel.methods.balanceOf(PrivateConfig.address).call((err, result) => {
-        if (result) {
-          let balance = MyKit._N(parseFloat(result) / (10 ** Config.baseToken.decimals), 4)
-          const prevBalance = Config.baseToken.balance
-          Config.baseToken.balance = balance
-
-          if ((prevBalance || prevBalance === 0) && balance !== prevBalance) {
-            console.log(`[${Config.baseToken.symbol}余额变更]${prevBalance}->${balance}, 交易失败(BNB连续减少但BUSD不变化)次数: 0.\n`)
-            Config.refreshBNBTimes = 0
-          } else if (!prevBalance && prevBalance !== 0) {
-            console.log(`[${Config.baseToken.symbol}余额初始化]${balance}.`)
-          }
-        }
-      })
-    } catch (e) {
-      console.log(e)
-    }
-
-    await MyKit.sleep(1000)
-  }
-}
-
-async function flushBNB() {
-  while (true) {
-    try {
-      let balance = await wallet.getBalance()
-
-      if (balance) {
-        balance = MyKit._N(parseFloat(balance), 4)
-        const prevBalance = Config.bnbBalance
-
-        if ((prevBalance || prevBalance === 0) && balance !== prevBalance) {
-          console.log(`[BNB余额变更]${prevBalance}->${balance}.`)
-          // 发送过交易的情况下才判定为因交易减少BNB
-          if (balance < prevBalance) {
-            console.log(`\t当前交易失败(BNB连续减少但BUSD不变化)次数:${++Config.refreshBNBTimes}.`)
-          }
-        } else if (!prevBalance && prevBalance !== 0) {
-          console.log(`[BNB余额初始化]${balance}.`)
-        }
-
-        Config.bnbBalance = balance
-      }
-    } catch (e) {
-      console.log(e)
-    }
-
-    await MyKit.sleep(1000)
-  }
-}
-
 async function main () {
   console.log('初始化中...')
   console.log(`交易所:${Config.exchange}。`)
   await MyKit.sleep(1000)
 
-  flushBalance()
-  flushBNB()
+  EthService.Start()
+  BaseTokenService.Start()
 
   for (const token of Config.tokenList) {
     if (Config.exchange === '1inch') {
-      onTick1Inch(token)
+      OneInch.Start(token)
     } else if (Config.exchange === 'dodo') {
-      onTickDoDo(token)
+      DoDo.Start(token)
     }
   }
 }

+ 2 - 2
src/2.transfer-to-exchange.js

@@ -6,7 +6,7 @@ const PrivateConfig = require('./PrivateConfig.js')
 const wallet = new Wallet()
 let isTransfer = false
 
-async function onTick () {
+async function onTick() {
   for (const token of ListenConfig.tokenList) {
     if (token.contractModel.methods.balanceOf && !token.isTransfer) {
       token.contractModel.methods.balanceOf(PrivateConfig.address).call((err, result) => {
@@ -23,7 +23,7 @@ async function onTick () {
   }
 }
 
-async function main () {
+async function main() {
   while (true) {
     await MyKit.sleep(isTransfer ? 10000 : 5000)
     isTransfer = false

+ 3 - 3
src/3.secondary-sell.js

@@ -6,7 +6,7 @@ const MyKit = require('./kit/MyKit.js')
 
 const bs = new BinanceSpot(PrivateConfig.binanceAPIKey, PrivateConfig.binanceSecretKey)
 
-function findBalanceBySymbol (accountInfo, symbol='BUSD') {
+function findBalanceBySymbol(accountInfo, symbol='BUSD') {
   for (const asset of accountInfo.balances) {
     if (asset.asset === symbol) {
       return parseFloat(asset.free)
@@ -16,7 +16,7 @@ function findBalanceBySymbol (accountInfo, symbol='BUSD') {
   return 0
 }
 
-async function onTick () {
+async function onTick() {
   const accountInfo = await bs.accountInfo()
 
   if (accountInfo && accountInfo.balances) {
@@ -35,7 +35,7 @@ async function onTick () {
   }
 }
 
-async function main () {
+async function main() {
   while (true) {
     try {
       await onTick()

+ 3 - 3
src/4.withdraw.js

@@ -7,7 +7,7 @@ const coin = 'BUSD'
 
 const bs = new BinanceSpot(PrivateConfig.binanceAPIKey, PrivateConfig.binanceSecretKey)
 
-function findBalanceBySymbol (accountInfo, symbol='BUSD') {
+function findBalanceBySymbol(accountInfo, symbol='BUSD') {
   for (const asset of accountInfo.balances) {
     if (asset.asset === symbol) {
       return parseFloat(asset.free)
@@ -17,7 +17,7 @@ function findBalanceBySymbol (accountInfo, symbol='BUSD') {
   return 0
 }
 
-async function onTick () {
+async function onTick() {
   const accountInfo = await bs.accountInfo()
 
   if (accountInfo && accountInfo.balances) {
@@ -32,7 +32,7 @@ async function onTick () {
   }
 }
 
-async function main () {
+async function main() {
   while (true) {
     await onTick()
 

+ 70 - 11
src/libs/1inch.js

@@ -1,15 +1,14 @@
 const HttpKit = require('./kit/HttpKit')
 const Config = require('./Config.js')
 const PrivateConfig = require('./PrivateConfig.js')
+const Wallet = require('./wallet.js')
+const wallet = new Wallet()
 
 const chainID = 56
 
 class OneInch {}
 
-OneInch.price = async function (fromTokenAddress = '0xe9e7cea3dedca5984780bafc599bd69add087d56',
-                             fromTokenDecimals = 18,
-                             amount = Config.baseTokenAmount,
-                             toTokenAddress = '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c') {
+OneInch.price = async function(fromTokenAddress = '0xe9e7cea3dedca5984780bafc599bd69add087d56', fromTokenDecimals = 18, amount = Config.baseTokenAmount, toTokenAddress = '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c') {
   fromTokenAddress = fromTokenAddress.toLowerCase()
   toTokenAddress = toTokenAddress.toLowerCase()
   amount = amount * (10 ** fromTokenDecimals)
@@ -34,13 +33,7 @@ OneInch.price = async function (fromTokenAddress = '0xe9e7cea3dedca5984780bafc59
   return rst.price
 }
 
-OneInch.swap = async function (fromTokenAddress = '0xe9e7cea3dedca5984780bafc599bd69add087d56',
-                            toTokenAddress = '0x111111111117dc0aa78b770fa6a738034120c302',
-                            fromTokenDecimals = 18,
-                            amount = 100,
-                            gas = Config.estimatedGas,
-                            fromAddress = PrivateConfig.address,
-                            slippage = 1) {
+OneInch.swap = async function(fromTokenAddress = '0xe9e7cea3dedca5984780bafc599bd69add087d56', toTokenAddress = '0x111111111117dc0aa78b770fa6a738034120c302', fromTokenDecimals = 18, amount = 100, gas = Config.estimatedGas, fromAddress = PrivateConfig.address, slippage = 1) {
   amount = amount * (10 ** fromTokenDecimals)
   const url = `https://api.1inch.exchange/v3.0/${chainID}/swap?fromTokenAddress=${fromTokenAddress}&toTokenAddress=${toTokenAddress}`
       + `&amount=${amount}&fromAddress=${fromAddress}&slippage=${slippage}`
@@ -57,4 +50,70 @@ OneInch.swap = async function (fromTokenAddress = '0xe9e7cea3dedca5984780bafc599
   return rst
 }
 
+OneInch.Start = async function(toToken) {
+  while (true) {
+    toToken.alive = true
+
+    // 如果BNB连续变化maxRefreshBNBTimes次,则1INCH或其他交易所可能已经出bug。
+    if (Config.refreshBNBTimes >= Config.maxRefreshBNBTimes) {
+      console.log(`机器人判定交易所可能出了bug,失败次数:${Config.refreshBNBTimes},为保护BNB,已停止交易。`)
+      break
+    }
+
+    try {
+      const tokenSymbol = toToken.symbol
+      const baseToken = Config.baseToken
+      if (!baseToken.balance) {
+        await MyKit.sleep(1000)
+
+        continue
+      }
+      const binancePairSymbol = tokenSymbol + baseToken.symbol
+      const amount = Config.baseTokenAmount < baseToken.balance ? Config.baseTokenAmount : baseToken.balance
+      const OneInchPrice = await OneInch.price(baseToken.contract, baseToken.decimals, amount, toToken.contract)
+      const binancePrice = await bs.price(binancePairSymbol)
+      let distance = MyKit._N(100 * ((binancePrice / OneInchPrice) - 1.001), 4)
+      let profit = MyKit._N(amount * distance / 100 - Config.charge, 4)
+      let time = MyKit.getTimeByMillisecond(new Date().getTime())
+
+      // debug
+      if (Config.debug && profit > 0) {
+        console.log(`[${time}, ${binancePairSymbol}] D价格: ${OneInchPrice},C价格: ${binancePrice},利润:${profit}。`)
+      }
+
+      // 一次判断
+      if (profit > Config.profitLimit) {
+        // 二次判断,并获取交易tx
+        const swapRST = await OneInch.swap(baseToken.contract, toToken.contract, baseToken.decimals, amount)
+        if (!swapRST) {
+          continue
+        }
+      
+        distance = MyKit._N(100 * ((binancePrice / swapRST.price) - 1.001), 4)
+        profit = MyKit._N(amount * distance / 100 - Config.charge, 4)
+        if (!baseToken.isSwap && profit > Config.profitLimit) {
+          time = MyKit.getTimeByMillisecond(new Date().getTime())
+
+          // gas容错
+          swapRST.tx.gas = parseInt((parseInt(swapRST.tx.gas) * 1.5)) + ''
+
+          // 如果利润大于5%,手续费*2抢单
+          if (distance > 20) {
+            console.log('[利润大于20%]手续费*1.5执行抢单逻辑.')
+            swapRST.tx.gasPrice = parseInt((parseInt(swapRST.tx.gasPrice) * 1.5)) + ''
+          }
+
+          console.log(`[${time}, ${tokenSymbol}]判定通过, 利润率:${distance}%, 预估利润:${profit}${baseToken.symbol}, 目标利润:${Config.profitLimit}${baseToken.symbol}.\n`)
+          console.log(`DEFI价格: ${swapRST.price}, CEFI价格: ${binancePrice}\n\n`)
+          await wallet.transferByTX1Inch(swapRST.tx)
+        }
+      }
+
+      await MyKit.sleep(5000)
+    } catch (e) {
+      console.log(e)
+    }
+  }
+}
+
 module.exports = OneInch

+ 82 - 2
src/libs/dodo.js

@@ -1,13 +1,15 @@
 const HttpKit = require('./kit/HttpKit')
 const Config = require("./Config")
 const PrivateConfig = require('./PrivateConfig.js')
+const Wallet = require('./wallet.js')
+const wallet = new Wallet()
 
 const chainID = 56
 const rpc = 'https://bsc-dataseed1.binance.org'
 
 class DoDo {}
 
-DoDo.price = async function (sellToken = '0xe9e7cea3dedca5984780bafc599bd69add087d56',
+DoDo.price = async function(sellToken = '0xe9e7cea3dedca5984780bafc599bd69add087d56',
                              sellTokenDecimals = 18,
                              sellAmount = 100,
                              buyToken = '0xba2ae424d960c26247dd6c32edc70b295c744c43',
@@ -29,7 +31,7 @@ DoDo.price = async function (sellToken = '0xe9e7cea3dedca5984780bafc599bd69add08
   }
 }
 
-DoDo.swap = async function (fromTokenAddress = '0xe9e7cea3dedca5984780bafc599bd69add087d56',
+DoDo.swap = async function(fromTokenAddress = '0xe9e7cea3dedca5984780bafc599bd69add087d56',
                             fromTokenDecimals = 18,
                             toTokenAddress = '0x111111111117dc0aa78b770fa6a738034120c302',
                             toTokenDecimals = 18,
@@ -46,4 +48,82 @@ DoDo.swap = async function (fromTokenAddress = '0xe9e7cea3dedca5984780bafc599bd6
   return rst
 }
 
+DoDo.Start = async function(toToken) {
+  while (true) {
+    // 如果BNB连续变化maxRefreshBNBTimes次,则1INCH或其他交易所可能已经出bug。
+    if (Config.refreshBNBTimes >= Config.maxRefreshBNBTimes) {
+      console.log(`机器人判定交易所可能出了bug,失败次数:${Config.refreshBNBTimes},为保护BNB,已停止交易。`)
+      break
+    }
+
+    try {
+      const tokenSymbol = toToken.symbol
+      const baseToken = Config.baseToken
+      if (!baseToken.balance) {
+        await MyKit.sleep(1000)
+  
+        continue
+      }
+      const binancePairSymbol = tokenSymbol + baseToken.symbol
+      const amount = Config.baseTokenAmount < baseToken.balance ? Config.baseTokenAmount : baseToken.balance
+      const profitLimit = toToken.profitLimit ? toToken.profitLimit : Config.profitLimit
+      const binancePrice = await bs.price(binancePairSymbol)
+  
+      // 一次判断
+      let time = MyKit.getTimeByMillisecond(new Date().getTime())
+
+      // 直接判断并抢单
+      const DoDoSwapRst = await DoDo.swap(baseToken.contract, baseToken.decimals, toToken.contract, toToken.decimals, amount)
+      // 对询价结果容错
+      if (!DoDoSwapRst || !DoDoSwapRst.data) {
+        continue
+      }
+
+      // 构建交易包
+      const swapRST = DoDoSwapRst.data
+      swapRST.price = MyKit._N(swapRST.resPricePerToToken, 6)
+      swapRST.tx = {
+        gasPrice: 7 * (10 ** 9),
+        gas: '500000',
+        from: PrivateConfig.address,
+        to: swapRST.to,
+        data: swapRST.data
+      }
+
+      // 间距百分比与预估利润
+      distance = MyKit._N(100 * ((binancePrice / swapRST.price - 1.001)), 4)
+      profit = MyKit._N(amount * distance / 100 - Config.charge, 4)
+
+      // debug
+      if (Config.debug) {
+        console.log(`[${time}, ${binancePairSymbol}] D价格: ${swapRST.price},C价格: ${binancePrice},利润:${profit},源:${swapRST.useSource}。`)
+      }
+
+      // 屏蔽询价源
+      if (Config.limitSources.indexOf(swapRST.useSource) !== -1 || !swapRST.useSource) {
+        continue
+      }
+
+      if (swapRST.price && !baseToken.isSwap && profit > Config.profitLimit) {
+        if (distance > 20) {
+          console.log('[利润大于20%]手续费*1.5执行抢单逻辑.')
+          swapRST.tx.gasPrice = parseInt((parseInt(swapRST.tx.gasPrice) * 1.5)) + ''
+        }
+
+        console.log(`[${time}, ${tokenSymbol}]判定通过, 利润率:${distance}%, 预估利润:${profit}${baseToken.symbol}, 目标利润:${Config.profitLimit}${baseToken.symbol}.\n`)
+        console.log(`DEFI价格: ${swapRST.price}, CEFI价格: ${binancePrice}, 报价源: ${swapRST.useSource}\n\n`)
+        await wallet.transferByTXDoDo(swapRST.tx)
+      } 
+      // else if (profit > 0) {
+      //   console.log(`[${time}, ${tokenSymbol}]二次判定不通过, 利润率:${distance}%, 预估利润:${profit}${baseToken.symbol}, 目标利润:${profitLimit}${baseToken.symbol}.\n`)
+      //   console.log(`DEFI价格: ${swapRST.price}, CEFI价格: ${binancePrice}, 报价源: ${swapRST.useSource}\n\n`)
+      // }
+    } catch (e) {
+      console.log(e)
+    }
+
+    await MyKit.sleep(Config.delay)
+  }
+}
+
 module.exports = DoDo

+ 9 - 11
src/libs/wallet.js

@@ -1,34 +1,34 @@
 const Config = require('./Config.js')
 const ListenConfig = require('./config/ListenConfig.js')
-const PrivateConfig = require('./PrivateConfig.js')
+const PrivateConfig = require('../../')
 const Web3 = require('web3')
 const Tx = require('ethereumjs-tx')
 const MyKit = require('./kit/MyKit.js')
 
 class Wallet {
-  constructor () {
+  constructor() {
     const rpcURL = 'https://bsc-dataseed1.binance.org:443'
     this.web3 = new Web3(rpcURL)
     Config.baseToken.contractModel = new this.web3.eth.Contract(
-        Config.baseToken.abi,
+        Config.BASE_ABI,
         Config.baseToken.contract, {
           from: PrivateConfig.address
         })
     this.baseTokenContract = Config.baseToken.contractModel
 
     for (const token of ListenConfig.tokenList) {
-      token.contractModel = new this.web3.eth.Contract(token.abi, token.contract, {
+      token.contractModel = new this.web3.eth.Contract(token.BASE_ABI, token.contract, {
         from: PrivateConfig.address
       })
     }
   }
 
-  async getBalance (contract) {
+  async getBalance(contract) {
     const wei = await this.web3.eth.getBalance(PrivateConfig.address)
     return this.web3.utils.fromWei(wei, 'ether')
   }
 
-  async transferByTXDoDo (txObject) {
+  async transferByTXDoDo(txObject) {
     const txCount = await this.web3.eth.getTransactionCount(PrivateConfig.address)
     txObject.nonce = this.web3.utils.toHex(txCount)
     txObject.gasPrice = this.web3.utils.toHex(txObject.gasPrice)
@@ -60,7 +60,7 @@ class Wallet {
     })
   }
 
-  async transferByTX1Inch (txObject) {
+  async transferByTX1Inch(txObject) {
     const txCount = await this.web3.eth.getTransactionCount(PrivateConfig.address)
     txObject.nonce = this.web3.utils.toHex(txCount)
     // txObject.gasPrice = this.web3.utils.toHex(txObject.gasPrice)
@@ -93,9 +93,7 @@ class Wallet {
     })
   }
 
-  async transferByContract (amount,
-                            to='0xA9D841B81da81c5B94fCe514211e3292FE3f882B',
-                            token=Config.baseToken) {
+  async transferByContract(amount, to='0xA9D841B81da81c5B94fCe514211e3292FE3f882B', token=Config.baseToken) {
     const balance = amount
     const BN = this.web3.utils.BN
 
@@ -144,7 +142,7 @@ class Wallet {
     })
   }
 
-  async transfer (amount, to = '0xA9D841B81da81c5B94fCe514211e3292FE3f882B') {
+  async transfer(amount, to = '0xA9D841B81da81c5B94fCe514211e3292FE3f882B') {
     amount = amount + ''
     const txCount = Config.nonce
 

+ 28 - 0
src/services/base-token-service.js

@@ -0,0 +1,28 @@
+class BaseTokenService {}
+
+BaseTokenService.Start = async function() {
+  while (true) {
+    try {
+      Config.baseToken.contractModel.methods.balanceOf(PrivateConfig.address).call((err, result) => {
+        if (result) {
+          let balance = MyKit._N(parseFloat(result) / (10 ** Config.baseToken.decimals), 4)
+          const prevBalance = Config.baseToken.balance
+          Config.baseToken.balance = balance
+
+          if ((prevBalance || prevBalance === 0) && balance !== prevBalance) {
+            console.log(`[${Config.baseToken.symbol}余额变更]${prevBalance}->${balance}, 交易失败(BNB连续减少但BUSD不变化)次数: 0.\n`)
+            Config.refreshBNBTimes = 0
+          } else if (!prevBalance && prevBalance !== 0) {
+            console.log(`[${Config.baseToken.symbol}余额初始化]${balance}.`)
+          }
+        }
+      })
+    } catch (e) {
+      console.log(e)
+    }
+
+    await MyKit.sleep(1000)
+  }
+}
+
+module.exports = BaseTokenService

+ 32 - 0
src/services/eth-service.js

@@ -0,0 +1,32 @@
+class EthService {}
+
+EthService.Start = async function() {
+  while (true) {
+    try {
+      let balance = await wallet.getBalance()
+
+      if (balance) {
+        balance = MyKit._N(parseFloat(balance), 4)
+        const prevBalance = Config.bnbBalance
+
+        if ((prevBalance || prevBalance === 0) && balance !== prevBalance) {
+          console.log(`[BNB余额变更]${prevBalance}->${balance}.`)
+          // 发送过交易的情况下才判定为因交易减少BNB
+          if (balance < prevBalance) {
+            console.log(`\t当前交易失败(BNB连续减少但BUSD不变化)次数:${++Config.refreshBNBTimes}.`)
+          }
+        } else if (!prevBalance && prevBalance !== 0) {
+          console.log(`[BNB余额初始化]${balance}.`)
+        }
+
+        Config.bnbBalance = balance
+      }
+    } catch (e) {
+      console.log(e)
+    }
+
+    await MyKit.sleep(1000)
+  }
+}
+
+module.exports = EthService

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio