price-monitor.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. const OneTask = require('../../libs/one-task')
  2. const OneInch = require('../../libs/web3/1inch')
  3. const BinanceSpot = require('../../libs/binance/binance-spot')
  4. const Config = require('../../config/config')
  5. const NumKit = require('../../kit/num-kit')
  6. const PriceMonitorConfig = require('./config/price-monitor-config')
  7. const showPrices = function(context, task) {
  8. const logger = task.logger
  9. const fileLogger = task.fileLogger
  10. const tokenMap = context.tokenMap
  11. console.clear()
  12. console.info(`----------------------------------------------------------------------------------------------------------------------------`)
  13. console.info(`| pair\t\t\t| 1inch\t\t\t\t| binance\t\t| distance\t\t\t| percentage\t\t\t|`)
  14. console.info(`----------------------------------------------------------------------------------------------------------------------------`)
  15. Object.keys(tokenMap).forEach((tokenHash) => {
  16. const token = tokenMap[tokenHash]
  17. const pair = token.exchange.pair
  18. const OneInchPrice = token.OneInchPrice
  19. const BinancePrice = token.BinancePrice
  20. const DistancePrice = token.DistancePrice
  21. const percentage = NumKit.getSubFloat((DistancePrice / OneInchPrice) * 100, 2)
  22. // 价格非法的就不输出了
  23. if ((() => {
  24. return !OneInchPrice || !BinancePrice || !DistancePrice
  25. })()) return
  26. // 需要输出到文件的打印逻辑
  27. if ((() => {
  28. return percentage > PriceMonitorConfig.percentageLimit
  29. })()) {
  30. fileLogger.info(`| ${pair}\t\t| ${OneInchPrice}\t\t| ${BinancePrice}\t\t| ${DistancePrice}\t\t| ${percentage}\t\t|`)
  31. }
  32. console.info(`| ${pair}\t\t| ${OneInchPrice}\t\t| ${BinancePrice}\t\t| ${DistancePrice}\t\t| ${percentage}\t\t|`)
  33. })
  34. console.info(`----------------------------------------------------------------------------------------------------------------------------`)
  35. logger.info('')
  36. }
  37. const onTickFun = async function() {
  38. const task = this
  39. const context = task.context
  40. const tokenMap = context.tokenMap
  41. const tokenContractAddressList = Object.keys(tokenMap)
  42. // 搜集所有价格数据
  43. for (const tokenHash of tokenContractAddressList) {
  44. const toToken = tokenMap[tokenHash]
  45. const fromIerc20Token = Config.baseIerc20Token
  46. const amount = Config.baseTokenAmount
  47. const OneInchPrice = NumKit.getSubFloat(await OneInch.price(fromIerc20Token.contract, tokenHash, amount), 8)
  48. const BinancePrice = NumKit.getSubFloat(await BinanceSpot.realPrice(toToken.exchange.pair), 8)
  49. toToken.OneInchPrice = OneInchPrice
  50. toToken.BinancePrice = BinancePrice
  51. toToken.DistancePrice = NumKit.getSubFloat(BinancePrice - OneInchPrice, 8)
  52. }
  53. // 绘制帧
  54. showPrices(context, task)
  55. }
  56. const priceMonitor = new OneTask('PriceMonitor',5 * 1000, OneTask.baseInit, onTickFun)
  57. priceMonitor.Start()