pullv3.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { web3 } from "hardhat";
  2. import History from "./interface/history";
  3. import contracts from "../config/contracts";
  4. import logger from "../utils/logger";
  5. import v3_routers from "../config/v3_routers";
  6. import {BigNumber} from "ethers";
  7. import {replaceAll} from "hardhat/internal/util/strings";
  8. async function handlePosition(router: String, factory: String) {
  9. try {
  10. // 拉取当前pull状态信息
  11. const pullState = await History.findByHashOrBlockOrDataVague('UNIV3DEX', factory, '')
  12. let nowPosition = 0
  13. // 没有状态信息的情况
  14. if (pullState.data.length == 0) {
  15. const appendRst = await History.appendOrUpdate('UNIV3DEX', factory, {"now": nowPosition})
  16. logger.debug(appendRst)
  17. } else {
  18. nowPosition = pullState.data[0].dataObj.now
  19. }
  20. return nowPosition
  21. } catch (e) {
  22. logger.error(`Pull state error, router: ${router}, factory: ${factory}`)
  23. logger.error(e)
  24. }
  25. return 0
  26. }
  27. async function handleAFactory(router: String, factory: String, position: number, v3_tool: any, v3PositionManager: any) {
  28. let errorCount = 0
  29. while (true) {
  30. try {
  31. const positionInfo = await v3PositionManager.methods.positions(position).call()
  32. const info = await v3_tool.methods.getMoreInfo(positionInfo.token0, positionInfo.token1, positionInfo.fee).call()
  33. const symbol0 = info.symbol0.replace(/[^A-Za-z0-9 ]+/g, '').substring(0, 10)
  34. const symbol1 = info.symbol1.replace(/[^A-Za-z0-9 ]+/g, '').substring(0, 10)
  35. const name = `${router.slice(2, 4) + router.slice(-2)}_${symbol0}_${symbol1}`
  36. const sum2 = replaceAll(BigNumber.from(positionInfo.token0).add(BigNumber.from(positionInfo.token1))._hex, '0x0', '0x')
  37. const data = {
  38. LP: info.lp,
  39. decimals0: info.decimals0,
  40. decimals1: info.decimals1,
  41. factory: factory,
  42. feei: positionInfo.fee,
  43. id: position,
  44. name: name,
  45. r0: info.r0,
  46. r1: info.r1,
  47. router: router,
  48. sum2: sum2,
  49. symbol0: symbol0,
  50. symbol1: symbol1,
  51. token0: positionInfo.token0,
  52. token1: positionInfo.token1
  53. }
  54. const insertRst = await History.appendOrUpdate('0', info.lp, data)
  55. logger.debug(insertRst.msg, `, hash: ${info.lp}, ${position}`)
  56. // 每十次更新一次position
  57. if (position % 50 == 0) {
  58. await History.appendOrUpdate('UNIV3DEX', factory, {"now": position})
  59. logger.debug(`Position updated: ${position}`)
  60. }
  61. errorCount = 0
  62. } catch (e) {
  63. logger.error(JSON.stringify(e))
  64. errorCount++
  65. }
  66. position++
  67. if (errorCount >= 5) {
  68. position = position - 5
  69. break;
  70. }
  71. }
  72. }
  73. async function main() {
  74. const fromZero: boolean = true
  75. logger.debug('Pull v3 start.')
  76. const v3_router_abi = require('../abi/UNIV3_ROUTER_ABI.json')
  77. const positionManagerAbi = require('../abi/UNIV3_POSITION_MANAGER_ABI.json')
  78. const v3_tool_abi = require('../artifacts/contracts/V3Tool.sol/V3Tool.json').abi
  79. // 初始化 v3工具箱
  80. const v3_tool = new web3.eth.Contract(v3_tool_abi, contracts.TOOLS_V3)
  81. // 初始化PositionManager
  82. const v3PositionManager = new web3.eth.Contract(positionManagerAbi, contracts.UNIV3_POSITION)
  83. for (let router_index = 0; router_index < v3_routers.length; router_index++) {
  84. const v3_router_address = v3_routers[router_index]
  85. try {
  86. logger.debug(`Router address: ${v3_router_address}`)
  87. // 获取工厂地址
  88. const v3_router = new web3.eth.Contract(v3_router_abi, v3_router_address)
  89. const v3_factory_address = await v3_router.methods.factory().call()
  90. // 获取当前pull状态
  91. const position = fromZero ? 1 : await handlePosition(v3_router_address, v3_factory_address)
  92. logger.debug(`factory: ${v3_factory_address}, ${position}.`)
  93. await handleAFactory(v3_router_address, v3_factory_address, position, v3_tool, v3PositionManager)
  94. } catch (e) {
  95. logger.error(`New contract error, router: ${v3_router_address}`)
  96. logger.error(e)
  97. }
  98. }
  99. }
  100. main().catch((error) => {
  101. console.error(error);
  102. process.exitCode = 1;
  103. })