Răsfoiți Sursa

v2, v3信息合并完成,等待补齐length算法

龚成明 3 ani în urmă
părinte
comite
d92cd75d53
6 a modificat fișierele cu 137 adăugiri și 139 ștergeri
  1. 3 1
      config/router-list.json
  2. 107 14
      scripts/core/pullAndPush.ts
  3. 0 0
      scripts/push.ts
  4. 0 0
      scripts/pushFromHead.ts
  5. 0 124
      scripts/pushv3.ts
  6. 27 0
      test/CalcTest.ts

+ 3 - 1
config/router-list.json

@@ -1,4 +1,5 @@
 [
+  {"name":"UNIV3","router":"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45","position":"0xC36442b4a4522E871399CD717aBDD847Ab11FE88","fee":"0","type":"univ3","chain":"eth","fromPosition": 0},
   {"name":"AAA","router":"0x0000000000000000000000000000000000000000","factory":"0xfA969454d450dFB86a2dCeFfEc48529F799F4a69","fee":"3000","type":"univ2","chain":"ethw","fromPosition": 0},
   {"name":"POWER","router":"0x0000000000000000000000000000000000000000","factory":"0xD51CFEb0fa23101f67cF62EB02D0a82A4BaD52b7","fee":"3000","type":"univ2","chain":"ethw","fromPosition": 0},
   {"name":"SEA","router":"0xc0Fb1f3100e8Fb477e9E42F748e94884CEc03810","factory":"0x1Ee0fe7f80BeA6353b137B2E7DCA9e26F3c6F442","fee":"3000","type":"univ2","chain":"eth","fromPosition": 0},
@@ -16,5 +17,6 @@
   {"name":"UNIW","router":"0x633e494C22D163F798b25b0264b92Ac612645731","factory":"0xaBC4325bAD182076EAa5877c68437833d596D3Ee","fee":"1700","type":"univ2","chain":"ethw","fromPosition": 0},
   {"name":"POW","router":"0x6851e767Aaa9C4674Fe8cAE95AFCc819b7Fb0403","factory":"0x62009bD6349A3A1d7f1bcC7C69492Cd26F1FBF75","fee":"3000","type":"univ2","chain":"ethw","fromPosition": 0},
   {"name":"HIP","router":"0x8F2a57bbC2B3870Ed321541F091f9A3EbE008Ad4","factory":"0x8cF9A887e53be909C221A2708E72898546dAB7Cc","fee":"3000","type":"univ2","chain":"ethw","fromPosition": 0},
-  {"name":"UNIV3","router":"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45","position":"0xC36442b4a4522E871399CD717aBDD847Ab11FE88","fee":"0","type":"univ3","chain":"eth","fromPosition": 0}
+  {"name":"UNIW2","router":"0xf19eb68da923d28c78f2c640fb5ddbc07868cdcf","factory":"0xfa969454d450dfb86a2dceffec48529f799f4a69","fee":"3000","type":"univ2","chain":"ethw","fromPosition": 0},
+  {"name":"CakeW","router":"0xb8dad6ef36940a7c881980860ea28822994e22bd","factory":"0xe97352E2d3a4F418044a91533a2379dbd11b425d","fee":"2500","type":"univ2","chain":"ethw","fromPosition": 0}
 ]

+ 107 - 14
scripts/core/pullAndPush.ts

@@ -17,24 +17,26 @@ export class PullAndPush {
     this.isFirst = _isFirst
   }
 
