factory-lib.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. const logger = require("../../utils/logger")
  2. const BaseModel = require("../../model/base-model");
  3. module.exports = class FactoryLib {
  4. constructor(web3, chain) {
  5. this.web3 = web3
  6. this.chain = chain
  7. this.factoryModel = new BaseModel(this.chain.id, BaseModel.MODULES.FACTORY)
  8. this.factoryContractMap = {}
  9. this.positionManagerContractMap = {}
  10. // abi加载
  11. this.v2FactoryAbi = require('../../abi/UNIV2_FACTORY_ABI.json')
  12. this.positionManagerAbi = require('../../abi/UNIV3_POSITION_MANAGER_ABI.json')
  13. }
  14. async getFactoryList() {
  15. const requestRst = await this.factoryModel.find()
  16. if (requestRst.state) {
  17. return requestRst.data
  18. } else {
  19. logger.error(requestRst.msg)
  20. return []
  21. }
  22. }
  23. getFactoryContract(factoryAddress) {
  24. if (!this.factoryContractMap[factoryAddress]) {
  25. this.factoryContractMap[factoryAddress] = new this.web3.eth.Contract(this.v2FactoryAbi, factoryAddress)
  26. }
  27. return this.factoryContractMap[factoryAddress]
  28. }
  29. getPositionManager(positionManagerAddress) {
  30. if (!this.positionManagerContractMap[positionManagerAddress]) {
  31. this.positionManagerContractMap[positionManagerAddress] = new this.web3.eth.Contract(this.positionManagerAbi, positionManagerAddress)
  32. }
  33. return this.positionManagerContractMap[positionManagerAddress]
  34. }
  35. async getPositionLength(positionManagerContract, low) {
  36. let high = 1_000_000
  37. let checkNumber = low
  38. let prevLow = low
  39. let prevHigh = high
  40. async function check(checkNumber) {
  41. async function final_check(checkNumber) {
  42. try {
  43. await positionManagerContract.methods.positions(checkNumber).call()
  44. return true
  45. } catch (e) {
  46. return false
  47. }
  48. }
  49. // [,,,,,c(,,,,,,,)]
  50. let too_low = false
  51. for (let i = 1; i <= 5; i++) {
  52. too_low = too_low || (await final_check(checkNumber + i))
  53. }
  54. if (too_low) return 'too_low'
  55. // [,,,,,(c,,,,,,,)]
  56. let too_high = true
  57. for (let i = 0; i < 5; i++) {
  58. too_high = too_high && (!await final_check(checkNumber + i))
  59. }
  60. if (too_high) return 'too_high'
  61. return 'ok'
  62. }
  63. let count = 60
  64. while (--count > 0) {
  65. let checkRst = await check(checkNumber)
  66. // logger.debug(`[${low}, ${high}], c: ${checkNumber}, ${checkRst}. [${++count}]`)
  67. if (checkRst === 'ok') {
  68. break
  69. } else {
  70. let tempHigh = high
  71. let tempLow = low
  72. if (checkNumber === low) {
  73. if (checkRst === 'too_high') {
  74. high = tempLow
  75. low = prevLow
  76. prevHigh = tempHigh
  77. prevLow = tempLow
  78. checkNumber = high
  79. } else if (checkRst === 'too_low') {
  80. low = low + Math.floor((high - low) / 2)
  81. prevLow = tempLow
  82. checkNumber = low
  83. }
  84. } else if (checkNumber === high) {
  85. if (checkRst === 'too_high') {
  86. high = low + Math.floor((high - low) / 2)
  87. prevHigh = tempHigh
  88. checkNumber = high
  89. } else if (checkRst === 'too_low') {
  90. low = tempHigh
  91. high = prevHigh
  92. prevHigh = tempHigh
  93. prevLow = tempLow
  94. checkNumber = low
  95. }
  96. }
  97. }
  98. }
  99. return checkNumber
  100. }
  101. async getPairsLength(factory) {
  102. if (factory.version === 'univ2') {
  103. // 获取工厂实例
  104. const v2Factory = this.getFactoryContract(factory.hash)
  105. // 获取当前pairsLength
  106. return await v2Factory.methods.allPairsLength().call()
  107. } else if (factory.version === 'univ3') {
  108. // 获取positionManager
  109. const v3PositionManager = this.getPositionManager(factory.positionManager)
  110. return await this.getPositionLength(v3PositionManager, 0)
  111. } else {
  112. throw Error(`Unknown factory version: ${factory.version}, hash is: ${factory.hash}.`)
  113. }
  114. }
  115. }