web3-wizzard-lib 1.6.12__py3-none-any.whl → 1.6.15__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. web3_wizzard_lib/core/__init__.py +1 -0
  2. web3_wizzard_lib/core/contract/__init__.py +0 -0
  3. web3_wizzard_lib/core/contract/aavecontract.py +36 -0
  4. web3_wizzard_lib/core/contract/alienswap_contract.py +21 -0
  5. web3_wizzard_lib/core/contract/arena_games_contract.py +16 -0
  6. web3_wizzard_lib/core/contract/basiliskcontract.py +58 -0
  7. web3_wizzard_lib/core/contract/bilinear_contract.py +22 -0
  8. web3_wizzard_lib/core/contract/bungee.py +33 -0
  9. web3_wizzard_lib/core/contract/coredao_contract.py +34 -0
  10. web3_wizzard_lib/core/contract/coredao_from_contract.py +40 -0
  11. web3_wizzard_lib/core/contract/dmail_send_mail.py +18 -0
  12. web3_wizzard_lib/core/contract/empty_nft.py +18 -0
  13. web3_wizzard_lib/core/contract/era_name.py +23 -0
  14. web3_wizzard_lib/core/contract/eralendcontract.py +34 -0
  15. web3_wizzard_lib/core/contract/eth_scroll_bridge_contract.py +25 -0
  16. web3_wizzard_lib/core/contract/frog_war_contract.py +48 -0
  17. web3_wizzard_lib/core/contract/gmx_reward_router.py +22 -0
  18. web3_wizzard_lib/core/contract/horizondex_quoter.py +14 -0
  19. web3_wizzard_lib/core/contract/horizondex_router.py +91 -0
  20. web3_wizzard_lib/core/contract/imagine_contract.py +18 -0
  21. web3_wizzard_lib/core/contract/izumi.py +63 -0
  22. web3_wizzard_lib/core/contract/kreatorland_contract.py +21 -0
  23. web3_wizzard_lib/core/contract/l0_claim.py +254 -0
  24. web3_wizzard_lib/core/contract/l2_telegraph.py +21 -0
  25. web3_wizzard_lib/core/contract/layerbank_price.py +18 -0
  26. web3_wizzard_lib/core/contract/layerbank_token.py +29 -0
  27. web3_wizzard_lib/core/contract/layerbankcontract.py +59 -0
  28. web3_wizzard_lib/core/contract/linea_day_2_contract.py +19 -0
  29. web3_wizzard_lib/core/contract/linea_day_3_contract.py +55 -0
  30. web3_wizzard_lib/core/contract/linea_ens_names_contract.py +55 -0
  31. web3_wizzard_lib/core/contract/lineaswaprouter.py +52 -0
  32. web3_wizzard_lib/core/contract/maverick_multicall.py +52 -0
  33. web3_wizzard_lib/core/contract/mendi_finance_contract.py +11 -0
  34. web3_wizzard_lib/core/contract/mendi_token.py +25 -0
  35. web3_wizzard_lib/core/contract/merkly_minter.py +47 -0
  36. web3_wizzard_lib/core/contract/micro3_contract.py +18 -0
  37. web3_wizzard_lib/core/contract/mute_router.py +93 -0
  38. web3_wizzard_lib/core/contract/new_rage_contract.py +31 -0
  39. web3_wizzard_lib/core/contract/nidum_contract.py +44 -0
  40. web3_wizzard_lib/core/contract/nile_contract.py +60 -0
  41. web3_wizzard_lib/core/contract/nomis_attest_contract.py +40 -0
  42. web3_wizzard_lib/core/contract/nomis_contract.py +40 -0
  43. web3_wizzard_lib/core/contract/octomos.py +31 -0
  44. web3_wizzard_lib/core/contract/odos.py +104 -0
  45. web3_wizzard_lib/core/contract/omnisea.py +29 -0
  46. web3_wizzard_lib/core/contract/orbiter_starknet.py +30 -0
  47. web3_wizzard_lib/core/contract/pancake_pool.py +19 -0
  48. web3_wizzard_lib/core/contract/pancake_quoter.py +20 -0
  49. web3_wizzard_lib/core/contract/pancake_router.py +72 -0
  50. web3_wizzard_lib/core/contract/rage_claim.py +24 -0
  51. web3_wizzard_lib/core/contract/reactor_fusion_contract.py +78 -0
  52. web3_wizzard_lib/core/contract/readon_contract.py +19 -0
  53. web3_wizzard_lib/core/contract/rubyscore_contract.py +31 -0
  54. web3_wizzard_lib/core/contract/satoshi_universe_contract.py +29 -0
  55. web3_wizzard_lib/core/contract/scroll_bridge_contract.py +24 -0
  56. web3_wizzard_lib/core/contract/scroll_canvas_mint_contract.py +26 -0
  57. web3_wizzard_lib/core/contract/scroll_oracle.py +11 -0
  58. web3_wizzard_lib/core/contract/snap_contract.py +16 -0
  59. web3_wizzard_lib/core/contract/social_scan_contract.py +20 -0
  60. web3_wizzard_lib/core/contract/stargate_farming.py +37 -0
  61. web3_wizzard_lib/core/contract/stargate_router.py +84 -0
  62. web3_wizzard_lib/core/contract/stargate_router_eth.py +41 -0
  63. web3_wizzard_lib/core/contract/stargate_token_pool.py +45 -0
  64. web3_wizzard_lib/core/contract/stargate_v2_contract.py +36 -0
  65. web3_wizzard_lib/core/contract/syncswap_classic_pool.py +15 -0
  66. web3_wizzard_lib/core/contract/syncswap_classic_pool_factory.py +15 -0
  67. web3_wizzard_lib/core/contract/syncswap_pool.py +25 -0
  68. web3_wizzard_lib/core/contract/syncswap_router.py +123 -0
  69. web3_wizzard_lib/core/contract/tavaera_id.py +18 -0
  70. web3_wizzard_lib/core/contract/tavaera_mint.py +17 -0
  71. web3_wizzard_lib/core/contract/townstory_bonus_contract.py +19 -0
  72. web3_wizzard_lib/core/contract/townstory_contract.py +21 -0
  73. web3_wizzard_lib/core/contract/velocore_lens.py +44 -0
  74. web3_wizzard_lib/core/contract/velocore_pool.py +198 -0
  75. web3_wizzard_lib/core/contract/velocore_router.py +80 -0
  76. web3_wizzard_lib/core/contract/woofi_swap.py +29 -0
  77. web3_wizzard_lib/core/contract/xy_finance_contract.py +87 -0
  78. web3_wizzard_lib/core/contract/yoddlo_contract.py +19 -0
  79. web3_wizzard_lib/core/contract/yuliverse_contract.py +36 -0
  80. web3_wizzard_lib/core/contract/zebra_contract.py +68 -0
  81. web3_wizzard_lib/core/contract/zerolend_contract.py +34 -0
  82. web3_wizzard_lib/core/contract/zerolend_liq_contract.py +20 -0
  83. web3_wizzard_lib/core/contract/zkdx_contract.py +40 -0
  84. web3_wizzard_lib/core/contract/zkdx_data.py +14 -0
  85. web3_wizzard_lib/core/contract/zks.py +24 -0
  86. web3_wizzard_lib/core/modules/__init__.py +0 -0
  87. web3_wizzard_lib/core/modules/ads_import_proxy.py +52 -0
  88. web3_wizzard_lib/core/modules/airdrop_printer.py +81 -0
  89. web3_wizzard_lib/core/modules/bank/__init__.py +0 -0
  90. web3_wizzard_lib/core/modules/bank/aave.py +25 -0
  91. web3_wizzard_lib/core/modules/bank/bank.py +15 -0
  92. web3_wizzard_lib/core/modules/bank/basilisk.py +25 -0
  93. web3_wizzard_lib/core/modules/bank/eralend.py +25 -0
  94. web3_wizzard_lib/core/modules/bank/layerbank.py +116 -0
  95. web3_wizzard_lib/core/modules/bank/mendi_finance.py +57 -0
  96. web3_wizzard_lib/core/modules/bank/reactorfusion.py +25 -0
  97. web3_wizzard_lib/core/modules/bank/zerolend.py +36 -0
  98. web3_wizzard_lib/core/modules/bank_module.py +99 -0
  99. web3_wizzard_lib/core/modules/bridge/__init__.py +0 -0
  100. web3_wizzard_lib/core/modules/bridge/bridge.py +8 -0
  101. web3_wizzard_lib/core/modules/bridge/coredao_bridge_sub.py +47 -0
  102. web3_wizzard_lib/core/modules/bridge/orbiter_sub.py +112 -0
  103. web3_wizzard_lib/core/modules/bridge/scroll_bridge_sub.py +42 -0
  104. web3_wizzard_lib/core/modules/bridge/stargate_v2_sub.py +74 -0
  105. web3_wizzard_lib/core/modules/bridge_module.py +47 -0
  106. web3_wizzard_lib/core/modules/bungee.py +109 -0
  107. web3_wizzard_lib/core/modules/cex_sender.py +60 -0
  108. web3_wizzard_lib/core/modules/cex_subaccount_transfer.py +34 -0
  109. web3_wizzard_lib/core/modules/cex_withdraw.py +91 -0
  110. web3_wizzard_lib/core/modules/claimer.py +45 -0
  111. web3_wizzard_lib/core/modules/claims/__init__.py +0 -0
  112. web3_wizzard_lib/core/modules/claims/layerzero_claimer.py +64 -0
  113. web3_wizzard_lib/core/modules/claims/rabby_claimer.py +81 -0
  114. web3_wizzard_lib/core/modules/concrete_swap.py +108 -0
  115. web3_wizzard_lib/core/modules/coredao_bridge.py +32 -0
  116. web3_wizzard_lib/core/modules/coredao_bridge_auto.py +39 -0
  117. web3_wizzard_lib/core/modules/debank_checker.py +78 -0
  118. web3_wizzard_lib/core/modules/dmail.py +54 -0
  119. web3_wizzard_lib/core/modules/erc20_balance.py +42 -0
  120. web3_wizzard_lib/core/modules/gmx_reward.py +25 -0
  121. web3_wizzard_lib/core/modules/intract/__init__.py +0 -0
  122. web3_wizzard_lib/core/modules/intract/intract_api.py +212 -0
  123. web3_wizzard_lib/core/modules/intract/utils.py +81 -0
  124. web3_wizzard_lib/core/modules/intract_claim.py +101 -0
  125. web3_wizzard_lib/core/modules/layer_2_20.py +65 -0
  126. web3_wizzard_lib/core/modules/lending_module.py +134 -0
  127. web3_wizzard_lib/core/modules/linea_appeal.py +98 -0
  128. web3_wizzard_lib/core/modules/linea_poh_lxp.py +65 -0
  129. web3_wizzard_lib/core/modules/liquidity/__init__.py +0 -0
  130. web3_wizzard_lib/core/modules/liquidity/nile_pool.py +64 -0
  131. web3_wizzard_lib/core/modules/liquidity/pool.py +16 -0
  132. web3_wizzard_lib/core/modules/liquidity/syncswap_pool.py +61 -0
  133. web3_wizzard_lib/core/modules/liquidity/velocore_pool.py +55 -0
  134. web3_wizzard_lib/core/modules/liquidity/zerolend_liquidity.py +26 -0
  135. web3_wizzard_lib/core/modules/liquidity_pool.py +60 -0
  136. web3_wizzard_lib/core/modules/merkly_refuel.py +87 -0
  137. web3_wizzard_lib/core/modules/new_rage_withdraw.py +41 -0
  138. web3_wizzard_lib/core/modules/nft/__init__.py +0 -0
  139. web3_wizzard_lib/core/modules/nft/abbys_world.py +22 -0
  140. web3_wizzard_lib/core/modules/nft/acg_worlds.py +25 -0
  141. web3_wizzard_lib/core/modules/nft/alienswap_linea.py +22 -0
  142. web3_wizzard_lib/core/modules/nft/arena_games.py +22 -0
  143. web3_wizzard_lib/core/modules/nft/asmatch.py +22 -0
  144. web3_wizzard_lib/core/modules/nft/battlemon.py +25 -0
  145. web3_wizzard_lib/core/modules/nft/bilinear.py +22 -0
  146. web3_wizzard_lib/core/modules/nft/bitavatar.py +25 -0
  147. web3_wizzard_lib/core/modules/nft/culture_satoshi_universe.py +24 -0
  148. web3_wizzard_lib/core/modules/nft/efrogs.py +26 -0
  149. web3_wizzard_lib/core/modules/nft/empty_nft.py +22 -0
  150. web3_wizzard_lib/core/modules/nft/era_domain.py +42 -0
  151. web3_wizzard_lib/core/modules/nft/frog_war.py +22 -0
  152. web3_wizzard_lib/core/modules/nft/frog_war_bonus.py +22 -0
  153. web3_wizzard_lib/core/modules/nft/gamerboom.py +25 -0
  154. web3_wizzard_lib/core/modules/nft/gamerboom_bonus.py +26 -0
  155. web3_wizzard_lib/core/modules/nft/imagine.py +32 -0
  156. web3_wizzard_lib/core/modules/nft/kreatorland_module.py +35 -0
  157. web3_wizzard_lib/core/modules/nft/l2_telegraph_module.py +22 -0
  158. web3_wizzard_lib/core/modules/nft/layer3_meta.py +25 -0
  159. web3_wizzard_lib/core/modules/nft/linea_culture_2_2_linus.py +24 -0
  160. web3_wizzard_lib/core/modules/nft/linea_culture_2_3_yooldo.py +24 -0
  161. web3_wizzard_lib/core/modules/nft/linea_culture_2_4_frogwar.py +24 -0
  162. web3_wizzard_lib/core/modules/nft/linea_culture_2_5_acg.py +25 -0
  163. web3_wizzard_lib/core/modules/nft/linea_culture_2_6_ascend_the_end.py +25 -0
  164. web3_wizzard_lib/core/modules/nft/linea_culture_3_1_ascend_the_end.py +25 -0
  165. web3_wizzard_lib/core/modules/nft/linea_culture_3_2_sending_me.py +25 -0
  166. web3_wizzard_lib/core/modules/nft/linea_culture_3_3_townstory.py +25 -0
  167. web3_wizzard_lib/core/modules/nft/linea_culture_3_4_daniele.py +25 -0
  168. web3_wizzard_lib/core/modules/nft/linea_culture_3_5_demmortal.py +25 -0
  169. web3_wizzard_lib/core/modules/nft/linea_culture_3_6_foxy.py +25 -0
  170. web3_wizzard_lib/core/modules/nft/linea_culture_4_1_coop_records.py +60 -0
  171. web3_wizzard_lib/core/modules/nft/linea_culture_4_2_borja_moskv.py +65 -0
  172. web3_wizzard_lib/core/modules/nft/linea_culture_4_2_borja_moskv_approve.py +27 -0
  173. web3_wizzard_lib/core/modules/nft/linea_culture_4_3_fruit.py +66 -0
  174. web3_wizzard_lib/core/modules/nft/linea_culture_4_4_fruit_crux.py +67 -0
  175. web3_wizzard_lib/core/modules/nft/linea_culture_4_5_forbidden_fruit.py +67 -0
  176. web3_wizzard_lib/core/modules/nft/linea_culture_4_6_laurent.py +67 -0
  177. web3_wizzard_lib/core/modules/nft/linea_culture_day2.py +20 -0
  178. web3_wizzard_lib/core/modules/nft/linea_culture_day3.py +20 -0
  179. web3_wizzard_lib/core/modules/nft/linea_ens_names.py +107 -0
  180. web3_wizzard_lib/core/modules/nft/lucky_cat.py +25 -0
  181. web3_wizzard_lib/core/modules/nft/merkly_minter_module.py +22 -0
  182. web3_wizzard_lib/core/modules/nft/micro3.py +23 -0
  183. web3_wizzard_lib/core/modules/nft/mint_2048.py +28 -0
  184. web3_wizzard_lib/core/modules/nft/nft_submodule.py +16 -0
  185. web3_wizzard_lib/core/modules/nft/nidum.py +87 -0
  186. web3_wizzard_lib/core/modules/nft/nidum_bonus.py +23 -0
  187. web3_wizzard_lib/core/modules/nft/nomis.py +64 -0
  188. web3_wizzard_lib/core/modules/nft/nomis_attest.py +66 -0
  189. web3_wizzard_lib/core/modules/nft/nouns.py +27 -0
  190. web3_wizzard_lib/core/modules/nft/octomos.py +32 -0
  191. web3_wizzard_lib/core/modules/nft/omnisea.py +33 -0
  192. web3_wizzard_lib/core/modules/nft/omnizone.py +25 -0
  193. web3_wizzard_lib/core/modules/nft/orbiter_claim.py +87 -0
  194. web3_wizzard_lib/core/modules/nft/readon.py +30 -0
  195. web3_wizzard_lib/core/modules/nft/rubyscore.py +45 -0
  196. web3_wizzard_lib/core/modules/nft/sarubol.py +22 -0
  197. web3_wizzard_lib/core/modules/nft/satoshi_universe.py +22 -0
  198. web3_wizzard_lib/core/modules/nft/scroll_canvas_attest_year_badge.py +35 -0
  199. web3_wizzard_lib/core/modules/nft/scroll_canvas_mint.py +51 -0
  200. web3_wizzard_lib/core/modules/nft/sign.py +32 -0
  201. web3_wizzard_lib/core/modules/nft/snap.py +25 -0
  202. web3_wizzard_lib/core/modules/nft/snap_bonus.py +31 -0
  203. web3_wizzard_lib/core/modules/nft/social_scan.py +22 -0
  204. web3_wizzard_lib/core/modules/nft/tavaera.py +30 -0
  205. web3_wizzard_lib/core/modules/nft/townstory.py +75 -0
  206. web3_wizzard_lib/core/modules/nft/townstory_bonus.py +45 -0
  207. web3_wizzard_lib/core/modules/nft/trusta_reputation.py +48 -0
  208. web3_wizzard_lib/core/modules/nft/trustaa_poh.py +49 -0
  209. web3_wizzard_lib/core/modules/nft/uber_poh.py +24 -0
  210. web3_wizzard_lib/core/modules/nft/wizards_of_linea.py +26 -0
  211. web3_wizzard_lib/core/modules/nft/yoddlo.py +22 -0
  212. web3_wizzard_lib/core/modules/nft/yuliverse.py +22 -0
  213. web3_wizzard_lib/core/modules/nft/zace.py +25 -0
  214. web3_wizzard_lib/core/modules/nft/zks_domain.py +41 -0
  215. web3_wizzard_lib/core/modules/nft_minter.py +107 -0
  216. web3_wizzard_lib/core/modules/orbiter.py +39 -0
  217. web3_wizzard_lib/core/modules/orbiter_checker.py +26 -0
  218. web3_wizzard_lib/core/modules/rage.py +54 -0
  219. web3_wizzard_lib/core/modules/scroll_bridge.py +45 -0
  220. web3_wizzard_lib/core/modules/sell_all.py +51 -0
  221. web3_wizzard_lib/core/modules/sleep_module.py +25 -0
  222. web3_wizzard_lib/core/modules/smart_contract_deployment.py +37 -0
  223. web3_wizzard_lib/core/modules/stargate/__init__.py +0 -0
  224. web3_wizzard_lib/core/modules/stargate/auto_bridge.py +91 -0
  225. web3_wizzard_lib/core/modules/stargate/bridge.py +38 -0
  226. web3_wizzard_lib/core/modules/stargate/bridge_eth.py +59 -0
  227. web3_wizzard_lib/core/modules/stargate/bridge_tokens.py +48 -0
  228. web3_wizzard_lib/core/modules/stargate/classic_bridge.py +34 -0
  229. web3_wizzard_lib/core/modules/stargate/farming.py +163 -0
  230. web3_wizzard_lib/core/modules/stargate/l0_data.py +10 -0
  231. web3_wizzard_lib/core/modules/stargate/pool.py +74 -0
  232. web3_wizzard_lib/core/modules/stargate/stargate_balance_utils.py +25 -0
  233. web3_wizzard_lib/core/modules/stargate/stargate_gas_checker.py +68 -0
  234. web3_wizzard_lib/core/modules/swap/__init__.py +1 -0
  235. web3_wizzard_lib/core/modules/swap/horizondex.py +38 -0
  236. web3_wizzard_lib/core/modules/swap/izumi.py +41 -0
  237. web3_wizzard_lib/core/modules/swap/lineaswap.py +34 -0
  238. web3_wizzard_lib/core/modules/swap/maverick.py +66 -0
  239. web3_wizzard_lib/core/modules/swap/mute.py +39 -0
  240. web3_wizzard_lib/core/modules/swap/odos.py +58 -0
  241. web3_wizzard_lib/core/modules/swap/one_inch.py +58 -0
  242. web3_wizzard_lib/core/modules/swap/pancake.py +41 -0
  243. web3_wizzard_lib/core/modules/swap/swap_list.py +11 -0
  244. web3_wizzard_lib/core/modules/swap/syncswap.py +62 -0
  245. web3_wizzard_lib/core/modules/swap/velocore.py +40 -0
  246. web3_wizzard_lib/core/modules/swap/woofi.py +38 -0
  247. web3_wizzard_lib/core/modules/swap/xy_finance.py +43 -0
  248. web3_wizzard_lib/core/modules/swap/zebra.py +32 -0
  249. web3_wizzard_lib/core/modules/warm_up.py +98 -0
  250. web3_wizzard_lib/core/modules/wrapping.py +74 -0
  251. web3_wizzard_lib/core/modules/zkdx.py +63 -0
  252. web3_wizzard_lib/core/utils/__init__.py +0 -0
  253. web3_wizzard_lib/core/utils/ai_utils.py +45 -0
  254. web3_wizzard_lib/core/utils/benchmark_utils.py +12 -0
  255. web3_wizzard_lib/core/utils/module_memory.py +28 -0
  256. web3_wizzard_lib/core/utils/statistic_utils.py +150 -0
  257. web3_wizzard_lib/core/utils/sub_module.py +8 -0
  258. web3_wizzard_lib/data/__init__.py +0 -0
  259. web3_wizzard_lib/data/config_default.py +52 -0
  260. web3_wizzard_lib/data/module_config_default.py +209 -0
  261. web3_wizzard_lib/utils/__init__.py +0 -0
  262. web3_wizzard_lib/utils/debank_utils.py +19 -0
  263. {web3_wizzard_lib-1.6.12.dist-info → web3_wizzard_lib-1.6.15.dist-info}/METADATA +2 -2
  264. web3_wizzard_lib-1.6.15.dist-info/RECORD +369 -0
  265. web3_wizzard_lib-1.6.12.dist-info/RECORD +0 -107
  266. {web3_wizzard_lib-1.6.12.dist-info → web3_wizzard_lib-1.6.15.dist-info}/WHEEL +0 -0
  267. {web3_wizzard_lib-1.6.12.dist-info → web3_wizzard_lib-1.6.15.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,34 @@
1
+ from sybil_engine.config.app_config import get_cex_data, get_cex_conf
2
+ from sybil_engine.domain.cex.binance import Binance
3
+ from sybil_engine.domain.cex.okx import OKX
4
+ from sybil_engine.module.module import Module
5
+ from sybil_engine.utils.app_account_utils import AppAccount
6
+ from sybil_engine.utils.utils import ConfigurationException
7
+
8
+
9
+ class CEXSubAccountTransfer(Module):
10
+ module_name = 'CEX_SUB_ACCOUNT_TRANSFER'
11
+ module_config = 'cex_account_transfer_config'
12
+
13
+ def execute(self, cex, account: AppAccount):
14
+ password, cex_data = get_cex_data()
15
+
16
+ tokens = ['ETH', 'CORE', 'POL', 'USDC', 'USDT', 'OKB', 'ZRO']
17
+
18
+ if cex == 'okx':
19
+ cex_obj = OKX(cex_data[get_cex_conf()], password)
20
+ elif cex == 'binance':
21
+ cex_obj = Binance(cex_data[get_cex_conf()], password)
22
+ else:
23
+ raise ConfigurationException(f"{cex} is not")
24
+
25
+ cex_obj.transfer_from_sub_account(tokens)
26
+
27
+ def log(self):
28
+ return "CEX SUB ACCOUNT TRANSFER"
29
+
30
+ def parse_params(self, module_params):
31
+ if 'cex' not in module_params:
32
+ module_params['cex'] = 'okx'
33
+
34
+ return [module_params['cex']]
@@ -0,0 +1,91 @@
1
+ import random
2
+
3
+ from loguru import logger
4
+ from sybil_engine.config.app_config import get_cex_data, get_cex_conf
5
+ from sybil_engine.data.networks import get_chain_instance
6
+ from sybil_engine.domain.balance.balance_utils import get_native_balance, \
7
+ interval_to_native_balance, interval_to_erc20_balance
8
+ from sybil_engine.domain.balance.tokens import Erc20Token
9
+ from sybil_engine.domain.cex.binance import Binance
10
+ from sybil_engine.domain.cex.okx import OKX
11
+ from sybil_engine.module.module import Module
12
+ from sybil_engine.utils.app_account_utils import AppAccount
13
+ from sybil_engine.utils.utils import randomized_sleeping, ConfigurationException
14
+ from sybil_engine.utils.web3_utils import init_web3
15
+
16
+
17
+ class CEXWithdraw(Module):
18
+ module_name = 'CEX_WITHDRAW'
19
+ sleep_after_conf = True
20
+ module_config = 'cex_withdraw'
21
+
22
+ def execute(self, chain, withdraw_interval, min_auto_withdraw_interval, token, cex, account: AppAccount):
23
+ self.sleep_after_conf = True
24
+ chain_instance = get_chain_instance(chain)
25
+ web3 = init_web3(chain_instance, None)
26
+
27
+ balance, min_auto_withdraw, withdraw_token = self.balance(account, chain, chain_instance,
28
+ min_auto_withdraw_interval, token, web3)
29
+ logger.info(f"{chain}")
30
+ logger.info(f"Minimum balance should be {min_auto_withdraw}")
31
+
32
+ if min_auto_withdraw.wei < balance.wei:
33
+ self.sleep_after_conf = False
34
+
35
+ while min_auto_withdraw.wei > balance.wei:
36
+ logger.info(f"Actual balance: {balance}")
37
+
38
+ amount = round(random.uniform(withdraw_interval['from'], withdraw_interval['to']), 6)
39
+ logger.info(f"Withdraw {amount} {chain_instance['gas_token']} from {cex} to {account.address}")
40
+
41
+ password, cex_data = get_cex_data()
42
+
43
+ if cex == 'okx':
44
+ cex_obj = OKX(cex_data[get_cex_conf()], password)
45
+ elif cex == 'binance':
46
+ cex_obj = Binance(cex_data[get_cex_conf()], password)
47
+ else:
48
+ raise ConfigurationException(f"{cex} is not")
49
+
50
+ if withdraw_token == 'WETH':
51
+ withdraw_token = 'ETH'
52
+
53
+ cex_obj.withdrawal(account.address, chain, amount, withdraw_token)
54
+
55
+ randomized_sleeping({'from': 60 * 2, 'to': 60 * 4})
56
+
57
+ balance, _, _ = self.balance(account, chain, chain_instance, min_auto_withdraw_interval, token, web3)
58
+
59
+ def balance(self, account, chain, chain_instance, min_auto_withdraw_interval, token, web3):
60
+ if token == 'NATIVE':
61
+ min_auto_withdraw = interval_to_native_balance(min_auto_withdraw_interval, account, chain, web3)
62
+ balance = get_native_balance(account, web3, chain_instance)
63
+ withdraw_token = chain_instance['gas_token']
64
+ elif token in ['USDC', 'USDT', 'WETH', 'ETH']:
65
+ if token == 'ETH':
66
+ token = 'WETH'
67
+ min_auto_withdraw = interval_to_erc20_balance(min_auto_withdraw_interval, account, token, chain, web3)
68
+ erc20_token = Erc20Token(chain, token, web3)
69
+ balance = erc20_token.balance(account)
70
+ withdraw_token = token
71
+ else:
72
+ raise ConfigurationException(f"Unsupported token {token}, supported tokens are: NATIVE, USDC")
73
+ return balance, min_auto_withdraw, withdraw_token
74
+
75
+ def log(self):
76
+ return "CEX WITHDRAW"
77
+
78
+ def parse_params(self, module_params):
79
+ if 'cex' not in module_params:
80
+ module_params['cex'] = 'okx'
81
+
82
+ return [
83
+ module_params['chain'],
84
+ module_params['withdraw_interval'],
85
+ module_params['min_auto_withdraw_interval'],
86
+ module_params['token'],
87
+ module_params['cex']
88
+ ]
89
+
90
+ def sleep_after(self):
91
+ return self.sleep_after_conf
@@ -0,0 +1,45 @@
1
+ from loguru import logger
2
+ from sybil_engine.data.networks import get_chain_instance
3
+ from sybil_engine.module.module import Module
4
+ from sybil_engine.utils.app_account_utils import AppAccount
5
+ from sybil_engine.utils.web3_utils import init_web3
6
+
7
+ from web3_wizzard_lib.core.modules.claims.layerzero_claimer import claimer_zro
8
+ from web3_wizzard_lib.core.modules.claims.rabby_claimer import claimer_rabby
9
+
10
+ native_prices = {
11
+ 'ETH': 3700,
12
+ 'USDT': 1
13
+ }
14
+
15
+
16
+ class Claimer(Module):
17
+ module_name = 'CLAIMER'
18
+ sleep_after_conf = True
19
+ module_config = 'claimer_config'
20
+
21
+ def execute(self, chain, layerzero_token, project, account: AppAccount):
22
+ logger.info(f"CLAIM L0 tokens for {account} on {chain}")
23
+ chain_instance = get_chain_instance(chain)
24
+ web3 = init_web3(chain_instance, None)
25
+
26
+ if project == 'ZRO':
27
+ claimer_zro(account, chain_instance, layerzero_token, web3)
28
+ else:
29
+ claimer_rabby(account, web3)
30
+
31
+ def log(self):
32
+ return "CLAIMER"
33
+
34
+ def parse_params(self, module_params):
35
+ if 'project' not in module_params:
36
+ module_params['project'] = 'ZRO'
37
+
38
+ return [
39
+ module_params['chain'],
40
+ module_params['token'],
41
+ module_params['project']
42
+ ]
43
+
44
+ def sleep_after(self):
45
+ return self.sleep_after_conf
File without changes
@@ -0,0 +1,64 @@
1
+ import requests
2
+ from loguru import logger
3
+ from sybil_engine.config.app_config import get_cex_conf, get_cex_data
4
+ from sybil_engine.domain.balance.balance import NativeBalance, Erc20Balance
5
+ from sybil_engine.domain.balance.balance_utils import get_native_balance
6
+ from sybil_engine.domain.balance.tokens import Erc20Token
7
+ from sybil_engine.domain.cex.okx import OKX
8
+
9
+ total_zro = 0
10
+
11
+ def claimer_zro(account, chain_instance, token, web3):
12
+ allocation_data = get_allocation(account.address)
13
+ if not allocation_data:
14
+ raise Exception("Failed to fetch allocation data.")
15
+ amount_raw = int(allocation_data.get('zroAllocation', {}).get('asBigInt'))
16
+ logger.info(f"ZRO Allocation for {account.address} is {amount_raw}")
17
+ if token == 'NATIVE':
18
+ withdraw_token = chain_instance['gas_token']
19
+ claim_price = NativeBalance(int((round(amount_raw / 10 ** 18) + 1) * 0.00005 * 10 ** 18),
20
+ chain_instance['chain'], token)
21
+ balance = get_native_balance(account, web3, chain_instance)
22
+ logger.info(f"Native balance is {balance}")
23
+ else:
24
+ claim_price = Erc20Balance(
25
+ int((round(amount_raw / 10 ** 18) + 1) * 0.00003 * 10 ** 18),
26
+ chain_instance['chain'],
27
+ token,
28
+ decimal=18
29
+ )
30
+ withdraw_token = token
31
+ balance = Erc20Token(chain_instance['chain'], token, web3).balance(account)
32
+ logger.info(f"Native balance is {balance}")
33
+ logger.info(f"Need {claim_price} for claim")
34
+ if claim_price.wei > balance.wei:
35
+ password, cex_data = get_cex_data()
36
+ cex_obj = OKX(cex_data[get_cex_conf()], password)
37
+ cex_obj.withdrawal(account.address, chain_instance['chain'], float(balance.readable()), withdraw_token)
38
+
39
+ proof = get_proof(account.address)
40
+ logger.info(proof)
41
+ global total_zro
42
+ total_zro = total_zro + int(proof['amount'])
43
+ amount_to_claim = int(proof['amount'])
44
+ merkle_proof = proof['proof'].split('|')
45
+ #contract_address = get_contracts_for_chain(chain_instance['chain'])['ZRO_CLAIMER']
46
+ #claimer = L0Claim(contract_address, web3)
47
+ #claimer.donateAndClaim(account, claim_price.wei, amount_to_claim, merkle_proof)
48
+
49
+ def get_proof(wallet):
50
+ url = f"https://www.layerzero.foundation/api/proof/{wallet}?address={wallet}"
51
+ response = requests.get(url)
52
+ if response.status_code == 200:
53
+ return response.json()
54
+ else:
55
+ return None
56
+
57
+
58
+ def get_allocation(wallet):
59
+ url = f"https://www.layerzero.foundation/api/allocation/{wallet}"
60
+ response = requests.get(url)
61
+ if response.status_code == 200:
62
+ return response.json()
63
+ else:
64
+ return None
@@ -0,0 +1,81 @@
1
+ import time
2
+ from random import randint
3
+
4
+ from eth_account.messages import encode_defunct, SignableMessage
5
+ from fake_useragent import UserAgent
6
+ from loguru import logger
7
+
8
+ import requests
9
+ from sybil_engine.utils.utils import randomized_sleeping
10
+
11
+ url = "https://api.rabby.io/v2/points/claim_snapshot"
12
+
13
+ headers = {
14
+ "Host": "api.rabby.io",
15
+ "Connection": "keep-alive",
16
+ "Content-Length": "224",
17
+ "sec-ch-ua": '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
18
+ "X-Version": "0.92.48",
19
+ "sec-ch-ua-mobile": "?0",
20
+ "User-Agent": UserAgent().random,
21
+ "x-api-ts": str(int(time.time())),
22
+ "Content-Type": "application/json",
23
+ "x-api-ver": "v2",
24
+ "Accept": "application/json, text/plain, */*",
25
+ "X-Client": "Rabby",
26
+ "sec-ch-ua-platform": '"Windows"',
27
+ "Origin": "chrome-extension://acmacodkjb dgmoleebolmdjonilkdbch",
28
+ "Sec-Fetch-Site": "none",
29
+ "Sec-Fetch-Mode": "cors",
30
+ "Sec-Fetch-Dest": "empty",
31
+ "Accept-Encoding": "gzip, deflate, br",
32
+ "Accept-Language": "uk-UA,uk;q=0.9,en-US;q=0.8,en;q=0.7",
33
+ }
34
+
35
+
36
+ def claimer_rabby(account, web3):
37
+ try:
38
+ address = account.address.lower()
39
+ msg = f"{address} Claims Rabby Points"
40
+
41
+ payload = {
42
+ "id": address,
43
+ "signature": get_signed_code(web3, account, msg),
44
+ "invite_code": "FREEBONUS"
45
+ }
46
+
47
+ proxies = {}
48
+ proxies.update(
49
+ {"http": account.proxy,
50
+ "https": account.proxy}
51
+ )
52
+
53
+ response = make_request_with_retries(url, headers=headers, json=payload, proxies=proxies)
54
+
55
+ if response.json().get("error_code") == 0:
56
+ logger.success(f"{address} | Claimed!")
57
+ else:
58
+ resp_msg = response.json().get("error_msg")
59
+ logger.info(f"{address} | {resp_msg} | {response.json()}")
60
+ except Exception as e:
61
+ logger.error(f"{account}... | {e}")
62
+
63
+
64
+ def sign(web3, account, encoded_msg: SignableMessage):
65
+ return web3.eth.account.sign_message(encoded_msg, account.key)
66
+
67
+
68
+ def get_signed_code(web3, account, msg) -> str:
69
+ return sign(web3, account, encode_defunct(text=msg)).signature.hex()
70
+
71
+ def make_request_with_retries(url, headers, json, proxies, max_retries=5):
72
+ for attempt in range(max_retries):
73
+ response = requests.post(url, headers=headers, json=json, proxies=proxies)
74
+ if response.status_code == 429:
75
+ retry_after = int(response.headers.get("Retry-After", randint(1, 5)))
76
+ logger.info(f"Rate limited. Retrying after {retry_after} seconds. Attempt {attempt + 1}/{max_retries}")
77
+ time.sleep(retry_after)
78
+ else:
79
+ return response
80
+ logger.error("Max retries reached. Giving up.")
81
+ return None
@@ -0,0 +1,108 @@
1
+ import random
2
+
3
+ from loguru import logger
4
+ from sybil_engine.data.networks import get_chain_instance
5
+ from sybil_engine.domain.balance.balance_utils import verify_balance, amount_to_swap_from_interval
6
+ from sybil_engine.domain.balance.tokens import Erc20Token
7
+ from sybil_engine.module.module import Module
8
+ from sybil_engine.utils.utils import SwapException
9
+ from sybil_engine.utils.validation_utils import validate_amount_interval, validate_token
10
+ from sybil_engine.utils.web3_utils import init_web3
11
+ from web3 import Web3
12
+
13
+ from web3_wizzard_lib.core.modules.swap.swap_list import swap_facade
14
+
15
+
16
+ class ConcreteSwap(Module):
17
+ module_name = 'CONCRETE_SWAP'
18
+ module_config = 'swap_config'
19
+ allowed_chains = ['ZKSYNC', 'LINEA', 'BASE', 'SCROLL', 'ARBITRUM']
20
+ sleep_after_var = True
21
+
22
+ def execute(self, chain, amount_interval, from_token, to_token, swap_app, account):
23
+ if isinstance(swap_app, list):
24
+ swap_app = random.choice(swap_app)
25
+
26
+ self.sleep_after_var = True
27
+ chain_instance = get_chain_instance(chain)
28
+ web3 = init_web3(chain_instance, account.proxy)
29
+
30
+ native_balance = verify_balance(self.min_native_balance, chain_instance, account, web3)
31
+
32
+ from_token_contract = Erc20Token(chain, from_token, web3)
33
+ to_token_contract = Erc20Token(chain, to_token, web3)
34
+
35
+ if Web3.is_address(from_token):
36
+ from_token_symbol = from_token_contract.symbol()
37
+ else:
38
+ from_token_symbol = from_token
39
+
40
+ if Web3.is_address(to_token):
41
+ to_token_symbol = to_token_contract.symbol()
42
+ else:
43
+ to_token_symbol = to_token
44
+
45
+ pair_to_swap = self.create_pair_to_swap(
46
+ from_token_symbol,
47
+ swap_app,
48
+ to_token_symbol,
49
+ )
50
+
51
+ amount_to_swap = amount_to_swap_from_interval(
52
+ account,
53
+ chain,
54
+ self.min_native_balance,
55
+ native_balance,
56
+ amount_interval,
57
+ from_token,
58
+ web3
59
+ )
60
+
61
+ if amount_to_swap.wei < 100000:
62
+ logger.info("Low balance, ignore")
63
+ return
64
+
65
+ try:
66
+ swap_facade.swap(
67
+ account,
68
+ amount_to_swap,
69
+ chain_instance,
70
+ pair_to_swap,
71
+ swap_app,
72
+ from_token,
73
+ to_token,
74
+ web3
75
+ )
76
+ except SwapException as e:
77
+ logger.info(e.message)
78
+ self.sleep_after_var = False
79
+
80
+ def create_pair_to_swap(self, from_token, swap_app, to_token):
81
+ pair_to_swap = {
82
+ 'name': f'{from_token}>{to_token}',
83
+ 'tokens': [from_token, to_token],
84
+ 'slippage': 2,
85
+ 'app': swap_app
86
+ }
87
+ return pair_to_swap
88
+
89
+ def log(self):
90
+ return "SWAP"
91
+
92
+ def sleep_after(self):
93
+ return self.sleep_after_var
94
+
95
+ def parse_params(self, module_params):
96
+ self.validate_supported_chain(module_params['chain'])
97
+ validate_amount_interval(module_params['amount_interval'])
98
+ validate_token(module_params['from_token'])
99
+ validate_token(module_params['to_token'])
100
+ #validate_dex(module_params['app'])
101
+
102
+ return (
103
+ module_params['chain'],
104
+ module_params['amount_interval'],
105
+ module_params['from_token'],
106
+ module_params['to_token'],
107
+ module_params['app']
108
+ )
@@ -0,0 +1,32 @@
1
+ from sybil_engine.module.module import Order, Module
2
+
3
+ from web3_wizzard_lib.core.modules.bridge.coredao_bridge_sub import CoreDaoBridgeSubModule
4
+
5
+
6
+ class CoreDaoBridge(Module):
7
+ module_name = 'COREDAO_BRIDGE'
8
+ allowed_chains = ['POLYGON', 'COREDAO']
9
+ module_config = 'coredao_bridge_config'
10
+
11
+ def execute(self, bridge_amount_interval, from_chain, to_chain, token, account):
12
+ CoreDaoBridgeSubModule().execute(
13
+ bridge_amount_interval,
14
+ from_chain,
15
+ to_chain,
16
+ token,
17
+ self.min_native_balance,
18
+ account
19
+ )
20
+
21
+ def log(self):
22
+ return "COREDAO BRIDGE"
23
+
24
+ def parse_params(self, module_params):
25
+ self.validate_supported_chain(module_params['from_chain'])
26
+ self.validate_supported_chain(module_params['to_chain'])
27
+
28
+ return module_params['bridge_amount_interval'], module_params['from_chain'], module_params['to_chain'], \
29
+ module_params['token']
30
+
31
+ def order(self):
32
+ return Order.RANDOM
@@ -0,0 +1,39 @@
1
+ from sybil_engine.module.module import Order, RepeatableModule
2
+ from sybil_engine.utils.utils import interval_to_int, randomized_sleeping
3
+
4
+ from web3_wizzard_lib.core.modules.bridge.coredao_bridge_sub import CoreDaoBridgeSubModule
5
+
6
+
7
+ class CoreDaoBridgeAuto(RepeatableModule):
8
+ module_name = 'COREDAO_BRIDGE_AUTO'
9
+ allowed_chains = ['POLYGON', 'COREDAO']
10
+ random_order = Order.RANDOM
11
+ repeat_conf = 'repeats'
12
+ module_config = 'coredao_bridge_auto_config'
13
+
14
+ @RepeatableModule.repeatable_log
15
+ def execute(self, from_chain, to_chain, bridge_amount_interval, token, sleep_interval, account):
16
+ CoreDaoBridgeSubModule().execute(bridge_amount_interval, from_chain, to_chain, token, account)
17
+ randomized_sleeping(sleep_interval)
18
+ CoreDaoBridgeSubModule().execute(bridge_amount_interval, to_chain, from_chain, token, account)
19
+
20
+ def log(self):
21
+ return "COREDAO BRIDGE AUTO"
22
+
23
+ def parse_params(self, module_params):
24
+ return [
25
+ module_params['from_chain'],
26
+ module_params['to_chain'],
27
+ module_params['bridge_amount_interval'],
28
+ module_params['token'],
29
+ module_params['sleep_interval'],
30
+ ]
31
+
32
+ def order(self):
33
+ return Order.RANDOM
34
+
35
+ def repeats(self, module_params):
36
+ if self.repeat_conf not in module_params:
37
+ return 1
38
+ else:
39
+ return range(interval_to_int(module_params[self.repeat_conf]))
@@ -0,0 +1,78 @@
1
+ from sybil_engine.module.module import Module
2
+ from sybil_engine.utils.accumulator import add_accumulator, get_value
3
+
4
+ from web3_wizzard_lib.core.utils.statistic_utils import statistic_date_string, get_statistic_writer
5
+ from web3_wizzard_lib.utils.debank_utils import debank_request
6
+
7
+ TOTAL_USD = "TotalUSD"
8
+ DEBANK_ACC_NUM = "DEBANK_ACC_NUM"
9
+
10
+
11
+ class DebankChecker(Module):
12
+ module_name = "DEBANK_CHECKER"
13
+ module_config = None
14
+
15
+ cumulative_chain_sums = {}
16
+
17
+ supported_chains = [
18
+ 'ethereum',
19
+ 'arbitrum',
20
+ 'op',
21
+ 'zksync era',
22
+ 'base',
23
+ 'bnb Chain',
24
+ 'linea',
25
+ 'polygon',
26
+ 'avalanche',
27
+ 'scroll',
28
+ 'utils',
29
+ 'fantom',
30
+ 'zora',
31
+ 'arbitrum nova',
32
+ 'celo',
33
+ 'klaytn'
34
+ ]
35
+
36
+ def execute(self, account, statistic_write='GOOGLE'):
37
+ data = debank_request(account.address)
38
+
39
+ job_name = f"debank_{statistic_date_string}"
40
+ statistics_writer = get_statistic_writer()
41
+
42
+ add_accumulator(DEBANK_ACC_NUM, 1)
43
+
44
+ total_usd_value = data.get('total_usd_value', 0)
45
+ chain_list = data.get('chain_list', [])
46
+ chain_list = [item for item in chain_list if item['name'].lower() in self.supported_chains]
47
+ chain_list = sorted(chain_list, key=lambda x: x['community_id'])
48
+
49
+ chain_names = [chain.get('name') for chain in chain_list]
50
+
51
+ statistics_writer.init_if_required(
52
+ job_name,
53
+ ['ADS ID', 'Wallet ID', 'Total USD Value'] + chain_names
54
+ )
55
+
56
+ row = [account.app_id, account.address, total_usd_value]
57
+ for chain in chain_list:
58
+ usd_value = chain.get('usd_value', 0)
59
+ row.append(usd_value)
60
+
61
+ if chain['name'] in self.cumulative_chain_sums:
62
+ self.cumulative_chain_sums[chain['name']] += usd_value
63
+ else:
64
+ self.cumulative_chain_sums[chain['name']] = usd_value
65
+
66
+ statistics_writer.write_row(job_name, row)
67
+
68
+ add_accumulator(TOTAL_USD, total_usd_value)
69
+
70
+ if get_value(DEBANK_ACC_NUM) == get_value("Acc Amount"):
71
+ cumulative_row = ['SUM', '', get_value(TOTAL_USD)]
72
+ for chain_name in chain_names:
73
+ cumulative_row.append(self.cumulative_chain_sums.get(chain_name, 0))
74
+
75
+ statistics_writer.write_row(job_name, cumulative_row)
76
+
77
+ def log(self):
78
+ return "Debank Checker"
@@ -0,0 +1,54 @@
1
+ import random
2
+ from hashlib import sha256
3
+
4
+ from sybil_engine.data.contracts import get_contracts_for_chain
5
+ from sybil_engine.data.networks import get_chain_instance
6
+ from sybil_engine.module.module import Order, RepeatableModule
7
+ from sybil_engine.utils.utils import interval_to_int
8
+ from sybil_engine.utils.web3_utils import init_web3
9
+
10
+ from web3_wizzard_lib.core.contract.dmail_send_mail import DmailSend
11
+
12
+
13
+ class Dmail(RepeatableModule):
14
+ module_name = 'DMAIL'
15
+ module_config = 'send_dmail_config'
16
+ allowed_chains = ['ZKSYNC', 'LINEA', 'SCROLL', 'MANTA', 'BASE']
17
+ random_order = Order.RANDOM
18
+ repeat_conf = 'email_amount'
19
+
20
+ @RepeatableModule.repeatable_log
21
+ def execute(self, chain, account):
22
+ chain_instance = get_chain_instance(chain)
23
+ web3 = init_web3(chain_instance, account.proxy)
24
+
25
+ dmail_contract_address = get_contracts_for_chain(chain)["DMAIL"]
26
+
27
+ email = sha256(str(1e11 * random.random()).encode()).hexdigest()
28
+ theme = sha256(str(1e11 * random.random()).encode()).hexdigest()
29
+
30
+ args = [account, email, theme]
31
+
32
+ dmail_sender = self.get_contract_class()(dmail_contract_address, web3)
33
+
34
+ dmail_sender.send_mail(*args)
35
+
36
+ def log(self):
37
+ return "SEND EMAIL"
38
+
39
+ def get_contract_class(self):
40
+ return DmailSend
41
+
42
+ def parse_params(self, module_params):
43
+ self.validate_supported_chain(module_params['chain'])
44
+
45
+ return (module_params['chain'],)
46
+
47
+ def order(self):
48
+ return Order.RANDOM
49
+
50
+ def repeats(self, module_params):
51
+ if self.repeat_conf not in module_params:
52
+ return 1
53
+ else:
54
+ return range(interval_to_int(module_params[self.repeat_conf]))
@@ -0,0 +1,42 @@
1
+ from loguru import logger
2
+ from sybil_engine.data.networks import get_chain_instance
3
+ from sybil_engine.domain.balance.tokens import Erc20Token
4
+ from sybil_engine.module.module import Order, Module
5
+ from sybil_engine.utils.accumulator import add_accumulator_balance
6
+ from sybil_engine.utils.web3_utils import init_web3
7
+
8
+ from web3_wizzard_lib.core.contract.dmail_send_mail import DmailSend
9
+
10
+
11
+ class Erc20BalanceModule(Module):
12
+ module_name = 'ERC20_BALANCE_MODULE'
13
+ module_config = 'erc20_balance'
14
+ allowed_chains = ['ZKSYNC', 'LINEA', 'SCROLL', 'MANTA', 'BASE']
15
+ cumulative_sum = 0
16
+
17
+ def execute(self, token_address, chain, account):
18
+ chain_instance = get_chain_instance(chain)
19
+ web3 = init_web3(chain_instance, account.proxy)
20
+
21
+ erc20_token = Erc20Token('LINEA', token_address, web3)
22
+
23
+ balance = erc20_token.balance(account)
24
+
25
+ self.cumulative_sum = self.cumulative_sum + balance.wei
26
+
27
+ logger.info(f"{account.address} balance is {balance}")
28
+ add_accumulator_balance("Total balance is", balance.wei)
29
+
30
+ def log(self):
31
+ return "ERC20 BALANCE"
32
+
33
+ def get_contract_class(self):
34
+ return DmailSend
35
+
36
+ def parse_params(self, module_params):
37
+ self.validate_supported_chain(module_params['chain'])
38
+
39
+ return module_params['token_address'], module_params['chain']
40
+
41
+ def order(self):
42
+ return Order.RANDOM