|
|
@@ -2,13 +2,18 @@ import { web3 } from "hardhat";
|
|
|
import History from "../interface/history";
|
|
|
import contracts from "../../config/contracts";
|
|
|
import logger from "../../utils/logger";
|
|
|
-import history from "../interface/history";
|
|
|
-const ierc20abi = require('../../abi/IERC20_ABI.json')
|
|
|
|
|
|
// 初始化410 v2工具箱
|
|
|
const v2ToolBy410Abi = require('../../abi/410_V2_TOOLS.json')
|
|
|
const v2ToolBy410 = new web3.eth.Contract(v2ToolBy410Abi, contracts.V2_TOOLS_BY_410)
|
|
|
|
|
|
+// basetoken
|
|
|
+const baseTokenMap = require('../../config/base-token.json')
|
|
|
+const baseTokenAddressList = Object.keys(baseTokenMap)
|
|
|
+const ethTokenAddressList = baseTokenAddressList.filter(baseTokenAddress => {
|
|
|
+ return baseTokenMap[baseTokenAddress].name.indexOf('ETH') != -1
|
|
|
+})
|
|
|
+
|
|
|
export class LpMaintenance {
|
|
|
tokenInstance: any = {}
|
|
|
maxMemoryOfByte: number = 0
|
|
|
@@ -19,27 +24,48 @@ export class LpMaintenance {
|
|
|
}
|
|
|
|
|
|
async checkLpType(lp: any) {
|
|
|
- const ethTokenList = [
|
|
|
- '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', // WETH
|
|
|
- '0x7bf88d2c0e32de92cdaf2d43ccdc23e8edfd5990' // WETHW
|
|
|
- ]
|
|
|
-
|
|
|
+ // lp过滤后类型表
|
|
|
const filterTypeList = [
|
|
|
- { type: 'topLp', limit: 10 * 1e18 },
|
|
|
- { type: 'normalLp', limit: 1 * 1e18 },
|
|
|
+ { type: 'topLp', limit: 10 },
|
|
|
+ { type: 'normalLp', limit: 1 },
|
|
|
{ type: 'lp', limit: 0 },
|
|
|
]
|
|
|
+ // token折合成eth的价格
|
|
|
+ let tokenConvertEthPrice = 1
|
|
|
+
|
|
|
+ // token0和token1都不是baseToken的。视为lp
|
|
|
+ if (baseTokenAddressList.indexOf(lp.token0.toLowerCase()) == -1
|
|
|
+ && baseTokenAddressList.indexOf(lp.token1.toLowerCase()) == -1) {
|
|
|
+ return 'lp'
|
|
|
+ }
|
|
|
|
|
|
- if (ethTokenList.indexOf(lp.token0.toLowerCase()) == -1
|
|
|
- && ethTokenList.indexOf(lp.token1.toLowerCase()) == -1) {
|
|
|
- return 'normalLp'
|
|
|
+ // token0和token1都不是eth的,视为usdx
|
|
|
+ if (ethTokenAddressList.indexOf(lp.token0.toLowerCase()) == -1
|
|
|
+ && ethTokenAddressList.indexOf(lp.token1.toLowerCase()) == -1) {
|
|
|
+ tokenConvertEthPrice = 0.142
|
|
|
}
|
|
|
|
|
|
+ // 从高到低遍历过滤条件
|
|
|
for (const filterType of filterTypeList) {
|
|
|
- if (ethTokenList.indexOf(lp.token0.toLowerCase()) != -1) {
|
|
|
- if (parseInt(lp.r0) >= filterType.limit) return filterType.type
|
|
|
- } else if (ethTokenList.indexOf(lp.token1.toLowerCase()) != -1) {
|
|
|
- if (parseInt(lp.r1) >= filterType.limit) return filterType.type
|
|
|
+ // 从头到尾搜索baseToken
|
|
|
+ for (const baseTokenAddress of baseTokenAddressList) {
|
|
|
+ const baseToken = baseTokenMap[baseTokenAddress]
|
|
|
+ const amountLimit = filterType.limit * Math.pow(10, baseToken.decimals)
|
|
|
+
|
|
|
+ // 如果是token0是baseToken,则将token1根据价格折合成eth数量计算
|
|
|
+ if (lp.token0.toLowerCase() === baseTokenAddress) {
|
|
|
+ const convertedEthAmount = parseInt(lp.r0) * tokenConvertEthPrice
|
|
|
+ if (convertedEthAmount >= amountLimit) {
|
|
|
+ return filterType.type
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 如果是token1是baseToken,则将token1根据价格折合成eth数量计算
|
|
|
+ if (lp.token1.toLowerCase() === baseTokenAddress) {
|
|
|
+ const convertedEthAmount = parseInt(lp.r1) * tokenConvertEthPrice
|
|
|
+ if (convertedEthAmount >= amountLimit) {
|
|
|
+ return filterType.type
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -98,17 +124,18 @@ export class LpMaintenance {
|
|
|
}
|
|
|
|
|
|
async run() {
|
|
|
+ logger.debug(ethTokenAddressList)
|
|
|
logger.debug('LP maintenance start.')
|
|
|
while (true) {
|
|
|
this.showMemory('a loop...')
|
|
|
|
|
|
- const topLpPullRst = await history.findByBlock('topLp')
|
|
|
+ const topLpPullRst = await History.findByBlock('topLp')
|
|
|
if (!topLpPullRst.state) continue
|
|
|
const topLpList = topLpPullRst.data
|
|
|
- const lpPullRst = await history.findByBlock('lp')
|
|
|
+ const lpPullRst = await History.findByBlock('lp')
|
|
|
if (!lpPullRst.state) continue
|
|
|
const lpList = lpPullRst.data
|
|
|
- const normalLpPullRst = await history.findByBlock('normalLp')
|
|
|
+ const normalLpPullRst = await History.findByBlock('normalLp')
|
|
|
if (!normalLpPullRst.state) continue
|
|
|
const normalLpList = normalLpPullRst.data
|
|
|
|