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,25 @@
1
+ from sybil_engine.data.contracts import get_contracts_for_chain
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 Module
5
+ from sybil_engine.utils.web3_utils import init_web3
6
+
7
+ from web3_wizzard_lib.core.contract.gmx_reward_router import GmxRewardRouter
8
+
9
+
10
+ class GMXRewardRouter(Module):
11
+ module_name = 'GMX_REWARD_ROUTER'
12
+ module_config = None
13
+
14
+ def execute(self, account, chain='ARBITRUM'):
15
+ chain_instance = get_chain_instance(chain)
16
+ web3 = init_web3(chain_instance, None)
17
+
18
+ contract_address = get_contracts_for_chain(chain_instance['chain'])['GMX_REWARD_ROUTER']
19
+ gmx_reward_router = GmxRewardRouter(contract_address, web3)
20
+
21
+ token = Erc20Token(chain, '0x1aDDD80E6039594eE970E5872D247bf0414C8903', web3)
22
+ gmx_reward_router.unstake_and_redeem(account, token.balance(account).wei)
23
+
24
+ def log(self):
25
+ return "GMX REWARD WITHDRAW"
File without changes
@@ -0,0 +1,212 @@
1
+ from loguru import logger
2
+ #from pyuseragents import random as random_ua
3
+ from requests import Session
4
+ from sybil_engine.utils.retry import retry
5
+
6
+
7
+ class IntractAPI:
8
+ def __init__(self, account):
9
+ self.account = account
10
+ self.session = Session()
11
+ self.session.headers['user-agent'] = random_ua()
12
+ if account.proxy is not None and account.proxy != '':
13
+ self.session.proxies.update({'http': account.proxy, 'https': account.proxy})
14
+ else:
15
+ logger.warning('You are not using proxy')
16
+
17
+ @retry(max_attempts=10, retry_interval={'from': 10, 'to': 20})
18
+ def intract_get_nonce(self, address: str):
19
+ payload = {'walletAddress': address}
20
+ url = 'https://api.intract.io/api/qv1/auth/generate-nonce'
21
+
22
+ self.session.headers.clear()
23
+ r = self.session.post(url, json=payload)
24
+
25
+ if r.json().get('success') == True:
26
+ return r.json()['data']['nonce']
27
+ else:
28
+ logger.debug(f'nonce intract response: {r.status_code} {r.reason} | {r.text}')
29
+ raise Exception(f'Couldnt generate nonce for Intract')
30
+
31
+ @retry(max_attempts=10, retry_interval={'from': 10, 'to': 20})
32
+ def intract_login(self, address: str, signature: str):
33
+ payload = {
34
+ "signature": signature,
35
+ "userAddress": address,
36
+ "chain": {"id": 59144, "name": "Linea", "network": "Linea",
37
+ "nativeCurrency": {"decimals": 18, "name": "Ether", "symbol": "ETH"},
38
+ "rpcUrls": {"public": {"http": ["https://linea.drpc.org"]}, "default": {
39
+ "http": ["https://linea-mainnet.infura.io/v3/bfc263a4f3cf49998641d16c24fd0b46"]}},
40
+ "blockExplorers": {"etherscan": {"name": "Lineascan", "url": "https://lineascan.build/"},
41
+ "default": {"name": "Lineascan", "url": "https://lineascan.build/"}},
42
+ "unsupported": False},
43
+ "isTaskLogin": False,
44
+ "width": "590px",
45
+ "reAuth": False,
46
+ "connector": "metamask",
47
+ "referralCode": None,
48
+ "referralLink": None,
49
+ "referralSource": None
50
+ }
51
+ url = 'https://api.intract.io/api/qv1/auth/wallet'
52
+
53
+ r = self.session.post(url, json=payload)
54
+
55
+ if r.json().get('isEVMLoggedIn') == True:
56
+ self.user_id = self.get_user()['_id']
57
+
58
+ self.session.headers.update({
59
+ 'Cookies': r.headers["Set-Cookie"].split(';')[0],
60
+ 'Questuserid': self.user_id,
61
+ })
62
+ return True
63
+ else:
64
+ logger.debug(f'login intract response: {r.status_code} {r.reason} | {r.text}')
65
+ raise Exception(f'Couldnt login Intract')
66
+
67
+ @retry(max_attempts=10, retry_interval={'from': 10, 'to': 20})
68
+ def intract_get_tasks(self, compaignID):
69
+ self.active_tasks = []
70
+
71
+ url = f'https://api.intract.io/api/qv1/campaign/{compaignID}'
72
+ r = self.session.get(url)
73
+
74
+ wave = r.json()
75
+ # for wave in r.json():
76
+ if wave["status"] == 'ACTIVE' and wave.get('locked') != True: self.active_tasks.append(wave["name"])
77
+
78
+ @retry(max_attempts=10, retry_interval={'from': 10, 'to': 20})
79
+ def set_wallet(self, address: str):
80
+ try:
81
+ if self.get_user().get('lineaWalletAddress'):
82
+ return True
83
+
84
+ payload = {
85
+ "userId": self.user_id,
86
+ "lineaWalletAddress": address
87
+ }
88
+ url = 'https://api.intract.io/api/qv1/linea/user/set-wallet'
89
+ r = self.session.post(url, json=payload)
90
+
91
+ if r.json().get('message') == "Linea wallet address updated successfully":
92
+ logger.info(f'Wallet successfully linked')
93
+ return True
94
+ except Exception as err:
95
+ raise Exception(f'Couldnt set wallet: {err} | {r.text}')
96
+
97
+ @retry(max_attempts=10, retry_interval={'from': 10, 'to': 20})
98
+ def intract_streak(self):
99
+ try:
100
+ url = 'https://api.intract.io/api/qv1/linea/user/streak'
101
+ r = self.session.post(url, json={})
102
+
103
+ streakCount = r.json().get('streakCount')
104
+ isFirstTimeMarked = r.json().get('isFirstTimeMarked')
105
+
106
+ if streakCount:
107
+ logger.info(f'New GM streak: {streakCount + 1}')
108
+ elif isFirstTimeMarked:
109
+ logger.info(f'New GM streak: 1')
110
+ elif 'Linea streak already done for today' in r.text:
111
+ logger.info(f'New GM streak: already did streak today')
112
+ else:
113
+ raise Exception(f'bad response {r.status_code} {r.reason}')
114
+ except Exception as err:
115
+ if 'Internal server error' in r.text:
116
+ logger.error(f'Couldnt use GM streak')
117
+ else:
118
+ logger.error(f'Couldnt post streak: {err} | {r.text}')
119
+
120
+ @retry(max_attempts=10, retry_interval={'from': 10, 'to': 20})
121
+ def get_user(self):
122
+ try:
123
+ url = 'https://api.intract.io/api/qv1/auth/get-user?projectId=660c1fa77851c55d93a1c0e0'
124
+ r = self.session.get(url)
125
+ return r.json()
126
+
127
+ except Exception as err:
128
+ raise Exception(f'Couldnt get user: {err} | {r.text}')
129
+
130
+ @retry(max_attempts=10, retry_interval={'from': 10, 'to': 20})
131
+ def get_super_user(self):
132
+ try:
133
+ # self.intract_streak()
134
+
135
+ url = 'https://api.intract.io/api/qv1/auth/get-super-user'
136
+ r = self.session.get(url)
137
+
138
+ return {
139
+ 'achieves': len(r.json().get('badges')),
140
+ 'streak': r.json().get('gmStreak')['streakCount'],
141
+ 'gems': r.json().get('totalGems'),
142
+ 'xp': r.json().get('totalXp'),
143
+ 'super_user_id': r.json().get('_id'),
144
+ }
145
+
146
+ except Exception as err:
147
+ raise Exception(f'Couldnt get super user: {err} | {r.text}')
148
+
149
+ @retry(max_attempts=10, retry_interval={'from': 10, 'to': 20})
150
+ def claim_achievements(self):
151
+ try:
152
+ url = 'https://api.intract.io/api/qv1/achievement/init'
153
+ r = self.session.post(url)
154
+
155
+ for achieve in r.json():
156
+ if achieve["isClaimed"] == False and achieve["isCompleted"] == True:
157
+ try:
158
+ payload = {
159
+ "achievementIds": [achieve["achievementId"]]
160
+ }
161
+ url = 'https://api.intract.io/api/qv1/achievement/claim'
162
+ r = self.session.post(url, json=payload)
163
+
164
+ if 'User achievement reward already claimed' in r.text or 'User achievement not found' in r.text:
165
+ pass
166
+ else:
167
+ logger.info(f'Claimed achievement: {r.json()[0]["name"]}')
168
+ except Exception as err:
169
+ logger.error(
170
+ f'Claim achievement {achieve["achievementId"]} {achieve["name"]} error: {err} | {r.text}')
171
+
172
+ except Exception as err:
173
+ logger.error(f'Couldnt fetch achievements: {err} | {r.text}')
174
+
175
+ @retry(max_attempts=10, retry_interval={'from': 10, 'to': 20})
176
+ def activate_journey(self, campaign_id: str):
177
+ url = f'https://api.intract.io/api/qv1/journey/fetch?campaignId={campaign_id}&channelCode=DEFAULT&referralCode=null'
178
+
179
+ r = self.session.get(url)
180
+ if r.json().get('isActive') != True:
181
+ logger.error(f'Activate journey error: {r.text}')
182
+
183
+ return r.json()
184
+
185
+ @retry(max_attempts=10, retry_interval={'from': 10, 'to': 20})
186
+ def verify_quest(self, task):
187
+ data = {
188
+ "campaignId": task['campaignId'],
189
+ "userInputs": {},
190
+ "userVerificationData": {},
191
+ "taskId": task['_id']
192
+ }
193
+
194
+ headers = {
195
+ 'questuserid': self.session.headers['Questuserid'],
196
+ 'authorization': f'Bearer {self.session.headers["Cookies"].split('=')[1]}'
197
+ }
198
+
199
+ url = 'https://api.intract.io/api/qv1/task/verify-v2'
200
+ r = self.session.post(url, json=data, headers=headers)
201
+
202
+ logger.info(r.json())
203
+
204
+ if r.json()['verified'] == 'False':
205
+ raise Exception("Quest wasn't verified")
206
+
207
+ return r.status_code
208
+
209
+ def set_primary_task_identity(self, account):
210
+ url = 'https://api.intract.io/api/qv1/auth/set-primary-task-identity'
211
+ payload = {"identity": account.address, "namespaceTag": "EVM"}
212
+ r = self.session.post(url, json=payload)
@@ -0,0 +1,81 @@
1
+ from inspect import getsourcefile
2
+ from random import randint
3
+ from requests import post
4
+ from loguru import logger
5
+ from time import sleep
6
+ from tqdm import tqdm
7
+ import sys
8
+ import ctypes
9
+ import os
10
+ sys.__stdout__ = sys.stdout
11
+
12
+ TG_BOT_TOKEN = '' # токен от тг бота (`12345:Abcde`) для уведомлений. если не нужно - оставляй пустым
13
+ TG_USER_ID = [] # тг айди куда должны приходить уведомления. [21957123] - для отправления уведомления только себе, [21957123, 103514123] - отправлять нескольким людями
14
+
15
+ windll = ctypes.windll if os.name == 'nt' else None # for Mac users
16
+
17
+
18
+ class WindowName:
19
+ def __init__(self):
20
+ try: self.path = os.path.abspath(getsourcefile(lambda: 0)).split("\\")[-2]
21
+ except: self.path = os.path.abspath(getsourcefile(lambda: 0)).split("/")[-2]
22
+
23
+ self.accs_done = 0
24
+ self.modules_amount = 0
25
+ self.modules_done = 0
26
+
27
+ def update_accs(self):
28
+ self.accs_done += 1
29
+ self.modules_amount = 0
30
+ self.modules_done = 0
31
+
32
+ def update_modules(self):
33
+ self.modules_done += 1
34
+
35
+ def set_modules(self, modules_amount: int):
36
+ self.modules_amount = modules_amount
37
+
38
+
39
+ class TgReport:
40
+ def __init__(self):
41
+ self.logs = ''
42
+
43
+
44
+ def update_logs(self, text: str):
45
+ self.logs += f'{text}\n'
46
+
47
+
48
+ def send_log(self, wallet, window_name, mode: str):
49
+ notification_text = f'[{window_name.accs_done}/{window_name.accs_amount}] <i>{wallet.address}</i>\n\n' \
50
+ f'{self.logs}\n'
51
+ if mode == 'Claim quests': notification_text += f'{wallet.stats.get("status")}'
52
+
53
+ texts = []
54
+ while len(notification_text) > 0:
55
+ texts.append(notification_text[:1900])
56
+ notification_text = notification_text[1900:]
57
+
58
+ if TG_BOT_TOKEN:
59
+ for tg_id in TG_USER_ID:
60
+ for text in texts:
61
+ try: post(f'https://api.telegram.org/bot{TG_BOT_TOKEN}/sendMessage?parse_mode=html&chat_id={tg_id}&text={text}')
62
+ except Exception as err: logger.error(f'[-] TG | Send Telegram message error to {tg_id}: {err}')
63
+
64
+
65
+ def sleeping(*timing):
66
+ if type(timing[0]) == list: timing = timing[0]
67
+ if len(timing) == 2: x = randint(timing[0], timing[1])
68
+ else: x = timing[0]
69
+ for _ in tqdm(range(x), desc='sleep ', bar_format='{desc}: {n_fmt}/{total_fmt}'):
70
+ sleep(1)
71
+
72
+
73
+ def make_text_border(text: str):
74
+ new_text = ''
75
+ max_len = max([len(string) for string in text.split('\n')])
76
+
77
+ new_text += '+' + '-' * (max_len + 8) + '+\n'
78
+ for string in text.split('\n'): new_text += f'\t{string}\n'
79
+ new_text += '+' + '-' * (max_len + 8) + '+\n'
80
+
81
+ return new_text
@@ -0,0 +1,101 @@
1
+ from eth_account.messages import encode_defunct
2
+ from loguru import logger
3
+ from sybil_engine.data.networks import get_chain_instance
4
+ from sybil_engine.module.module import Module
5
+ from sybil_engine.utils.file_loader import load_abi
6
+ from sybil_engine.utils.utils import AccountException
7
+ from sybil_engine.utils.web3_utils import init_web3
8
+
9
+ from web3_wizzard_lib.core.modules.intract.intract_api import IntractAPI
10
+ from web3_wizzard_lib.core.modules.intract.utils import TgReport, WindowName, make_text_border
11
+
12
+ VERIFY_DATA = load_abi("resources/verify_data.json")
13
+
14
+ class IntractClaim(Module):
15
+ module_name = 'INTRACT_CLAIM'
16
+ module_config = None
17
+
18
+ def execute(self, task_id, account, compaign_id='66bb5618c8ff56cba848ea8f', from_chain='LINEA'):
19
+ windowname = WindowName()
20
+
21
+ intract_api = IntractAPI(account)
22
+ tg_report = TgReport()
23
+ windowname.update_accs()
24
+
25
+ stats = {}
26
+
27
+ web3 = init_web3(get_chain_instance(from_chain), None)
28
+
29
+ self.authorize(intract_api, compaign_id, account, web3)
30
+
31
+ campaign_funcs = {
32
+ "Linea LXP Latest Rush": self.linea_lxp,
33
+ }
34
+ intract_api.set_primary_task_identity(account)
35
+ intract_api.activate_journey(compaign_id)
36
+ linea_xp = intract_api.get_user().get("totalXp") or "0"
37
+
38
+ if task_id == 'SKIP_CHECK':
39
+ if int(linea_xp) == 100:
40
+ raise AccountException("Skip account tasks where already claimed")
41
+ else:
42
+ return
43
+
44
+ for task in intract_api.active_tasks:
45
+ if task in list(campaign_funcs.keys()):
46
+ campaign_funcs[task](task, task_id, intract_api)
47
+ else:
48
+ logger.info(f' > Task "{task}" will appear soon...')
49
+
50
+ account_data = intract_api.get_super_user()
51
+ linea_xp = intract_api.get_user().get("totalXp") or "0"
52
+
53
+ logger.info('') # for clearly logs
54
+ tg_report.update_logs('<i>Statistics</i>')
55
+ logger.info('')
56
+ text = f'Achievements: {account_data["achieves"]}\n' \
57
+ f'GM Streak: {account_data["streak"]}\n' \
58
+ f'Gems: {account_data["gems"]}\n' \
59
+ f'XP: {account_data["xp"]}\n' \
60
+ f'Linea XP: {linea_xp}'
61
+ new_text = make_text_border(text=text)
62
+ for string in new_text.split('\n'): logger.success(string)
63
+
64
+ stats.update({
65
+ 'linea_xp': linea_xp,
66
+ 'xp': account_data["xp"],
67
+ 'gm_streak': account_data["streak"],
68
+ 'achievements': account_data["achieves"],
69
+ 'gems': account_data["gems"],
70
+ })
71
+
72
+ def authorize(self, browser, compaign_id, account, web3):
73
+ nonce = browser.intract_get_nonce(address=account.address)
74
+ text = f'Nonce: {nonce}'
75
+ signature = f'0x{web3.eth.account.sign_message(encode_defunct(text=text), private_key=account.key).signature.hex()}'
76
+ browser.intract_login(address=account.address, signature=signature)
77
+ browser.intract_get_tasks(compaign_id)
78
+
79
+ browser.set_wallet(address=account.address)
80
+ #browser.claim_achievements()
81
+
82
+ def linea_lxp(self, task_name: str, task_id, intract_api, week=0):
83
+ logger.info(f' > Completing "{task_name}"...')
84
+
85
+ for task in VERIFY_DATA['campaigns'][str(week)]['quest']['tasks']:
86
+ if task_id is not None:
87
+ if task['_id'] == task_id:
88
+ intract_api.verify_quest(task)
89
+ else:
90
+ intract_api.verify_quest(task)
91
+
92
+ def log(self):
93
+ return "INTRACT CLAIM"
94
+
95
+ def parse_params(self, module_params):
96
+ if 'taskID' not in module_params:
97
+ module_params['taskID'] = None
98
+
99
+ return [
100
+ module_params['taskID']
101
+ ]
@@ -0,0 +1,65 @@
1
+ import random
2
+
3
+ from loguru import logger
4
+ from sybil_engine.contract.send import Send
5
+ from sybil_engine.data.contracts import get_contracts_for_chain
6
+ from sybil_engine.data.networks import get_chain_instance
7
+ from sybil_engine.domain.balance.balance import NativeBalance
8
+ from sybil_engine.domain.balance.balance_utils import get_native_balance
9
+ from sybil_engine.module.module import Order, RepeatableModule
10
+ from sybil_engine.utils.utils import interval_to_int, ConfigurationException
11
+ from sybil_engine.utils.web3_utils import init_web3
12
+
13
+ from web3_wizzard_lib.core.modules.bridge.orbiter_sub import bridge_codes
14
+
15
+
16
+ class Layer2_20(RepeatableModule):
17
+ module_name = 'Layer2_20'
18
+ allowed_chains = ['ZKSYNC', 'OPTIMISM', 'BASE', 'LINEA', 'ARBITRUM', 'SCROLL']
19
+ random_order = Order.RANDOM
20
+ repeat_conf = 'repeats'
21
+ module_config = 'layer_2_20_config'
22
+
23
+ @RepeatableModule.repeatable_log
24
+ def execute(self, chains, to_chains, account):
25
+ chain = random.choice(chains)
26
+ chain_instance = get_chain_instance(chain)
27
+ web3 = init_web3(chain_instance, account.proxy)
28
+
29
+ temp_to_chains = [item for item in to_chains if item != chain]
30
+ if not temp_to_chains:
31
+ raise ConfigurationException("No chains to send to")
32
+ to_chain = random.choice(temp_to_chains)
33
+
34
+ layer2_20_contract_address = get_contracts_for_chain(chain)["LAYER2_20"]
35
+
36
+ send = Send(layer2_20_contract_address, web3)
37
+
38
+ amount_to_send = NativeBalance(
39
+ 230000000000000 + bridge_codes[to_chain],
40
+ chain,
41
+ chain_instance['gas_token']
42
+ )
43
+ data = '0x646174613a2c7b2270223a226c61796572322d3230222c226f70223a22636c61696d222c227469636b223a22244c32222c22616d74223a2231303030227d'
44
+
45
+ native_balance = get_native_balance(account, web3, chain_instance)
46
+
47
+ logger.info(f"Native {chain} balance: " + str(native_balance))
48
+ logger.info(f"Inscription {chain} -> {to_chain} | {amount_to_send}")
49
+
50
+ send.send_to_wallet(account, layer2_20_contract_address, amount_to_send, data)
51
+
52
+ def log(self):
53
+ return "LAYER2_20"
54
+
55
+ def parse_params(self, module_params):
56
+ return module_params['chains'], module_params['to_chains']
57
+
58
+ def order(self):
59
+ return Order.RANDOM
60
+
61
+ def repeats(self, module_params):
62
+ if self.repeat_conf not in module_params:
63
+ return 1
64
+ else:
65
+ return range(interval_to_int(module_params[self.repeat_conf]))
@@ -0,0 +1,134 @@
1
+ import random
2
+
3
+ from loguru import logger
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.domain.balance.balance import NativeBalance
7
+ from sybil_engine.domain.balance.balance_utils import interval_to_eth_balance, from_eth_to_wei, verify_balance
8
+ from sybil_engine.module.module import Order, RepeatableModule
9
+ from sybil_engine.utils.app_account_utils import AppAccount
10
+ from sybil_engine.utils.utils import ConfigurationException, interval_to_round
11
+ from sybil_engine.utils.validation_utils import validate_amount_interval, validate_interval
12
+ from sybil_engine.utils.web3_utils import init_web3
13
+
14
+ from web3_wizzard_lib.core.contract.basiliskcontract import BasiliskContract
15
+ from web3_wizzard_lib.core.contract.eralendcontract import EraLendContract
16
+ from web3_wizzard_lib.core.contract.reactor_fusion_contract import ReactorFusionContract
17
+ from web3_wizzard_lib.core.modules.bank.layerbank import LayerBank
18
+ from web3_wizzard_lib.core.modules.bank.aave import Aave
19
+
20
+
21
+ class Lending(RepeatableModule):
22
+ module_name = 'LENDING'
23
+ module_config = 'lending_config'
24
+ random_order = Order.RANDOM
25
+
26
+ @RepeatableModule.repeatable_log
27
+ def execute(self, lending_apps, amount: float, action: str, withdraw_sleep_interval: dict, chain,
28
+ account: AppAccount):
29
+ chain_instance = get_chain_instance(chain)
30
+ web3 = init_web3(chain_instance, account.proxy)
31
+
32
+ lending_app_name = random.choice(lending_apps)
33
+ lending_app = self.get_lending_app(lending_app_name, chain, web3)
34
+
35
+ verify_balance(self.min_native_balance, chain_instance, account, web3)
36
+
37
+ if action == 'DEPOSIT':
38
+ self.deposit(account, amount, lending_app, lending_app_name, chain, web3)
39
+ elif action == 'WITHDRAW':
40
+ self.withdraw(account, amount, chain, lending_app, lending_app_name)
41
+ elif action == 'WITHDRAW_ALL':
42
+ for app_name, app in self.lending_apps_with_deposit(account, chain, web3):
43
+ self.withdraw(account, amount, chain, app, app_name)
44
+ else:
45
+ raise ConfigurationException("Unsupported action")
46
+
47
+ def deposit(self, account, amount, lending_app, lending_app_name, chain, web3):
48
+ amount_balance = interval_to_eth_balance(amount, account, chain, web3)
49
+
50
+ if amount == 'all_balance':
51
+ amount_balance = amount_balance.minus(self.min_native_balance)
52
+
53
+ logger.info(f"Make deposit on {lending_app_name} | {amount_balance}")
54
+
55
+ lending_app.mint(account, amount_balance.wei)
56
+
57
+ def withdraw(self, account, amount, chain, lending_app, lending_app_name):
58
+ deposit_balance = NativeBalance(lending_app.get_deposit_amount(account), chain, 'ETH')
59
+
60
+ if deposit_balance.wei < 1000000000000:
61
+ raise EmptyDepositException(f"[{account.address}] Deposit balance is 0, skip")
62
+
63
+ logger.info(f"Deposit balance: {deposit_balance}")
64
+
65
+ if amount == 'all_balance':
66
+ withdraw_wei = deposit_balance.wei
67
+ else:
68
+ balance = NativeBalance(from_eth_to_wei(interval_to_round(amount)), chain, 'ETH')
69
+ amount_balance = NativeBalance(int(balance.wei // 10000) * 10000, chain, balance.token)
70
+ withdraw_wei = amount_balance.wei
71
+
72
+ if deposit_balance.wei < withdraw_wei:
73
+ logger.info(
74
+ f"Deposit {deposit_balance} < withdraw amount {amount_balance}"
75
+ f", withdrawing all deposit")
76
+ withdraw_wei = deposit_balance.wei
77
+
78
+ logger.info(f"Withdraw from {lending_app_name} | {deposit_balance}")
79
+
80
+ lending_app.redeem_underlying(account, withdraw_wei)
81
+
82
+ def get_lending_app(self, lending_app, chain, web3):
83
+ lending_apps = self.get_lending_apps(chain, web3)
84
+
85
+ if lending_app not in lending_apps.keys():
86
+ raise ConfigurationException(f"{lending_app} not supported in {chain}. Supported lending: {list(lending_apps.keys())} supported")
87
+
88
+ return lending_apps[lending_app]
89
+
90
+ def get_lending_apps(self, chain, web3):
91
+ contracts = get_contracts_for_chain(chain)
92
+
93
+ apps = {
94
+ 'BASILISK_LANDING': BasiliskContract,
95
+ 'REACTORFUSION_LANDING': ReactorFusionContract,
96
+ 'ERALEND': EraLendContract,
97
+ 'AAVE': Aave,
98
+ 'LAYERBANK': LayerBank
99
+ }
100
+
101
+ return {k: v(contracts[k], web3) for k, v in apps.items() if k in contracts}
102
+
103
+ def lending_apps_with_deposit(self, account, chain, web3):
104
+ with_deposit = []
105
+
106
+ for lending_app_name, lending_app in self.get_lending_apps(chain, web3).items():
107
+ if lending_app.get_deposit_amount(account) > 1000000000000:
108
+ with_deposit.append((lending_app_name, lending_app))
109
+
110
+ return with_deposit
111
+
112
+ def log(self):
113
+ return "LENDING"
114
+
115
+ def parse_params(self, module_params):
116
+ validate_amount_interval(module_params['amount'])
117
+ validate_interval(module_params['withdraw_sleep_interval'])
118
+
119
+ if 'chain' not in module_params:
120
+ module_params['chain'] = 'ZKSYNC'
121
+
122
+ return [
123
+ module_params['lending_apps'],
124
+ module_params['amount'],
125
+ module_params['action'],
126
+ module_params['withdraw_sleep_interval'],
127
+ module_params['chain']
128
+ ]
129
+
130
+
131
+ class EmptyDepositException(Exception):
132
+ def __init__(self, message):
133
+ self.message = message
134
+ super().__init__(self.message)