ソースを参照

v3基础代码实现。

skyfffire 3 年 前
コミット
99ba7d54e2
1 ファイル変更132 行追加0 行削除
  1. 132 0
      scripts/pullv3.ts

+ 132 - 0
scripts/pullv3.ts

@@ -0,0 +1,132 @@
+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, '')
+    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_410_tool: any) {
+  let errorCount = 0
+
+  while (true) {
+    try {
+      const info = await v3_410_tool.methods.getPairIdInfo(factory, position++).call()
+
+      logger.debug(info)
+
+      // return (
+      //  0   pairInfo.lp,
+      //  1   pairInfo.token0,
+      //  2   pairInfo.symbol0,
+      //  3   pairInfo.decimals0,
+      //  4   pairInfo.r0,
+      //  5   pairInfo.token1,
+      //  6   pairInfo.symbol1,
+      //  7   pairInfo.decimals1,
+      //  8   pairInfo.r1
+      // );
+
+      // const symbol0 = info['2'].replace(/[^A-Za-z0-9 ]+/g, '').substring(0, 10)
+      // const symbol1 = info['6'].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(info['1']).add(BigNumber.from(info['5']))._hex, '0x0', '0x')
+
+    //   const data = {
+    //     LP: info['0'],
+    //     decimals0: info['3'],
+    //     decimals1: info['7'],
+    //     factory: factory,
+    //     feei: 30,
+    //     id: position,
+    //     name: name,
+    //     r0: info['4'],
+    //     r1: info['8'],
+    //     router: router,
+    //     sum2: sum2,
+    //     symbol0: symbol0,
+    //     symbol1: symbol1,
+    //     token0: info['1'],
+    //     token1: info['5']
+    //   }
+    //   const insertRst = await History.appendOrUpdate('0', info['0'], data)
+    //   logger.debug(insertRst.msg, `, hash: ${info['0']}, ${position} / ${pairsLength}`)
+    //
+    //   // 每十次更新一次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++
+    }
+
+    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 v3_tool_abi = require('../abi/410_V3_TOOLS.json')
+
+  // 初始化410 v3工具箱
+  const v3_410_tool = new web3.eth.Contract(v3_tool_abi, contracts.TOOLS_410_V3)
+
+  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 ? 0 : 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_410_tool)
+    } catch (e) {
+      logger.error(`New contract error, router: ${v3_router_address}`)
+      logger.error(e)
+    }
+  }
+}
+
+main().catch((error) => {
+  console.error(error);
+  process.exitCode = 1;
+})