|
|
@@ -4,11 +4,10 @@ import contracts from "../../config/contracts";
|
|
|
import logger from "../../utils/logger";
|
|
|
import {BigNumber} from "ethers";
|
|
|
import {replaceAll} from "hardhat/internal/util/strings";
|
|
|
-import swapPath from "../interface/swapPath";
|
|
|
import history from "../interface/history";
|
|
|
const ierc20abi = require('../../abi/IERC20_ABI.json')
|
|
|
|
|
|
-export class PullAndPush {
|
|
|
+export class LpMaintenance {
|
|
|
fromHead: boolean = false
|
|
|
isFirst: boolean = false
|
|
|
tokenInstance: any = {}
|
|
|
@@ -19,31 +18,6 @@ export class PullAndPush {
|
|
|
this.isFirst = _isFirst
|
|
|
}
|
|
|
|
|
|
- async handlePosition(routerObj: any) {
|
|
|
- const block = routerObj.type === 'univ2' ? 'UNIV2DEX' : 'UNIV3DEX'
|
|
|
- const hash = routerObj.type === 'univ2' ? routerObj.factory : routerObj.router + '_router'
|
|
|
-
|
|
|
- try {
|
|
|
- // 拉取当前pull状态信息
|
|
|
- const pullState = await History.findByHashOrBlockOrDataVague(block, hash, '', 0, 200)
|
|
|
- let nowPosition = 0
|
|
|
-
|
|
|
- // 没有状态信息的情况
|
|
|
- if (pullState.data.length == 0) {
|
|
|
- await History.appendOrUpdate(block, hash, {"now": nowPosition})
|
|
|
- } else {
|
|
|
- nowPosition = pullState.data[0].dataObj.now
|
|
|
- }
|
|
|
-
|
|
|
- return nowPosition
|
|
|
- } catch (e) {
|
|
|
- logger.error(`Pull state error, router: ${routerObj.router}, factory: ${routerObj.factory}`)
|
|
|
- logger.error(e)
|
|
|
- }
|
|
|
-
|
|
|
- return 0
|
|
|
- }
|
|
|
-
|
|
|
async getV2PoolByPosition(routerObj: any, position: number, v2ToolBy410: any) {
|
|
|
try {
|
|
|
const info = await v2ToolBy410.methods.getPairIdInfo(routerObj.factory, position).call()
|
|
|
@@ -73,7 +47,7 @@ export class PullAndPush {
|
|
|
}
|
|
|
|
|
|
// 更新一次position
|
|
|
- await History.appendOrUpdate('UNIV2DEX', routerObj.factory, {"now": position + 1})
|
|
|
+ // await History.appendOrUpdate('UNIV2DEX', routerObj.factory, {"now": position + 1})
|
|
|
|
|
|
return lp
|
|
|
} catch (e) {}
|
|
|
@@ -109,7 +83,7 @@ export class PullAndPush {
|
|
|
token1: positionInfo.token1
|
|
|
}
|
|
|
|
|
|
- await History.appendOrUpdate('UNIV3DEX', routerObj.router + '_router', {"now": position + 1})
|
|
|
+ // await History.appendOrUpdate('UNIV3DEX', routerObj.router + '_router', {"now": position + 1})
|
|
|
|
|
|
return lp
|
|
|
} catch (e) {}
|
|
|
@@ -117,24 +91,6 @@ export class PullAndPush {
|
|
|
return undefined
|
|
|
}
|
|
|
|
|
|
- async saveLpToSwapPath(lp: any) {
|
|
|
- const lpSum2Query = await swapPath.findBySumValueAndLevel(lp.sum2, '2')
|
|
|
- let lpSum2List = []
|
|
|
-
|
|
|
- if (!this.isFirst && lpSum2Query.state) {
|
|
|
- lpSum2List = JSON.parse(lpSum2Query.data.data)
|
|
|
- }
|
|
|
-
|
|
|
- // TODO push之前查重处理
|
|
|
- lpSum2List.push(lp)
|
|
|
-
|
|
|
- // const insertRst = await swapPath.appendOrUpdate(lp.sum2, '2', lpSum2List)
|
|
|
- // logger.debug(`save path: ${lp.name}: ${insertRst.msg}`)
|
|
|
- await swapPath.appendOrUpdate(lp.sum2, '2', lpSum2List)
|
|
|
- // free
|
|
|
- lpSum2List.length = 0
|
|
|
- }
|
|
|
-
|
|
|
async handleToken(pool: any, zero: boolean) {
|
|
|
const token = {
|
|
|
'address': zero ? pool.token0 : pool.token1,
|
|
|
@@ -180,10 +136,28 @@ export class PullAndPush {
|
|
|
}
|
|
|
|
|
|
async filterLp(lp: any) {
|
|
|
+ // const filterSizeNormal = 1
|
|
|
+ const filterSizeTop = 10
|
|
|
+
|
|
|
+ // WETH
|
|
|
if (lp.token0.toLowerCase() === '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2') {
|
|
|
- return parseInt(lp.r0) > 20 * 1e18
|
|
|
+ return parseInt(lp.r0) > filterSizeTop * 1e18
|
|
|
} else if (lp.token1.toLowerCase() === '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2') {
|
|
|
- return parseInt(lp.r1) > 20 * 1e18
|
|
|
+ return parseInt(lp.r1) > filterSizeTop * 1e18
|
|
|
+ }
|
|
|
+
|
|
|
+ // ETH
|
|
|
+ if (lp.token0.toLowerCase() === '0xaf3ccfd9b59b36628cc2f659a09d6440795b2520') {
|
|
|
+ return parseInt(lp.r0) > filterSizeTop * 1e18
|
|
|
+ } else if (lp.token1.toLowerCase() === '0xaf3ccfd9b59b36628cc2f659a09d6440795b2520') {
|
|
|
+ return parseInt(lp.r1) > filterSizeTop * 1e18
|
|
|
+ }
|
|
|
+
|
|
|
+ // WETHW
|
|
|
+ if (lp.token0.toLowerCase() === '0x7bf88d2c0e32de92cdaf2d43ccdc23e8edfd5990') {
|
|
|
+ return parseInt(lp.r0) > filterSizeTop * 1e18
|
|
|
+ } else if (lp.token1.toLowerCase() === '0x7bf88d2c0e32de92cdaf2d43ccdc23e8edfd5990') {
|
|
|
+ return parseInt(lp.r1) > filterSizeTop * 1e18
|
|
|
}
|
|
|
|
|
|
return true
|
|
|
@@ -234,7 +208,7 @@ export class PullAndPush {
|
|
|
|
|
|
async handleLp(position: number, pairsLength: number,
|
|
|
routerObj: any, v2ToolBy410: any, v3Tool: any, v3PositionManager: any) {
|
|
|
- // 1. 获取lp
|
|
|
+ // 获取lp
|
|
|
let lp = undefined
|
|
|
if (routerObj.type === 'univ2') {
|
|
|
lp = await this.getV2PoolByPosition(routerObj, position, v2ToolBy410)
|
|
|
@@ -243,17 +217,15 @@ export class PullAndPush {
|
|
|
lp = await this.getV3Pool(routerObj, position + 1, v3Tool, v3PositionManager)
|
|
|
}
|
|
|
if (lp) {
|
|
|
- // 2. 保存Lp信息
|
|
|
+ // 保存Lp信息
|
|
|
await this.saveLp(lp, '0')
|
|
|
- // 3. 保存Lp的Token到Token表
|
|
|
+ // 保存Lp的Token到Token表
|
|
|
await this.saveToken(lp, 'token')
|
|
|
- // 4. 过滤Lp
|
|
|
+ // 过滤Lp
|
|
|
if (await this.filterLp(lp)) {
|
|
|
- // 5. 将过滤后的Lp保存到二阶表
|
|
|
- // await this.saveLpToSwapPath(lp)
|
|
|
- // 6. 保存筛选之后的的Token到TopToken表
|
|
|
+ // 保存筛选之后的的Token到TopToken表
|
|
|
await this.saveToken(lp, 'topToken')
|
|
|
- // 7. 保存过滤后的Lp到TopLp
|
|
|
+ // 保存过滤后的Lp到TopLp
|
|
|
await this.saveLp(lp, 'topLp')
|
|
|
}
|
|
|
}
|
|
|
@@ -295,7 +267,7 @@ export class PullAndPush {
|
|
|
|
|
|
const factoryAddress = routerObj.factory
|
|
|
// 获取当前pull状态
|
|
|
- let position = this.fromHead ? routerObj.fromPosition : await this.handlePosition(routerObj)
|
|
|
+ let position = routerObj.fromPosition
|
|
|
let v2Factory = undefined
|
|
|
let v3PositionManager = undefined
|
|
|
// v2,v3分开处理
|
|
|
@@ -309,17 +281,13 @@ export class PullAndPush {
|
|
|
v3PositionManager = this.parsePositionManager(routerObj, positionManagerAbi)
|
|
|
pairsLength = await this.getPositionLength(v3PositionManager)
|
|
|
}
|
|
|
- // 如果有未获取的池子
|
|
|
- const haveNewLp = position < pairsLength
|
|
|
-
|
|
|
- // 打印信息
|
|
|
- if (haveNewLp) {
|
|
|
- logger.debug(`Router address: ${routerObj.router}`)
|
|
|
- if (routerObj.type === 'univ2') {
|
|
|
- logger.debug(`factory: ${factoryAddress}, ${position + 1} / ${pairsLength}.`)
|
|
|
- } else {
|
|
|
- logger.debug(`position: ${routerObj.position}, ${position + 1} / ${pairsLength}.`)
|
|
|
- }
|
|
|
+
|
|
|
+ // log该router信息
|
|
|
+ logger.debug(`Router address: ${routerObj.router}`)
|
|
|
+ if (routerObj.type === 'univ2') {
|
|
|
+ logger.debug(`factory: ${factoryAddress}, ${position + 1} / ${pairsLength}.`)
|
|
|
+ } else {
|
|
|
+ logger.debug(`position: ${routerObj.position}, ${position + 1} / ${pairsLength}.`)
|
|
|
}
|
|
|
|
|
|
// 挨个处理lp信息
|
|
|
@@ -327,11 +295,9 @@ export class PullAndPush {
|
|
|
await this.handleLp(position, pairsLength, routerObj, v2ToolBy410, v3Tool, v3PositionManager)
|
|
|
}
|
|
|
|
|
|
- if (haveNewLp) {
|
|
|
- logger.debug('')
|
|
|
- logger.debug('')
|
|
|
- logger.debug('')
|
|
|
- }
|
|
|
+ logger.debug('')
|
|
|
+ logger.debug('')
|
|
|
+ logger.debug('')
|
|
|
}
|
|
|
|
|
|
if (this.fromHead && this.isFirst) {
|
|
|
@@ -340,4 +306,13 @@ export class PullAndPush {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-}
|
|
|
+}
|
|
|
+
|
|
|
+async function main() {
|
|
|
+ await new LpMaintenance(true, true).run()
|
|
|
+}
|
|
|
+
|
|
|
+main().catch((error) => {
|
|
|
+ console.error(error);
|
|
|
+ process.exitCode = 1;
|
|
|
+})
|