tradeRouter.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. import time
  2. from sqlTools import *
  3. from web3Tools import *
  4. def baseTokenLPUpdata():
  5. topLP = EthMevModel.find_by_block('topLP')['data'] + EthMevModel.find_by_block('normalLp')['data']
  6. printTime('TOP LP:', len(topLP))
  7. tradeToken0 = False
  8. for baseTokenI in baseTokenInfo:
  9. baseTokenIAddress = baseTokenI.lower()
  10. baseTokenLp = {}
  11. baseTokenINmae = baseTokenInfo[baseTokenI]['name']
  12. for lp0 in topLP:
  13. try:
  14. dataI = json.loads(lp0['data'])
  15. lp0Token0 = dataI['token0'].lower()
  16. lp0Token1 = dataI['token1'].lower()
  17. lp0Address = dataI['LP'].lower()
  18. # hei LP filter
  19. if lp0Address in heiLp or lp0Token0 in heiLp or lp0Token1 in heiLp:
  20. continue
  21. lp0Factory = dataI['factory'].lower()
  22. except BaseException as err:
  23. printTime(traceback.format_exc())
  24. printTime(dataI, err)
  25. if lp0Factory not in topFactoryFee:
  26. continue
  27. if lp0Token0 == baseTokenIAddress:
  28. tradeToken0 = lp0Token1
  29. elif lp0Token1 == baseTokenIAddress:
  30. tradeToken0 = lp0Token0
  31. else:
  32. continue
  33. if tradeToken0 not in baseTokenLp:
  34. baseTokenLp[tradeToken0] = []
  35. baseTokenLp[tradeToken0].append(lp0Address)
  36. pushText(baseTokenLp, baseTokenIAddress)
  37. def topLPUpdata():
  38. lpArray = {}
  39. topLP = EthMevModel.find_by_block('topLP')['data'] + EthMevModel.find_by_block('normalLp')['data'] + bugLp
  40. printTime('TOP LP:', len(topLP))
  41. baseTokenLp = {}
  42. for baseTokenI in baseTokenInfo:
  43. baseTokenIAddress = baseTokenI.lower()
  44. baseTokenLp[baseTokenIAddress] = {}
  45. for lp0 in topLP:
  46. try:
  47. dataI = json.loads(lp0['data'])
  48. lp0Token0 = dataI['token0'].lower()
  49. lp0Token1 = dataI['token1'].lower()
  50. lp0Address = dataI['LP'].lower()
  51. if 'factory' not in dataI:
  52. continue
  53. if dataI['router'] == '0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45':
  54. continue
  55. if 'r0' in dataI and int(dataI['r0']) < 405:
  56. continue
  57. if 'r1' in dataI and int(dataI['r1']) < 405:
  58. continue
  59. # hei LP filter
  60. if lp0Address in heiLp or lp0Token0 in heiLp or lp0Token1 in heiLp:
  61. continue
  62. lp0Factory = dataI['factory'].lower()
  63. if lp0Factory not in topFactoryFee:
  64. continue
  65. except BaseException as err:
  66. printTime(traceback.format_exc())
  67. printTime(dataI, err)
  68. lpArray[lp0Address] = {}
  69. lpArray[lp0Address]['factory'] = lp0Factory
  70. lpArray[lp0Address]['token0'] = lp0Token0
  71. lpArray[lp0Address]['token1'] = lp0Token1
  72. lpArray[lp0Address]['LP'] = lp0Address
  73. lpArray[lp0Address]['fee'] = topFactoryFee[lp0Factory]
  74. if lp0Token0 in baseTokenLp:
  75. tradeToken = lp0Token1
  76. if tradeToken not in baseTokenLp[lp0Token0]:
  77. baseTokenLp[lp0Token0][tradeToken] = []
  78. baseTokenLp[lp0Token0][tradeToken].append(lp0Address)
  79. if lp0Token1 in baseTokenLp:
  80. tradeToken = lp0Token0
  81. if tradeToken not in baseTokenLp[lp0Token1]:
  82. baseTokenLp[lp0Token1][tradeToken] = []
  83. baseTokenLp[lp0Token1][tradeToken].append(lp0Address)
  84. for baseToken in baseTokenLp:
  85. pushText(baseTokenLp[baseToken], baseToken)
  86. pushText(lpArray, 'topLP')
  87. def aba(baseToken, endToken):
  88. # WETH
  89. baseToken = baseToken.lower()
  90. # WETH WETHW
  91. endToken = endToken.lower()
  92. # WETH. {A:[LP0, LP1, LP2] B:[...]...}
  93. baseTokenArray = readText(baseToken)
  94. endTokenArray = readText(endToken)
  95. baseToken_endTokenArray = []
  96. # tradeToken0 = WETH.A,B,C....
  97. # WETH - X 中按token for in
  98. for tradeToken0 in baseTokenArray:
  99. # tradeLP0 = A:[LP0, LP1, LP2] WETH - X LP中 for in 所有LP
  100. if tradeToken0 not in endTokenArray:
  101. continue
  102. for tradeLP0 in baseTokenArray[tradeToken0]:
  103. # 所有LP中for in
  104. for tradeLP1 in endTokenArray[tradeToken0]:
  105. if tradeLP1 == tradeLP0:
  106. continue
  107. if tradeLP0 not in topLpInfo:
  108. printTime(tradeLP0, 'not in topLpInfo')
  109. if tradeLP1 not in topLpInfo:
  110. printTime(tradeLP1, 'not in topLpInfo')
  111. tradeInfoLp0 = {}
  112. tradeInfoLp0['lp'] = tradeLP0
  113. tradeInfoLp0['inToken'] = baseToken
  114. tradeInfoLp0['outToken'] = tradeToken0
  115. tradeInfoLp0['fee'] = topFactoryFee[topLpInfo[tradeLP0]['factory']]
  116. if tradeInfoLp0['inToken'] < tradeInfoLp0['outToken']:
  117. tradeInfoLp0['indexIn'] = 0
  118. else:
  119. tradeInfoLp0['indexIn'] = 1
  120. tradeInfoLp1 = {}
  121. tradeInfoLp1['lp'] = tradeLP1
  122. tradeInfoLp1['inToken'] = tradeToken0
  123. tradeInfoLp1['outToken'] = endToken
  124. tradeInfoLp1['fee'] = topFactoryFee[topLpInfo[tradeLP1]['factory']]
  125. if tradeInfoLp1['inToken'] < tradeInfoLp1['outToken']:
  126. tradeInfoLp1['indexIn'] = 0
  127. else:
  128. tradeInfoLp1['indexIn'] = 1
  129. baseToken_endTokenArray.append([tradeInfoLp0, tradeInfoLp1])
  130. pushText(baseToken_endTokenArray, 'aba' + baseToken + endToken)
  131. def pushABA():
  132. for i in baseTokenInfo:
  133. i = i.lower()
  134. aba(i, i)
  135. aba(WETH, WETHW)
  136. aba(WETHW, WETH)
  137. def readABA():
  138. array = []
  139. for i in baseTokenInfo:
  140. i = i.lower()
  141. iiArray = readText('aba' + i + i)
  142. array = array + iiArray
  143. array = array + readText('aba' + WETHW + WETH)
  144. array = array + readText('aba' + WETH + WETHW)
  145. return array
  146. def findLpRouter(lp, lpRouter):
  147. lpTradeArray = []
  148. for lpArray in lpRouter:
  149. for lpI in lpArray:
  150. if lpI['lp'] == lp:
  151. lpTradeArray.append(lpArray)
  152. break
  153. return lpTradeArray
  154. def abca(baseToken, endToken):
  155. baseToken = baseToken.lower()
  156. endToken = endToken.lower()
  157. baseTokenArray = readText(baseToken)
  158. endTokenArray = readText(endToken)
  159. baseToken_endTokenArray = []
  160. # tradeToken0 = B
  161. for tradeToken0 in baseTokenArray:
  162. for tradeLP0 in baseTokenArray[tradeToken0]:
  163. for tradeLP1 in topLpInfo:
  164. if tradeLP1 == tradeLP0:
  165. continue
  166. # 以上和ABA一样
  167. tradeLP1Token0 = topLpInfo[tradeLP1]['token0']
  168. tradeLP1Token1 = topLpInfo[tradeLP1]['token1']
  169. # baseToken = A
  170. # tradeToken1 = C
  171. if tradeLP1Token0 == tradeToken0:
  172. tradeToken1 = tradeLP1Token1
  173. elif tradeLP1Token1 == tradeToken0:
  174. tradeToken1 = tradeLP1Token0
  175. else:
  176. continue
  177. if tradeToken1 in endTokenArray:
  178. for tradeLP2 in endTokenArray[tradeToken1]:
  179. if tradeLP2 == tradeLP0:
  180. continue
  181. tradeInfoLp0 = {}
  182. tradeInfoLp0['lp'] = tradeLP0
  183. tradeInfoLp0['inToken'] = baseToken
  184. tradeInfoLp0['outToken'] = tradeToken0
  185. tradeInfoLp0['fee'] = topFactoryFee[topLpInfo[tradeLP0]['factory']]
  186. if tradeInfoLp0['inToken'] < tradeInfoLp0['outToken']:
  187. tradeInfoLp0['indexIn'] = 0
  188. else:
  189. tradeInfoLp0['indexIn'] = 1
  190. tradeInfoLp1 = {}
  191. tradeInfoLp1['lp'] = tradeLP1
  192. tradeInfoLp1['inToken'] = tradeToken0
  193. tradeInfoLp1['outToken'] = tradeToken1
  194. tradeInfoLp1['fee'] = topFactoryFee[topLpInfo[tradeLP1]['factory']]
  195. if tradeInfoLp1['inToken'] < tradeInfoLp1['outToken']:
  196. tradeInfoLp1['indexIn'] = 0
  197. else:
  198. tradeInfoLp1['indexIn'] = 1
  199. tradeInfoLp2 = {}
  200. tradeInfoLp2['lp'] = tradeLP2
  201. tradeInfoLp2['inToken'] = tradeToken1
  202. tradeInfoLp2['outToken'] = endToken
  203. tradeInfoLp2['fee'] = topFactoryFee[topLpInfo[tradeLP2]['factory']]
  204. if tradeInfoLp2['inToken'] < tradeInfoLp2['outToken']:
  205. tradeInfoLp2['indexIn'] = 0
  206. else:
  207. tradeInfoLp2['indexIn'] = 1
  208. baseToken_endTokenArray.append([tradeInfoLp0, tradeInfoLp1, tradeInfoLp2])
  209. pushText(baseToken_endTokenArray, 'abca' + baseToken + endToken)
  210. def pushABCA():
  211. for i in baseTokenInfo:
  212. i = i.lower()
  213. abca(i, i)
  214. abca(WETH, WETHW)
  215. abca(WETHW, WETH)
  216. def readABCA():
  217. array = []
  218. for i in baseTokenInfo:
  219. i = i.lower()
  220. iiArray = readText('abca' + i + i)
  221. array = array + iiArray
  222. array = array + readText('abca' + WETHW + WETH)
  223. array = array + readText('abca' + WETH + WETHW)
  224. return array
  225. def allUpdata():
  226. global topLpInfo
  227. topLPUpdata()
  228. topLpInfo = readText('topLP')
  229. printTime('Ture TOP LP', len(topLpInfo))
  230. pushABA()
  231. pushABCA()
  232. printTime(len(readABA()))
  233. printTime(len(readABCA()))
  234. lpRouterInfo = readABCA()
  235. lpRouterInfo = lpRouterInfo + readABA()
  236. pushText(lpRouterInfo, 'abcd')
  237. pushText(sharding_swap_path_list(lpRouterInfo), '256Router')
  238. def calOnlyLpInRouterArray(routerArray):
  239. onlyLpArray = []
  240. for router in routerArray:
  241. for Lp in router:
  242. if Lp in onlyLpArray:
  243. continue
  244. onlyLpArray.append(Lp)
  245. return onlyLpArray
  246. def sharding_swap_path_list(swap_path_list):
  247. swap_path_list_block = {}
  248. for swap_path in swap_path_list:
  249. for lp in swap_path:
  250. block = lp['lp']
  251. if block not in swap_path_list_block:
  252. swap_path_list_block[block] = []
  253. swap_path_list_block[block].append(json.loads(json.dumps(swap_path)))
  254. return swap_path_list_block
  255. # {
  256. # '0x00030110a7053083a7a160449a0e8f1adce9438d':
  257. # {'factory': '0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f',
  258. # 'token0': '0x65f9a292f1aeed5d755aa2fd2fb17ab2e9431447',
  259. # 'token1': '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
  260. # 'LP': '0x00030110a7053083a7a160449a0e8f1adce9438d'
  261. # }
  262. # ....
  263. # }]
  264. while True:
  265. try:
  266. if time.time() % 60 < 5:
  267. allUpdata()
  268. time.sleep(3)
  269. except BaseException as err:
  270. printTime(traceback.format_exc())
  271. printTime('loop', err)
  272. time.sleep(20)
  273. # printTime(len(readABA()))
  274. # printTime(len(readABCA()))
  275. # topLpInfo = readText('topLP')
  276. # lpRouterInfo = readABCA()
  277. # lpRouterInfo = lpRouterInfo + readABA()
  278. # printTime('find 0x9964ea0588e67a649b1333fe98d136db6e00d1be')
  279. # routerArray = findLP('0x9964ea0588e67a649b1333fe98d136db6e00d1be', lpRouter)
  280. # printTime('had find', len(routerArray))
  281. # onlyLpArray = calOnlyLpInRouterArray(routerArray)
  282. # printTime(onlyLpArray, len(onlyLpArray))
  283. # lpResResult = (w3.dex.getPairSBalance(onlyLpArray))