-  async handlePosition(router: String, factory: String) {
+  async handlePosition(routerObj: any) {
+    const block = routerObj.type === 'univ2' ? 'UNIV2DEX' : 'UNIV3DEX'
+
     try {
       // 拉取当前pull状态信息
-      const pullState = await History.findByHashOrBlockOrDataVague('UNIV2DEX', factory, '', 0, 200)
+      const pullState = await History.findByHashOrBlockOrDataVague(block, routerObj.factory, '', 0, 200)
       let nowPosition = 0
 
       // 没有状态信息的情况
       if (pullState.data.length == 0) {
         // const appendRst = await History.appendOrUpdate('UNIV2DEX', factory, {"now": nowPosition})
         // logger.debug(appendRst)
-        await History.appendOrUpdate('UNIV2DEX', factory, {"now": nowPosition})
+        await History.appendOrUpdate(block, routerObj.factory, {"now": nowPosition})
       } else {
         nowPosition = pullState.data[0].dataObj.now
       }
 
       return nowPosition
     } catch (e) {
-      logger.error(`Pull state error, router: ${router}, factory: ${factory}`)
+      logger.error(`Pull state error, router: ${routerObj.router}, factory: ${routerObj.factory}`)
       logger.error(e)
     }
 
@@ -78,6 +80,42 @@ export class PullAndPush {
     return undefined
   }
 
+  async getV3Pool(routerObj: any, position: number, v3Tool: any, positionManager: any) {
+    try {
+      const positionInfo = await positionManager.methods.positions(position).call()
+      const info = await v3Tool.methods.getMoreInfo(positionInfo.token0, positionInfo.token1, positionInfo.fee).call()
+
+      const symbol0 = info.symbol0.replace(/[^A-Za-z0-9 ]+/g, '').substring(0, 10)
+      const symbol1 = info.symbol1.replace(/[^A-Za-z0-9 ]+/g, '').substring(0, 10)
+      const name = `${routerObj.router.slice(2, 4) + routerObj.router.slice(-2)}_${symbol0}_${symbol1}`
+      const sum2 = replaceAll(BigNumber.from(positionInfo.token0).add(BigNumber.from(positionInfo.token1))._hex, '0x0', '0x')
+
+      const lp = {
+        LP: info.lp,
+        decimals0: info.decimals0,
+        decimals1: info.decimals1,
+        factory: routerObj.factory,
+        feei: positionInfo.fee,
+        id: position,
+        name: name,
+        r0: info.r0,
+        r1: info.r1,
+        router: routerObj.router,
+        sum2: sum2,
+        symbol0: symbol0,
+        symbol1: symbol1,
+        token0: positionInfo.token0,
+        token1: positionInfo.token1
+      }
+
+      await History.appendOrUpdate('UNIV3DEX', routerObj.factory, {"now": position})
+
+      return lp
+    } catch (e) {}
+
+    return undefined
+  }
+
   async saveLpToSwapPath(lp: any) {
     const lpSum2Query = await swapPath.findBySumValueAndLevel(lp.sum2, '2')
     let lpSum2List = []
@@ -143,7 +181,7 @@ export class PullAndPush {
     return true
   }
 
-  parseFactory(router: any, factoryAbi: any, factoryAddress: any) {
+  parseFactory(router: any, factoryAbi: any, factoryAddress: string) {
     if (router.factoryObj == null) {
       router.factoryObj = new web3.eth.Contract(factoryAbi, factoryAddress)
     }
@@ -151,6 +189,40 @@ export class PullAndPush {
     return router.factoryObj
   }
 
+  parsePositionManager(router: any, positionManagerAbi: any, positionManagerAddress: string) {
+    if (router.positionManager == null) {
+      router.positionManager = new web3.eth.Contract(positionManagerAbi, positionManagerAddress)
+    }
+
+    return router.positionManager
+  }
+
+  async checkPosition(pm: any, position: any) {
+    try {
+      await pm.methods.positions(position).call()
+
+      return true
+    } catch (e) {
+      return false
+    }
+  }
+
+  // 二分法查length
+  async getPositionLength(pm: any) {
+    let low = 300_000
+    let high = 1_000_000
+    let lastLow = low
+    let lastHigh = high
+
+    let checkNumber = low
+
+    // while (true) {
+    //
+    // }
+
+    return checkNumber
+  }
+
   async run() {
     logger.debug('Pull v2 start.')
 
@@ -158,33 +230,54 @@ export class PullAndPush {
     const v2ToolBy410Abi = require('../../abi/410_V2_TOOLS.json')
     const v2ToolBy410 = new web3.eth.Contract(v2ToolBy410Abi, contracts.V2_TOOLS_BY_410)
     const v2FactoryAbi = require('../../abi/UNIV2_FACTORY_ABI.json')
+    // 初始化v3相关
+    const positionManagerAbi = require('../abi/UNIV3_POSITION_MANAGER_ABI.json')
+    const v3ToolAbi = require('../../artifacts/contracts/V3Tool.sol/V3Tool.json').abi
+    const v3Tool = new web3.eth.Contract(v3ToolAbi, contracts.V3_TOOLS)
+    // router
     const routerList: Array<any> = require('../../config/router-list.json')
 
     while (true) {
       for (const routerObj of routerList) {
+        let pairsLength = 0
+
         if (routerObj.type === 'univ3') continue
 
-        const v2FactoryAddress = routerObj.factory
-        // 获取工厂实例
-        const v2Factory = this.parseFactory(routerObj, v2FactoryAbi, v2FactoryAddress)
+        const factoryAddress = routerObj.factory
         // 获取当前pull状态
-        let position = this.fromHead ? routerObj.fromPosition : await this.handlePosition(routerObj.router, v2FactoryAddress)
-        // 获取当前pairsLength
-        const pairsLength = await v2Factory.methods.allPairsLength().call()
+        let position = this.fromHead ? routerObj.fromPosition : await this.handlePosition(routerObj)
+        let v2Factory = undefined
+        let v3PositionManager = undefined
+        // v2,v3分开处理
+        if (routerObj.type === 'univ2') {
+          // 获取工厂实例
+          v2Factory = this.parseFactory(routerObj, v2FactoryAbi, factoryAddress)
+          // 获取当前pairsLength
+          pairsLength = await v2Factory.methods.allPairsLength().call()
+        } else if (routerObj.type === 'univ3') {
+          // 获取positionManager
+          v3PositionManager = this.parsePositionManager(routerObj, positionManagerAbi, contracts.UNIV3_POSITION)
+          pairsLength = await this.getPositionLength(v3PositionManager)
+        }
         // 如果有未获取的池子
         const haveNewLp = position + 1 < pairsLength
 
         // 打印信息
         if (haveNewLp) {
           logger.debug(`Router address: ${routerObj.router}`)
-          logger.debug(`factory: ${v2FactoryAddress}, ${position + 1} / ${pairsLength}.`)
+          logger.debug(`factory: ${factoryAddress}, ${position + 1} / ${pairsLength}.`)
         }
 
         // 挨个处理lp信息
         while (position + 1 < pairsLength) {
-          logger.debug(`${position + 1} / ${pairsLength}`)
+          logger.debug(`${position + 1} / ${pairsLength}, ${routerObj.name}-${routerObj.router}-${routerObj.chain}`)
           // 1. 获取lp
-          const lp = await this.getV2PoolByPosition(routerObj, position, v2ToolBy410)
+          let lp = undefined
+          if (routerObj.type === 'univ2') {
+            lp = await this.getV2PoolByPosition(routerObj, position, v2ToolBy410)
+          } else if (routerObj.type === 'univ3') {
+            lp = await this.getV3Pool(routerObj, position, v3Tool, v3PositionManager)
+          }
           // 2. 保存Lp信息
           await this.saveLp(lp, '0')
           // 3. 保存Lp的Token到Token表

+ 0 - 0
scripts/pushv2.ts → scripts/push.ts


+ 0 - 0
scripts/pushv2FromHead.ts → scripts/pushFromHead.ts


+ 0 - 124
scripts/pushv3.ts

@@ -1,124 +0,0 @@
-import { web3 } from "hardhat";
-import History from "./interface/history";
-import contracts from "../config/contracts";
-import logger from "../utils/logger";
-import v3_routers from "../config/v3_routers";
-import {BigNumber} from "ethers";
-import {replaceAll} from "hardhat/internal/util/strings";
-
-async function handlePosition(router: String, factory: String) {
-  try {
-    // 拉取当前pull状态信息
-    const pullState = await History.findByHashOrBlockOrDataVague('UNIV3DEX', factory, '', 0, 200)
-    let nowPosition = 0
-
-    // 没有状态信息的情况
-    if (pullState.data.length == 0) {
-      const appendRst = await History.appendOrUpdate('UNIV3DEX', factory, {"now": nowPosition})
-      logger.debug(appendRst)
-    } else {
-      nowPosition = pullState.data[0].dataObj.now
-    }
-
-    return nowPosition
-  } catch (e) {
-    logger.error(`Pull state error, router: ${router}, factory: ${factory}`)
-    logger.error(e)
-  }
-
-  return 0
-}
-
-async function handleAFactory(router: String, factory: String, position: number, v3_tool: any, v3PositionManager: any) {
-  let errorCount = 0
-
-  while (true) {
-    try {
-      const positionInfo = await v3PositionManager.methods.positions(position).call()
-      const info = await v3_tool.methods.getMoreInfo(positionInfo.token0, positionInfo.token1, positionInfo.fee).call()
-
-      const symbol0 = info.symbol0.replace(/[^A-Za-z0-9 ]+/g, '').substring(0, 10)
-      const symbol1 = info.symbol1.replace(/[^A-Za-z0-9 ]+/g, '').substring(0, 10)
-      const name = `${router.slice(2, 4) + router.slice(-2)}_${symbol0}_${symbol1}`
-      const sum2 = replaceAll(BigNumber.from(positionInfo.token0).add(BigNumber.from(positionInfo.token1))._hex, '0x0', '0x')
-
-      const data = {
-        LP: info.lp,
-        decimals0: info.decimals0,
-        decimals1: info.decimals1,
-        factory: factory,
-        feei: positionInfo.fee,
-        id: position,
-        name: name,
-        r0: info.r0,
-        r1: info.r1,
-        router: router,
-        sum2: sum2,
-        symbol0: symbol0,
-        symbol1: symbol1,
-        token0: positionInfo.token0,
-        token1: positionInfo.token1
-      }
-
-      const insertRst = await History.appendOrUpdate('0', info.lp, data)
-      logger.debug(insertRst.msg, `, hash: ${info.lp}, ${position}`)
-
-      // 每十次更新一次position
-      if (position % 50 == 0) {
-        await History.appendOrUpdate('UNIV3DEX', factory, {"now": position})
-        logger.debug(`Position updated: ${position}`)
-      }
-
-      errorCount = 0
-    } catch (e) {
-      logger.error(JSON.stringify(e))
-      errorCount++
-    }
-
-    position++
-    if (errorCount >= 5) {
-      position = position - 5
-      break;
-    }
-  }
-}
-
-async function main() {
-  const fromZero: boolean = true
-
-  logger.debug('Pull v3 start.')
-
-  const v3_router_abi = require('../abi/UNIV3_ROUTER_ABI.json')
-  const positionManagerAbi = require('../abi/UNIV3_POSITION_MANAGER_ABI.json')
-  const v3_tool_abi = require('../artifacts/contracts/V3Tool.sol/V3Tool.json').abi
-
-  // 初始化 v3工具箱
-  const v3_tool = new web3.eth.Contract(v3_tool_abi, contracts.TOOLS_V3)
-  // 初始化PositionManager
-  const v3PositionManager = new web3.eth.Contract(positionManagerAbi, contracts.UNIV3_POSITION)
-
-  for (let router_index = 0; router_index < v3_routers.length; router_index++) {
-    const v3_router_address = v3_routers[router_index]
-
-    try {
-      logger.debug(`Router address: ${v3_router_address}`)
-
-      // 获取工厂地址
-      const v3_router = new web3.eth.Contract(v3_router_abi, v3_router_address)
-      const v3_factory_address = await v3_router.methods.factory().call()
-      // 获取当前pull状态
-      const position = fromZero ? 1 : await handlePosition(v3_router_address, v3_factory_address)
-
-      logger.debug(`factory: ${v3_factory_address}, ${position}.`)
-      await handleAFactory(v3_router_address, v3_factory_address, position, v3_tool, v3PositionManager)
-    } catch (e) {
-      logger.error(`New contract error, router: ${v3_router_address}`)
-      logger.error(e)
-    }
-  }
-}
-
-main().catch((error) => {
-  console.error(error);
-  process.exitCode = 1;
-})

+ 27 - 0
test/CalcTest.ts

@@ -1,6 +1,7 @@
 import {ethers, web3} from "hardhat";
 import fee from "../config/fee";
 import contracts from "../config/contracts";
+import logger from "../utils/logger";
 
 describe('Calc test', () => {
   let inAmount = 1e15.toString()
@@ -12,4 +13,30 @@ describe('Calc test', () => {
 
     await calc.methods.getQuoteHandleFee(contracts.WETH, inAmount, contracts.USDT, fee._30_per_10000).call().then(console.log)
   })
+
+  it('Two points', () => {
+    let low = 300_000
+    let high = 1_000_000
+    let lastLow = low
+    let lastHigh = high
+
+    let checkNumber = low
+
+    function check(checkNumber: number) {
+      return checkNumber <= 521_123
+    }
+
+    while (true) {
+      let checkRst = check(checkNumber)
+      logger.debug(`[${low}, ${high}], c: ${checkNumber}, ${checkRst}`)
+
+      if (checkRst) {
+
+      } else {
+
+      }
+    }
+
+    logger.debug(checkNumber)
+  })
 })