pushv2FromHead.ts 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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 {BigNumber} from "ethers";
  6. import {replaceAll} from "hardhat/internal/util/strings";
  7. import swapPath from "../interface/swapPath";
  8. import history from "../interface/history";
  9. const ierc20abi = require('../../abi/IERC20_ABI.json')
  10. async function handlePosition(router: String, factory: String) {
  11. try {
  12. // 拉取当前pull状态信息
  13. const pullState = await History.findByHashOrBlockOrDataVague('UNIV2DEX', factory, '', 0, 200)
  14. let nowPosition = 0
  15. // 没有状态信息的情况
  16. if (pullState.data.length == 0) {
  17. const appendRst = await History.appendOrUpdate('UNIV2DEX', factory, {"now": nowPosition})
  18. logger.debug(appendRst)
  19. } else {
  20. nowPosition = pullState.data[0].dataObj.now
  21. }
  22. return nowPosition
  23. } catch (e) {
  24. logger.error(`Pull state error, router: ${router}, factory: ${factory}`)
  25. logger.error(e)
  26. }
  27. return 0
  28. }
  29. async function handleAFactory(routerObj: any, position: number, pairsLength: number, v2_410_tool: any) {
  30. const lpList: any = []
  31. while (position < pairsLength) {
  32. try {
  33. const info = await v2_410_tool.methods.getPairIdInfo(routerObj.factory, position).call()
  34. const symbol0 = info['2'].replace(/[^A-Za-z0-9]+/g, '').substring(0, 10)
  35. const symbol1 = info['6'].replace(/[^A-Za-z0-9]+/g, '').substring(0, 10)
  36. const name = `${routerObj.name}_${symbol0}_${symbol1}`
  37. const sum2 = replaceAll(BigNumber.from(info['1']).add(BigNumber.from(info['5']))._hex, '0x0', '0x')
  38. const data = {
  39. LP: info['0'],
  40. decimals0: info['3'],
  41. decimals1: info['7'],
  42. factory: routerObj.factory,
  43. feei: routerObj.fee,
  44. id: position,
  45. name: name,
  46. r0: info['4'],
  47. r1: info['8'],
  48. router: routerObj.router,
  49. sum2: sum2,
  50. symbol0: symbol0,
  51. symbol1: symbol1,
  52. token0: info['1'],
  53. token1: info['5'],
  54. isEthW: routerObj.type == 'ETHW'
  55. }
  56. const insertRst = await History.appendOrUpdate('0', info['0'], data)
  57. logger.debug(`insert lp:${insertRst.msg}, hash: ${info['0']}, ${position + 1} / ${pairsLength}`)
  58. lpList.push(data)
  59. // 更新一次position
  60. await History.appendOrUpdate('UNIV2DEX', routerObj.factory, {"now": position})
  61. } catch (e) {}
  62. position++
  63. }
  64. return lpList
  65. }
  66. async function getAllLp(v2Router: any, fromZero: boolean, v2_410_tool: any, v2_factory_abi: any) {
  67. try {
  68. const v2_factory_address = v2Router.factory
  69. // 获取工厂实例
  70. const v2_factory = new web3.eth.Contract(v2_factory_abi, v2_factory_address)
  71. // 获取当前pairsLength
  72. const pairsLength = await v2_factory.methods.allPairsLength().call()
  73. // 获取当前pull状态
  74. const position = fromZero ? 0 : await handlePosition(v2Router.router, v2_factory_address)
  75. if (position + 1 < pairsLength) {
  76. logger.debug(`Router address: ${v2Router.router}`)
  77. logger.debug(`factory: ${v2_factory_address}, ${position + 1} / ${pairsLength}.`)
  78. return await handleAFactory(v2Router, position, pairsLength, v2_410_tool)
  79. }
  80. } catch (e) {
  81. logger.error(`New contract error, router: ${v2Router.router}`)
  82. logger.error(e)
  83. }
  84. return []
  85. }
  86. async function saveLpToSwapPath(lpList: any) {
  87. for (let lpIndex in lpList) {
  88. const lp = lpList[lpIndex]
  89. const lpSum2Query = await swapPath.findBySumValueAndLevel(lp.sum2, '2')
  90. let lpSum2List = []
  91. if (lpSum2Query.state) {
  92. lpSum2List = JSON.parse(lpSum2Query.data.data)
  93. }
  94. lpSum2List.push(lp)
  95. const insertRst = await swapPath.appendOrUpdate(lp.sum2, '2', lpSum2List)
  96. logger.debug(`save path: ${lp.name}: ${insertRst.msg}, ${parseInt(lpIndex) + 1}/${lpList.length}`)
  97. }
  98. }
  99. async function handleToken(pool: any, zero: boolean) {
  100. const token = {
  101. 'address': zero ? pool.token0 : pool.token1,
  102. 'symbol': zero ? pool.symbol0 : pool.symbol1,
  103. 'decimal': zero ? pool.decimals0 : pool.decimals1,
  104. 'name': 'xxxxxxxx'
  105. }
  106. const tokenObj = new web3.eth.Contract(ierc20abi, token.address)
  107. token.name = await tokenObj.methods.name().call()
  108. token.name = token.name.replace(/[^A-Za-z0-9 ]+/g, '').substring(0, 37)
  109. return token
  110. }
  111. async function saveToken(lpList: any) {
  112. for (let lpIndex in lpList) {
  113. const lp = lpList[lpIndex]
  114. try {
  115. const token = await handleToken(lp, true)
  116. const saveRst = await history.appendOrUpdate('token', token.address, token)
  117. logger.debug(`${token.name} ${saveRst.msg}`)
  118. } catch (e) {}
  119. try {
  120. const token = await handleToken(lp, false)
  121. const saveRst = await history.appendOrUpdate('token', token.address, token)
  122. logger.debug(`${token.name} ${saveRst.msg}`)
  123. } catch (e) {}
  124. logger.debug(`insert token: ${parseInt(lpIndex) + 1} / ${lpList.length}`)
  125. }
  126. }
  127. async function filterLp(lpList: any) {
  128. const filteredLpList: any = []
  129. for (let lpIndex in lpList) {
  130. const lp = lpList[lpIndex]
  131. if (lp.token0.toLowerCase() === '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2') {
  132. if (parseInt(lp.r0) > 20 * 1e18) filteredLpList.push(filteredLpList)
  133. } else if (lp.token1.toLowerCase() === '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2') {
  134. if (parseInt(lp.r1) > 20 * 1e18) filteredLpList.push(filteredLpList)
  135. } else {
  136. filteredLpList.push(lp)
  137. }
  138. }
  139. return filteredLpList
  140. }
  141. async function main() {
  142. logger.debug('Pull v2 start.')
  143. const v2_factory_abi = require('../../abi/UNIV2_FACTORY_ABI.json')
  144. const v2_tool_abi = require('../../abi/410_V2_TOOLS.json')
  145. // 初始化410 v2工具箱
  146. const v2_410_tool = new web3.eth.Contract(v2_tool_abi, contracts.TOOLS_410_V2)
  147. const v2RouterInfo = require('../../config/v2RouterInfo.json')
  148. let fromZero: boolean = true
  149. while (true) {
  150. for (let router_index = 0; router_index < v2RouterInfo.length; router_index++) {
  151. // 1. 获取Lp
  152. let lpList = await getAllLp(v2RouterInfo[router_index], fromZero, v2_410_tool, v2_factory_abi)
  153. // 2. 过滤Lp
  154. lpList = await filterLp(lpList)
  155. // 3. 将Lp保存到二阶表
  156. await saveLpToSwapPath(lpList)
  157. // 4. 保存Lp的Token到Token表
  158. await saveToken(lpList)
  159. // 5. 保存Lp的Token到TopToken表
  160. if (lpList.length > 0) {
  161. logger.debug('')
  162. logger.debug('')
  163. logger.debug('')
  164. }
  165. }
  166. if (fromZero) fromZero = false;
  167. }
  168. }
  169. main().catch((error) => {
  170. console.error(error);
  171. process.exitCode = 1;
  172. })