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.
- web3_wizzard_lib/core/__init__.py +1 -0
- web3_wizzard_lib/core/contract/__init__.py +0 -0
- web3_wizzard_lib/core/contract/aavecontract.py +36 -0
- web3_wizzard_lib/core/contract/alienswap_contract.py +21 -0
- web3_wizzard_lib/core/contract/arena_games_contract.py +16 -0
- web3_wizzard_lib/core/contract/basiliskcontract.py +58 -0
- web3_wizzard_lib/core/contract/bilinear_contract.py +22 -0
- web3_wizzard_lib/core/contract/bungee.py +33 -0
- web3_wizzard_lib/core/contract/coredao_contract.py +34 -0
- web3_wizzard_lib/core/contract/coredao_from_contract.py +40 -0
- web3_wizzard_lib/core/contract/dmail_send_mail.py +18 -0
- web3_wizzard_lib/core/contract/empty_nft.py +18 -0
- web3_wizzard_lib/core/contract/era_name.py +23 -0
- web3_wizzard_lib/core/contract/eralendcontract.py +34 -0
- web3_wizzard_lib/core/contract/eth_scroll_bridge_contract.py +25 -0
- web3_wizzard_lib/core/contract/frog_war_contract.py +48 -0
- web3_wizzard_lib/core/contract/gmx_reward_router.py +22 -0
- web3_wizzard_lib/core/contract/horizondex_quoter.py +14 -0
- web3_wizzard_lib/core/contract/horizondex_router.py +91 -0
- web3_wizzard_lib/core/contract/imagine_contract.py +18 -0
- web3_wizzard_lib/core/contract/izumi.py +63 -0
- web3_wizzard_lib/core/contract/kreatorland_contract.py +21 -0
- web3_wizzard_lib/core/contract/l0_claim.py +254 -0
- web3_wizzard_lib/core/contract/l2_telegraph.py +21 -0
- web3_wizzard_lib/core/contract/layerbank_price.py +18 -0
- web3_wizzard_lib/core/contract/layerbank_token.py +29 -0
- web3_wizzard_lib/core/contract/layerbankcontract.py +59 -0
- web3_wizzard_lib/core/contract/linea_day_2_contract.py +19 -0
- web3_wizzard_lib/core/contract/linea_day_3_contract.py +55 -0
- web3_wizzard_lib/core/contract/linea_ens_names_contract.py +55 -0
- web3_wizzard_lib/core/contract/lineaswaprouter.py +52 -0
- web3_wizzard_lib/core/contract/maverick_multicall.py +52 -0
- web3_wizzard_lib/core/contract/mendi_finance_contract.py +11 -0
- web3_wizzard_lib/core/contract/mendi_token.py +25 -0
- web3_wizzard_lib/core/contract/merkly_minter.py +47 -0
- web3_wizzard_lib/core/contract/micro3_contract.py +18 -0
- web3_wizzard_lib/core/contract/mute_router.py +93 -0
- web3_wizzard_lib/core/contract/new_rage_contract.py +31 -0
- web3_wizzard_lib/core/contract/nidum_contract.py +44 -0
- web3_wizzard_lib/core/contract/nile_contract.py +60 -0
- web3_wizzard_lib/core/contract/nomis_attest_contract.py +40 -0
- web3_wizzard_lib/core/contract/nomis_contract.py +40 -0
- web3_wizzard_lib/core/contract/octomos.py +31 -0
- web3_wizzard_lib/core/contract/odos.py +104 -0
- web3_wizzard_lib/core/contract/omnisea.py +29 -0
- web3_wizzard_lib/core/contract/orbiter_starknet.py +30 -0
- web3_wizzard_lib/core/contract/pancake_pool.py +19 -0
- web3_wizzard_lib/core/contract/pancake_quoter.py +20 -0
- web3_wizzard_lib/core/contract/pancake_router.py +72 -0
- web3_wizzard_lib/core/contract/rage_claim.py +24 -0
- web3_wizzard_lib/core/contract/reactor_fusion_contract.py +78 -0
- web3_wizzard_lib/core/contract/readon_contract.py +19 -0
- web3_wizzard_lib/core/contract/rubyscore_contract.py +31 -0
- web3_wizzard_lib/core/contract/satoshi_universe_contract.py +29 -0
- web3_wizzard_lib/core/contract/scroll_bridge_contract.py +24 -0
- web3_wizzard_lib/core/contract/scroll_canvas_mint_contract.py +26 -0
- web3_wizzard_lib/core/contract/scroll_oracle.py +11 -0
- web3_wizzard_lib/core/contract/snap_contract.py +16 -0
- web3_wizzard_lib/core/contract/social_scan_contract.py +20 -0
- web3_wizzard_lib/core/contract/stargate_farming.py +37 -0
- web3_wizzard_lib/core/contract/stargate_router.py +84 -0
- web3_wizzard_lib/core/contract/stargate_router_eth.py +41 -0
- web3_wizzard_lib/core/contract/stargate_token_pool.py +45 -0
- web3_wizzard_lib/core/contract/stargate_v2_contract.py +36 -0
- web3_wizzard_lib/core/contract/syncswap_classic_pool.py +15 -0
- web3_wizzard_lib/core/contract/syncswap_classic_pool_factory.py +15 -0
- web3_wizzard_lib/core/contract/syncswap_pool.py +25 -0
- web3_wizzard_lib/core/contract/syncswap_router.py +123 -0
- web3_wizzard_lib/core/contract/tavaera_id.py +18 -0
- web3_wizzard_lib/core/contract/tavaera_mint.py +17 -0
- web3_wizzard_lib/core/contract/townstory_bonus_contract.py +19 -0
- web3_wizzard_lib/core/contract/townstory_contract.py +21 -0
- web3_wizzard_lib/core/contract/velocore_lens.py +44 -0
- web3_wizzard_lib/core/contract/velocore_pool.py +198 -0
- web3_wizzard_lib/core/contract/velocore_router.py +80 -0
- web3_wizzard_lib/core/contract/woofi_swap.py +29 -0
- web3_wizzard_lib/core/contract/xy_finance_contract.py +87 -0
- web3_wizzard_lib/core/contract/yoddlo_contract.py +19 -0
- web3_wizzard_lib/core/contract/yuliverse_contract.py +36 -0
- web3_wizzard_lib/core/contract/zebra_contract.py +68 -0
- web3_wizzard_lib/core/contract/zerolend_contract.py +34 -0
- web3_wizzard_lib/core/contract/zerolend_liq_contract.py +20 -0
- web3_wizzard_lib/core/contract/zkdx_contract.py +40 -0
- web3_wizzard_lib/core/contract/zkdx_data.py +14 -0
- web3_wizzard_lib/core/contract/zks.py +24 -0
- web3_wizzard_lib/core/modules/__init__.py +0 -0
- web3_wizzard_lib/core/modules/ads_import_proxy.py +52 -0
- web3_wizzard_lib/core/modules/airdrop_printer.py +81 -0
- web3_wizzard_lib/core/modules/bank/__init__.py +0 -0
- web3_wizzard_lib/core/modules/bank/aave.py +25 -0
- web3_wizzard_lib/core/modules/bank/bank.py +15 -0
- web3_wizzard_lib/core/modules/bank/basilisk.py +25 -0
- web3_wizzard_lib/core/modules/bank/eralend.py +25 -0
- web3_wizzard_lib/core/modules/bank/layerbank.py +116 -0
- web3_wizzard_lib/core/modules/bank/mendi_finance.py +57 -0
- web3_wizzard_lib/core/modules/bank/reactorfusion.py +25 -0
- web3_wizzard_lib/core/modules/bank/zerolend.py +36 -0
- web3_wizzard_lib/core/modules/bank_module.py +99 -0
- web3_wizzard_lib/core/modules/bridge/__init__.py +0 -0
- web3_wizzard_lib/core/modules/bridge/bridge.py +8 -0
- web3_wizzard_lib/core/modules/bridge/coredao_bridge_sub.py +47 -0
- web3_wizzard_lib/core/modules/bridge/orbiter_sub.py +112 -0
- web3_wizzard_lib/core/modules/bridge/scroll_bridge_sub.py +42 -0
- web3_wizzard_lib/core/modules/bridge/stargate_v2_sub.py +74 -0
- web3_wizzard_lib/core/modules/bridge_module.py +47 -0
- web3_wizzard_lib/core/modules/bungee.py +109 -0
- web3_wizzard_lib/core/modules/cex_sender.py +60 -0
- web3_wizzard_lib/core/modules/cex_subaccount_transfer.py +34 -0
- web3_wizzard_lib/core/modules/cex_withdraw.py +91 -0
- web3_wizzard_lib/core/modules/claimer.py +45 -0
- web3_wizzard_lib/core/modules/claims/__init__.py +0 -0
- web3_wizzard_lib/core/modules/claims/layerzero_claimer.py +64 -0
- web3_wizzard_lib/core/modules/claims/rabby_claimer.py +81 -0
- web3_wizzard_lib/core/modules/concrete_swap.py +108 -0
- web3_wizzard_lib/core/modules/coredao_bridge.py +32 -0
- web3_wizzard_lib/core/modules/coredao_bridge_auto.py +39 -0
- web3_wizzard_lib/core/modules/debank_checker.py +78 -0
- web3_wizzard_lib/core/modules/dmail.py +54 -0
- web3_wizzard_lib/core/modules/erc20_balance.py +42 -0
- web3_wizzard_lib/core/modules/gmx_reward.py +25 -0
- web3_wizzard_lib/core/modules/intract/__init__.py +0 -0
- web3_wizzard_lib/core/modules/intract/intract_api.py +212 -0
- web3_wizzard_lib/core/modules/intract/utils.py +81 -0
- web3_wizzard_lib/core/modules/intract_claim.py +101 -0
- web3_wizzard_lib/core/modules/layer_2_20.py +65 -0
- web3_wizzard_lib/core/modules/lending_module.py +134 -0
- web3_wizzard_lib/core/modules/linea_appeal.py +98 -0
- web3_wizzard_lib/core/modules/linea_poh_lxp.py +65 -0
- web3_wizzard_lib/core/modules/liquidity/__init__.py +0 -0
- web3_wizzard_lib/core/modules/liquidity/nile_pool.py +64 -0
- web3_wizzard_lib/core/modules/liquidity/pool.py +16 -0
- web3_wizzard_lib/core/modules/liquidity/syncswap_pool.py +61 -0
- web3_wizzard_lib/core/modules/liquidity/velocore_pool.py +55 -0
- web3_wizzard_lib/core/modules/liquidity/zerolend_liquidity.py +26 -0
- web3_wizzard_lib/core/modules/liquidity_pool.py +60 -0
- web3_wizzard_lib/core/modules/merkly_refuel.py +87 -0
- web3_wizzard_lib/core/modules/new_rage_withdraw.py +41 -0
- web3_wizzard_lib/core/modules/nft/__init__.py +0 -0
- web3_wizzard_lib/core/modules/nft/abbys_world.py +22 -0
- web3_wizzard_lib/core/modules/nft/acg_worlds.py +25 -0
- web3_wizzard_lib/core/modules/nft/alienswap_linea.py +22 -0
- web3_wizzard_lib/core/modules/nft/arena_games.py +22 -0
- web3_wizzard_lib/core/modules/nft/asmatch.py +22 -0
- web3_wizzard_lib/core/modules/nft/battlemon.py +25 -0
- web3_wizzard_lib/core/modules/nft/bilinear.py +22 -0
- web3_wizzard_lib/core/modules/nft/bitavatar.py +25 -0
- web3_wizzard_lib/core/modules/nft/culture_satoshi_universe.py +24 -0
- web3_wizzard_lib/core/modules/nft/efrogs.py +26 -0
- web3_wizzard_lib/core/modules/nft/empty_nft.py +22 -0
- web3_wizzard_lib/core/modules/nft/era_domain.py +42 -0
- web3_wizzard_lib/core/modules/nft/frog_war.py +22 -0
- web3_wizzard_lib/core/modules/nft/frog_war_bonus.py +22 -0
- web3_wizzard_lib/core/modules/nft/gamerboom.py +25 -0
- web3_wizzard_lib/core/modules/nft/gamerboom_bonus.py +26 -0
- web3_wizzard_lib/core/modules/nft/imagine.py +32 -0
- web3_wizzard_lib/core/modules/nft/kreatorland_module.py +35 -0
- web3_wizzard_lib/core/modules/nft/l2_telegraph_module.py +22 -0
- web3_wizzard_lib/core/modules/nft/layer3_meta.py +25 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_2_2_linus.py +24 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_2_3_yooldo.py +24 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_2_4_frogwar.py +24 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_2_5_acg.py +25 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_2_6_ascend_the_end.py +25 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_3_1_ascend_the_end.py +25 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_3_2_sending_me.py +25 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_3_3_townstory.py +25 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_3_4_daniele.py +25 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_3_5_demmortal.py +25 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_3_6_foxy.py +25 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_4_1_coop_records.py +60 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_4_2_borja_moskv.py +65 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_4_2_borja_moskv_approve.py +27 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_4_3_fruit.py +66 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_4_4_fruit_crux.py +67 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_4_5_forbidden_fruit.py +67 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_4_6_laurent.py +67 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_day2.py +20 -0
- web3_wizzard_lib/core/modules/nft/linea_culture_day3.py +20 -0
- web3_wizzard_lib/core/modules/nft/linea_ens_names.py +107 -0
- web3_wizzard_lib/core/modules/nft/lucky_cat.py +25 -0
- web3_wizzard_lib/core/modules/nft/merkly_minter_module.py +22 -0
- web3_wizzard_lib/core/modules/nft/micro3.py +23 -0
- web3_wizzard_lib/core/modules/nft/mint_2048.py +28 -0
- web3_wizzard_lib/core/modules/nft/nft_submodule.py +16 -0
- web3_wizzard_lib/core/modules/nft/nidum.py +87 -0
- web3_wizzard_lib/core/modules/nft/nidum_bonus.py +23 -0
- web3_wizzard_lib/core/modules/nft/nomis.py +64 -0
- web3_wizzard_lib/core/modules/nft/nomis_attest.py +66 -0
- web3_wizzard_lib/core/modules/nft/nouns.py +27 -0
- web3_wizzard_lib/core/modules/nft/octomos.py +32 -0
- web3_wizzard_lib/core/modules/nft/omnisea.py +33 -0
- web3_wizzard_lib/core/modules/nft/omnizone.py +25 -0
- web3_wizzard_lib/core/modules/nft/orbiter_claim.py +87 -0
- web3_wizzard_lib/core/modules/nft/readon.py +30 -0
- web3_wizzard_lib/core/modules/nft/rubyscore.py +45 -0
- web3_wizzard_lib/core/modules/nft/sarubol.py +22 -0
- web3_wizzard_lib/core/modules/nft/satoshi_universe.py +22 -0
- web3_wizzard_lib/core/modules/nft/scroll_canvas_attest_year_badge.py +35 -0
- web3_wizzard_lib/core/modules/nft/scroll_canvas_mint.py +51 -0
- web3_wizzard_lib/core/modules/nft/sign.py +32 -0
- web3_wizzard_lib/core/modules/nft/snap.py +25 -0
- web3_wizzard_lib/core/modules/nft/snap_bonus.py +31 -0
- web3_wizzard_lib/core/modules/nft/social_scan.py +22 -0
- web3_wizzard_lib/core/modules/nft/tavaera.py +30 -0
- web3_wizzard_lib/core/modules/nft/townstory.py +75 -0
- web3_wizzard_lib/core/modules/nft/townstory_bonus.py +45 -0
- web3_wizzard_lib/core/modules/nft/trusta_reputation.py +48 -0
- web3_wizzard_lib/core/modules/nft/trustaa_poh.py +49 -0
- web3_wizzard_lib/core/modules/nft/uber_poh.py +24 -0
- web3_wizzard_lib/core/modules/nft/wizards_of_linea.py +26 -0
- web3_wizzard_lib/core/modules/nft/yoddlo.py +22 -0
- web3_wizzard_lib/core/modules/nft/yuliverse.py +22 -0
- web3_wizzard_lib/core/modules/nft/zace.py +25 -0
- web3_wizzard_lib/core/modules/nft/zks_domain.py +41 -0
- web3_wizzard_lib/core/modules/nft_minter.py +107 -0
- web3_wizzard_lib/core/modules/orbiter.py +39 -0
- web3_wizzard_lib/core/modules/orbiter_checker.py +26 -0
- web3_wizzard_lib/core/modules/rage.py +54 -0
- web3_wizzard_lib/core/modules/scroll_bridge.py +45 -0
- web3_wizzard_lib/core/modules/sell_all.py +51 -0
- web3_wizzard_lib/core/modules/sleep_module.py +25 -0
- web3_wizzard_lib/core/modules/smart_contract_deployment.py +37 -0
- web3_wizzard_lib/core/modules/stargate/__init__.py +0 -0
- web3_wizzard_lib/core/modules/stargate/auto_bridge.py +91 -0
- web3_wizzard_lib/core/modules/stargate/bridge.py +38 -0
- web3_wizzard_lib/core/modules/stargate/bridge_eth.py +59 -0
- web3_wizzard_lib/core/modules/stargate/bridge_tokens.py +48 -0
- web3_wizzard_lib/core/modules/stargate/classic_bridge.py +34 -0
- web3_wizzard_lib/core/modules/stargate/farming.py +163 -0
- web3_wizzard_lib/core/modules/stargate/l0_data.py +10 -0
- web3_wizzard_lib/core/modules/stargate/pool.py +74 -0
- web3_wizzard_lib/core/modules/stargate/stargate_balance_utils.py +25 -0
- web3_wizzard_lib/core/modules/stargate/stargate_gas_checker.py +68 -0
- web3_wizzard_lib/core/modules/swap/__init__.py +1 -0
- web3_wizzard_lib/core/modules/swap/horizondex.py +38 -0
- web3_wizzard_lib/core/modules/swap/izumi.py +41 -0
- web3_wizzard_lib/core/modules/swap/lineaswap.py +34 -0
- web3_wizzard_lib/core/modules/swap/maverick.py +66 -0
- web3_wizzard_lib/core/modules/swap/mute.py +39 -0
- web3_wizzard_lib/core/modules/swap/odos.py +58 -0
- web3_wizzard_lib/core/modules/swap/one_inch.py +58 -0
- web3_wizzard_lib/core/modules/swap/pancake.py +41 -0
- web3_wizzard_lib/core/modules/swap/swap_list.py +11 -0
- web3_wizzard_lib/core/modules/swap/syncswap.py +62 -0
- web3_wizzard_lib/core/modules/swap/velocore.py +40 -0
- web3_wizzard_lib/core/modules/swap/woofi.py +38 -0
- web3_wizzard_lib/core/modules/swap/xy_finance.py +43 -0
- web3_wizzard_lib/core/modules/swap/zebra.py +32 -0
- web3_wizzard_lib/core/modules/warm_up.py +98 -0
- web3_wizzard_lib/core/modules/wrapping.py +74 -0
- web3_wizzard_lib/core/modules/zkdx.py +63 -0
- web3_wizzard_lib/core/utils/__init__.py +0 -0
- web3_wizzard_lib/core/utils/ai_utils.py +45 -0
- web3_wizzard_lib/core/utils/benchmark_utils.py +12 -0
- web3_wizzard_lib/core/utils/module_memory.py +28 -0
- web3_wizzard_lib/core/utils/statistic_utils.py +150 -0
- web3_wizzard_lib/core/utils/sub_module.py +8 -0
- web3_wizzard_lib/data/__init__.py +0 -0
- web3_wizzard_lib/data/config_default.py +52 -0
- web3_wizzard_lib/data/module_config_default.py +209 -0
- web3_wizzard_lib/utils/__init__.py +0 -0
- web3_wizzard_lib/utils/debank_utils.py +19 -0
- {web3_wizzard_lib-1.6.12.dist-info → web3_wizzard_lib-1.6.15.dist-info}/METADATA +2 -2
- web3_wizzard_lib-1.6.15.dist-info/RECORD +369 -0
- web3_wizzard_lib-1.6.12.dist-info/RECORD +0 -107
- {web3_wizzard_lib-1.6.12.dist-info → web3_wizzard_lib-1.6.15.dist-info}/WHEEL +0 -0
- {web3_wizzard_lib-1.6.12.dist-info → web3_wizzard_lib-1.6.15.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
from sybil_engine.contract.contract import Contract
|
2
|
+
from sybil_engine.contract.transaction_executor import evm_transaction
|
3
|
+
from sybil_engine.utils.file_loader import load_abi
|
4
|
+
|
5
|
+
abi = load_abi("resources/abi/yoddlo.json")
|
6
|
+
|
7
|
+
|
8
|
+
class YoddloContract(Contract):
|
9
|
+
def __init__(self, contract_address, web3):
|
10
|
+
super().__init__(contract_address, web3, abi)
|
11
|
+
|
12
|
+
@evm_transaction
|
13
|
+
def purchase(self, account):
|
14
|
+
txn_params = self.build_generic_data(account.address, True)
|
15
|
+
|
16
|
+
txn_params['value'] = 100000000000000
|
17
|
+
txn_params['data'] = '0xfb89f3b1'
|
18
|
+
|
19
|
+
return txn_params
|
@@ -0,0 +1,36 @@
|
|
1
|
+
from sybil_engine.contract.contract import Contract
|
2
|
+
from sybil_engine.contract.transaction_executor import evm_transaction
|
3
|
+
from sybil_engine.utils.file_loader import load_abi
|
4
|
+
|
5
|
+
abi = load_abi("resources/abi/yoddlo.json")
|
6
|
+
|
7
|
+
|
8
|
+
class YuliverseContract(Contract):
|
9
|
+
def __init__(self, contract_address, web3):
|
10
|
+
super().__init__(contract_address, web3, abi)
|
11
|
+
|
12
|
+
@evm_transaction
|
13
|
+
def purchase(self, account):
|
14
|
+
txn_params = self.build_generic_data(account.address, True)
|
15
|
+
|
16
|
+
function_selector = "0x064a181e"
|
17
|
+
|
18
|
+
# Example uint256 paramet er
|
19
|
+
varg0 = 123456789 # Make sure this is the value you intend to use
|
20
|
+
|
21
|
+
# Example bytes parameter (signature) - Ensure this is exactly 65 bytes
|
22
|
+
varg1 = b'Your65ByteSignatureHere' # This should be the actual signature bytes
|
23
|
+
|
24
|
+
# Encoding the transaction data
|
25
|
+
data = function_selector
|
26
|
+
data += varg0.to_bytes(32, byteorder='big').hex()
|
27
|
+
data += (32).to_bytes(32, byteorder='big').hex() # Offset for dynamic data
|
28
|
+
data += (65).to_bytes(32, byteorder='big').hex() # Length of the signature
|
29
|
+
data += varg1.hex()
|
30
|
+
|
31
|
+
print(data)
|
32
|
+
|
33
|
+
# Concatenate the selector and the encoded parameters
|
34
|
+
txn_params['data'] = data
|
35
|
+
|
36
|
+
return txn_params
|
@@ -0,0 +1,68 @@
|
|
1
|
+
import time
|
2
|
+
|
3
|
+
from sybil_engine.contract.contract import Contract
|
4
|
+
from sybil_engine.contract.transaction_executor import evm_transaction
|
5
|
+
from sybil_engine.utils.file_loader import load_abi
|
6
|
+
from web3 import Web3
|
7
|
+
|
8
|
+
abi = load_abi("resources/abi/zebra.json")
|
9
|
+
|
10
|
+
|
11
|
+
class ZebraContract(Contract):
|
12
|
+
def __init__(self, contract_address, web3):
|
13
|
+
super().__init__(contract_address, web3, abi)
|
14
|
+
|
15
|
+
def get_min_amount_out(self, amount, from_token: str, to_token: str):
|
16
|
+
min_amount_out = self.contract.functions.getAmountsOut(
|
17
|
+
amount.wei,
|
18
|
+
[
|
19
|
+
Web3.to_checksum_address(from_token),
|
20
|
+
Web3.to_checksum_address(to_token)
|
21
|
+
]
|
22
|
+
).call()
|
23
|
+
return min_amount_out[1]
|
24
|
+
|
25
|
+
@evm_transaction
|
26
|
+
def swap_to_token(self, account, amount, from_token: str, to_token: str, min_amount_out: int):
|
27
|
+
tx_data = self.build_generic_data(
|
28
|
+
account.address,
|
29
|
+
False
|
30
|
+
)
|
31
|
+
|
32
|
+
tx_data['value'] = amount.wei
|
33
|
+
|
34
|
+
deadline = int(time.time()) + 1000000
|
35
|
+
|
36
|
+
contract_txn = self.contract.functions.swapExactETHForTokens(
|
37
|
+
min_amount_out,
|
38
|
+
[
|
39
|
+
from_token,
|
40
|
+
to_token,
|
41
|
+
],
|
42
|
+
account.address,
|
43
|
+
deadline
|
44
|
+
).build_transaction(tx_data)
|
45
|
+
|
46
|
+
return contract_txn
|
47
|
+
|
48
|
+
@evm_transaction
|
49
|
+
def swap_to_eth(self, account, amount, from_token: str, to_token: str, min_amount_out: int):
|
50
|
+
tx_data = self.build_generic_data(
|
51
|
+
account.address,
|
52
|
+
False
|
53
|
+
)
|
54
|
+
|
55
|
+
deadline = int(time.time()) + 1000000
|
56
|
+
|
57
|
+
contract_txn = self.contract.functions.swapExactTokensForETH(
|
58
|
+
amount.wei,
|
59
|
+
min_amount_out,
|
60
|
+
[
|
61
|
+
from_token,
|
62
|
+
to_token,
|
63
|
+
],
|
64
|
+
account.address,
|
65
|
+
deadline
|
66
|
+
).build_transaction(tx_data)
|
67
|
+
|
68
|
+
return contract_txn
|
@@ -0,0 +1,34 @@
|
|
1
|
+
from sybil_engine.contract.contract import Contract
|
2
|
+
from sybil_engine.contract.transaction_executor import evm_transaction
|
3
|
+
from sybil_engine.utils.file_loader import load_abi
|
4
|
+
|
5
|
+
abi = load_abi("resources/abi/zerolend.json")
|
6
|
+
|
7
|
+
|
8
|
+
class ZeroLendContract(Contract):
|
9
|
+
def __init__(self, contract_address, web3):
|
10
|
+
super().__init__(contract_address, web3, abi)
|
11
|
+
|
12
|
+
@evm_transaction
|
13
|
+
def deposit_eth(self, account, amount):
|
14
|
+
sender = account.address
|
15
|
+
txn_params = self.build_generic_data(sender, False)
|
16
|
+
|
17
|
+
txn_params['value'] = amount
|
18
|
+
|
19
|
+
return self.contract.functions.depositETH(
|
20
|
+
'0x2f9bB73a8e98793e26Cb2F6C4ad037BDf1C6B269',
|
21
|
+
account.address,
|
22
|
+
0
|
23
|
+
).build_transaction(txn_params)
|
24
|
+
|
25
|
+
@evm_transaction
|
26
|
+
def withdraw_eth(self, account, amount):
|
27
|
+
sender = account.address
|
28
|
+
txn_params = self.build_generic_data(sender, False)
|
29
|
+
|
30
|
+
return self.contract.functions.withdrawETH(
|
31
|
+
'0x2f9bB73a8e98793e26Cb2F6C4ad037BDf1C6B269',
|
32
|
+
int(amount * 0.98),
|
33
|
+
account.address
|
34
|
+
).build_transaction(txn_params)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
from sybil_engine.contract.contract import Contract
|
2
|
+
from sybil_engine.contract.transaction_executor import evm_transaction
|
3
|
+
from sybil_engine.utils.file_loader import load_abi
|
4
|
+
|
5
|
+
abi = load_abi("resources/abi/zerolend_liquidity.json")
|
6
|
+
|
7
|
+
class ZeroLendLiqContract(Contract):
|
8
|
+
def __init__(self, contract_address, web3):
|
9
|
+
super().__init__(contract_address, web3, abi)
|
10
|
+
|
11
|
+
@evm_transaction
|
12
|
+
def create_lock(self, account, amount):
|
13
|
+
sender = account.address
|
14
|
+
txn_params = self.build_generic_data(sender, False)
|
15
|
+
|
16
|
+
return self.contract.functions.createLock(
|
17
|
+
int(amount.wei * 0.99),
|
18
|
+
31536000,
|
19
|
+
True
|
20
|
+
).build_transaction(txn_params)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
from sybil_engine.contract.contract import Contract
|
2
|
+
from sybil_engine.contract.transaction_executor import evm_transaction
|
3
|
+
from sybil_engine.utils.file_loader import load_abi
|
4
|
+
|
5
|
+
abi = load_abi("resources/abi/woofi.json")
|
6
|
+
|
7
|
+
|
8
|
+
class ZKDXContract(Contract):
|
9
|
+
def __init__(self, contract_address, web3):
|
10
|
+
super().__init__(contract_address, web3, abi)
|
11
|
+
self.zkdx_token = '176211869ca2b568f2a7d4ee941e073a821ee1ff'
|
12
|
+
|
13
|
+
@evm_transaction
|
14
|
+
def swap_to_zkdx(self, account, amount):
|
15
|
+
sender = account.address
|
16
|
+
txn_params = self.build_generic_data(sender, True)
|
17
|
+
|
18
|
+
amount_hex = self.decimal_to_hex_padded(amount.wei)
|
19
|
+
txn_params[
|
20
|
+
'data'] = f'0x045d0389000000000000000000000000{self.zkdx_token}00000000000000000000000000000000{amount_hex}'
|
21
|
+
|
22
|
+
return txn_params
|
23
|
+
|
24
|
+
@evm_transaction
|
25
|
+
def swap_from_zkdx(self, account, amount):
|
26
|
+
sender = account.address
|
27
|
+
txn_params = self.build_generic_data(sender, True)
|
28
|
+
|
29
|
+
amount_hex = self.decimal_to_hex_padded(amount)
|
30
|
+
|
31
|
+
# txn_params['gas'] = 60000
|
32
|
+
|
33
|
+
txn_params[
|
34
|
+
'data'] = f'0x1e9a6950000000000000000000000000{self.zkdx_token}00000000000000000000000000000000{amount_hex}'
|
35
|
+
|
36
|
+
return txn_params
|
37
|
+
|
38
|
+
def decimal_to_hex_padded(self, decimal_number):
|
39
|
+
hex_number = hex(decimal_number)[2:] # Remove the '0x' prefix
|
40
|
+
return hex_number.zfill(32) # Pad with zeros to make the length 32
|
@@ -0,0 +1,14 @@
|
|
1
|
+
from sybil_engine.contract.contract import Contract
|
2
|
+
from sybil_engine.utils.file_loader import load_abi
|
3
|
+
|
4
|
+
abi = load_abi("resources/abi/zkdx_data.json")
|
5
|
+
|
6
|
+
|
7
|
+
class ZKDXDataContract(Contract):
|
8
|
+
def __init__(self, contract_address, web3):
|
9
|
+
super().__init__(contract_address, web3, abi)
|
10
|
+
# self.zkdx_token = '0x176211869cA2b568f2A7D4EE941E073a821EE1ff'
|
11
|
+
self.zkdx_token = '0x2167C4D5FE05A1250588F0B8AA83A599e7732eae'
|
12
|
+
|
13
|
+
def get_balance(self, account):
|
14
|
+
return self.contract.functions.getTokenBalances(account.address, [self.zkdx_token]).call()
|
@@ -0,0 +1,24 @@
|
|
1
|
+
from sybil_engine.contract.contract import Contract
|
2
|
+
from sybil_engine.contract.transaction_executor import evm_transaction
|
3
|
+
from sybil_engine.utils.file_loader import load_abi
|
4
|
+
|
5
|
+
abi = load_abi("resources/abi/zks.json")
|
6
|
+
|
7
|
+
|
8
|
+
class ZKS(Contract):
|
9
|
+
def __init__(self, contract_address, web3):
|
10
|
+
super().__init__(contract_address, web3, abi)
|
11
|
+
|
12
|
+
@evm_transaction
|
13
|
+
def register(self, account, domain_name):
|
14
|
+
sender = account.address
|
15
|
+
|
16
|
+
txn_params = self.build_generic_data(sender, False)
|
17
|
+
|
18
|
+
contract_txn = self.contract.functions.register(domain_name, sender, 1).build_transaction(txn_params)
|
19
|
+
contract_txn['gas'] = self.web3.eth.estimate_gas(contract_txn)
|
20
|
+
|
21
|
+
return contract_txn
|
22
|
+
|
23
|
+
def available(self, domain_name):
|
24
|
+
return self.contract.functions.available(domain_name).call()
|
File without changes
|
@@ -0,0 +1,52 @@
|
|
1
|
+
from urllib.parse import urlparse
|
2
|
+
|
3
|
+
from loguru import logger
|
4
|
+
from sybil_engine.module.module import Module
|
5
|
+
import requests
|
6
|
+
|
7
|
+
|
8
|
+
class AdsImportProxy(Module):
|
9
|
+
module_name = 'ADS_IMPORT_PROXY'
|
10
|
+
module_config = 'ads_import_config'
|
11
|
+
|
12
|
+
def execute(self, ads_url, account):
|
13
|
+
parsed_proxy = urlparse(account.proxy)
|
14
|
+
proxy_type = parsed_proxy.scheme
|
15
|
+
proxy_host = parsed_proxy.hostname
|
16
|
+
proxy_port = parsed_proxy.port
|
17
|
+
proxy_user = parsed_proxy.username
|
18
|
+
proxy_password = parsed_proxy.password
|
19
|
+
|
20
|
+
logger.info(f"Import proxy {account.proxy} for account {account.app_id}")
|
21
|
+
|
22
|
+
response = requests.get(f"{ads_url}/list", params={"serial_number": str(account.app_id)})
|
23
|
+
user_id = response.json()['data']['list'][0]["user_id"]
|
24
|
+
|
25
|
+
self.updateProfile(ads_url, user_id, proxy_host, proxy_password, proxy_port, proxy_type, proxy_user)
|
26
|
+
|
27
|
+
def updateProfile(self, ads_url, user_id, proxy_host, proxy_password, proxy_port, proxy_type, proxy_user):
|
28
|
+
data = {
|
29
|
+
"user_id": user_id,
|
30
|
+
"user_proxy_config": {
|
31
|
+
"proxy_type": proxy_type,
|
32
|
+
"proxy_host": proxy_host,
|
33
|
+
"proxy_port": str(proxy_port),
|
34
|
+
"proxy_user": proxy_user,
|
35
|
+
"proxy_password": proxy_password,
|
36
|
+
"proxy_soft": "luminati"
|
37
|
+
}
|
38
|
+
}
|
39
|
+
response = requests.post(f"{ads_url}/update", json=data)
|
40
|
+
logger.info(response.status_code)
|
41
|
+
logger.info(response.json())
|
42
|
+
|
43
|
+
def log(self):
|
44
|
+
return "ADS IMPORT PROXY"
|
45
|
+
|
46
|
+
def parse_params(self, module_params):
|
47
|
+
if 'ads_url' not in module_params:
|
48
|
+
module_params['ads_url'] = "http://local.adspower.net:50325/api/v1/user"
|
49
|
+
|
50
|
+
return [
|
51
|
+
module_params['ads_url']
|
52
|
+
]
|
@@ -0,0 +1,81 @@
|
|
1
|
+
import requests
|
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 web3 import Web3
|
6
|
+
|
7
|
+
from web3_wizzard_lib.core.utils.statistic_utils import get_statistic_writer, statistic_date_string
|
8
|
+
|
9
|
+
|
10
|
+
class AirdropPrinter(Module):
|
11
|
+
module_name = 'AIRDROP_PRINTER'
|
12
|
+
module_config = None
|
13
|
+
|
14
|
+
claimers = {
|
15
|
+
"L0": "0xB09F16F625B363875e39ADa56C03682088471523",
|
16
|
+
"SCROLL": "0xE8bE8eB940c0ca3BD19D911CD3bEBc97Bea0ED62",
|
17
|
+
"ZKSYNC": "0x66Fd4FC8FA52c9bec2AbA368047A0b27e24ecfe4",
|
18
|
+
"ORBITER": "0x13dFDd3a9B39323F228Daf73B62C23F7017E4679",
|
19
|
+
"ODOS": "0x4C8f8055D88705f52c9994969DDe61AB574895a3"
|
20
|
+
}
|
21
|
+
|
22
|
+
EMPTY_ADDRESS = '-'
|
23
|
+
|
24
|
+
chains = ["ARBITRUM", "ZKSYNC", "SCROLL", "BASE"]
|
25
|
+
|
26
|
+
def execute(self, account, statistic_write='GOOGLE'):
|
27
|
+
chain_contracts = {}
|
28
|
+
for chain in self.chains:
|
29
|
+
chain_instance = get_chain_instance(chain)
|
30
|
+
|
31
|
+
datas = self.find_interacted_contracts_hash(
|
32
|
+
account.address,
|
33
|
+
chain_instance['api_scan'],
|
34
|
+
chain_instance['api_scan_key']
|
35
|
+
)
|
36
|
+
|
37
|
+
chain_contracts[chain] = datas['result']
|
38
|
+
|
39
|
+
account_links = {}
|
40
|
+
|
41
|
+
for project, claim_address in self.claimers.items():
|
42
|
+
for chain, datas in chain_contracts.items():
|
43
|
+
chain_instance = get_chain_instance(chain)
|
44
|
+
for data in datas:
|
45
|
+
if data['to'] != "" and claim_address == Web3.to_checksum_address(data['to']):
|
46
|
+
account_links[project] = chain_instance['scan'] + "tx/" + data['hash']
|
47
|
+
|
48
|
+
if account_links.get(project) is None:
|
49
|
+
account_links[project] = self.EMPTY_ADDRESS
|
50
|
+
|
51
|
+
logger.info(account_links)
|
52
|
+
statistics_writer = get_statistic_writer()
|
53
|
+
job_name = f"airdrops_{statistic_date_string}"
|
54
|
+
statistics_writer.init_if_required(job_name, ['#', 'Address'] + list(self.claimers.keys()))
|
55
|
+
|
56
|
+
value_row = [account.app_id, account.address]
|
57
|
+
for project, address in account_links.items():
|
58
|
+
value_row.append(address)
|
59
|
+
|
60
|
+
statistics_writer.write_row(job_name, value_row)
|
61
|
+
|
62
|
+
def find_interacted_contracts_hash(self, wallet_address, api_url, api_key):
|
63
|
+
api_url = f"{api_url}/api?module=account&action=txlist&address={wallet_address}&startblock=0&endblock=latest&sort=asc&apikey={api_key}&offset=200"
|
64
|
+
|
65
|
+
if "base" in api_url:
|
66
|
+
logger.info(f"BASE {api_url}")
|
67
|
+
pass
|
68
|
+
|
69
|
+
response = requests.get(api_url)
|
70
|
+
data = response.json()
|
71
|
+
|
72
|
+
if data['status'] == '1' and data['message'] == 'OK':
|
73
|
+
return data
|
74
|
+
else:
|
75
|
+
logger.info("nothing")
|
76
|
+
logger.info(data)
|
77
|
+
pass
|
78
|
+
return data
|
79
|
+
|
80
|
+
def log(self):
|
81
|
+
return "AIRDROP PRINTER"
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
from sybil_engine.contract.weth import WETH
|
2
|
+
from sybil_engine.data.networks import get_ids_chain
|
3
|
+
from sybil_engine.data.tokens import get_tokens_for_chain
|
4
|
+
|
5
|
+
from web3_wizzard_lib.core.contract.aavecontract import AaveContract
|
6
|
+
from web3_wizzard_lib.core.modules.bank.bank import Bank
|
7
|
+
|
8
|
+
|
9
|
+
class Aave(Bank):
|
10
|
+
app_name = 'AAVE'
|
11
|
+
supported_chains = ['SCROLL']
|
12
|
+
|
13
|
+
def __init__(self, contract, web3):
|
14
|
+
self.contract = AaveContract(contract, web3)
|
15
|
+
|
16
|
+
def supply(self, account, amount):
|
17
|
+
self.contract.depositETH(account, amount.wei)
|
18
|
+
|
19
|
+
def redeem(self, account, withdraw):
|
20
|
+
self.contract.withdrawETH(account, withdraw.wei)
|
21
|
+
|
22
|
+
def get_deposit_amount(self, account, token):
|
23
|
+
weth_token = get_tokens_for_chain(get_ids_chain()[self.contract.web3.eth.chain_id])['AAVE_WETH']
|
24
|
+
|
25
|
+
return WETH(weth_token, self.contract.web3).balance_of(account)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Bank:
|
2
|
+
def supply(self, account, amount):
|
3
|
+
pass
|
4
|
+
|
5
|
+
def borrow(self, account, amount):
|
6
|
+
pass
|
7
|
+
|
8
|
+
def repay_borrow(self, account, amount):
|
9
|
+
pass
|
10
|
+
|
11
|
+
def redeem(self, account, amount, token):
|
12
|
+
pass
|
13
|
+
|
14
|
+
def get_deposit_amount(self, account, token):
|
15
|
+
pass
|
@@ -0,0 +1,25 @@
|
|
1
|
+
from sybil_engine.contract.weth import WETH
|
2
|
+
from sybil_engine.data.networks import get_ids_chain
|
3
|
+
from sybil_engine.data.tokens import get_tokens_for_chain
|
4
|
+
|
5
|
+
from web3_wizzard_lib.core.contract.basiliskcontract import BasiliskContract
|
6
|
+
from web3_wizzard_lib.core.modules.bank.bank import Bank
|
7
|
+
|
8
|
+
|
9
|
+
class Basilisk(Bank):
|
10
|
+
app_name = 'BASILISK_LANDING'
|
11
|
+
supported_chains = ['ZKSYNC']
|
12
|
+
|
13
|
+
def __init__(self, contract, web3):
|
14
|
+
self.contract = BasiliskContract(contract, web3)
|
15
|
+
|
16
|
+
def supply(self, account, amount):
|
17
|
+
self.contract.mint(account, amount.wei)
|
18
|
+
|
19
|
+
def redeem(self, account, withdraw):
|
20
|
+
self.contract.redeem_underlying(account, withdraw.wei)
|
21
|
+
|
22
|
+
def get_deposit_amount(self, account, token):
|
23
|
+
weth_token = get_tokens_for_chain(get_ids_chain()[self.contract.web3.eth.chain_id])['BASILISK_LANDING']
|
24
|
+
|
25
|
+
return WETH(weth_token, self.contract.web3).balance_of(account)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
from sybil_engine.contract.weth import WETH
|
2
|
+
from sybil_engine.data.networks import get_ids_chain
|
3
|
+
from sybil_engine.data.tokens import get_tokens_for_chain
|
4
|
+
|
5
|
+
from web3_wizzard_lib.core.contract.eralendcontract import EraLendContract
|
6
|
+
from web3_wizzard_lib.core.modules.bank.bank import Bank
|
7
|
+
|
8
|
+
|
9
|
+
class Eralend(Bank):
|
10
|
+
app_name = 'ERALEND'
|
11
|
+
supported_chains = ['ZKSYNC']
|
12
|
+
|
13
|
+
def __init__(self, contract, web3):
|
14
|
+
self.contract = EraLendContract(contract, web3)
|
15
|
+
|
16
|
+
def supply(self, account, amount):
|
17
|
+
self.contract.mint(account, amount.wei)
|
18
|
+
|
19
|
+
def redeem(self, account, withdraw):
|
20
|
+
self.contract.redeem_underlying(account, withdraw.wei)
|
21
|
+
|
22
|
+
def get_deposit_amount(self, account, token):
|
23
|
+
weth_token = get_tokens_for_chain(get_ids_chain()[self.contract.web3.eth.chain_id])['ERALEND']
|
24
|
+
|
25
|
+
return WETH(weth_token, self.contract.web3).balance_of(account)
|
@@ -0,0 +1,116 @@
|
|
1
|
+
from loguru import logger
|
2
|
+
from sybil_engine.data.contracts import get_contracts_for_chain
|
3
|
+
from sybil_engine.data.tokens import get_tokens_for_chain
|
4
|
+
from sybil_engine.domain.balance.tokens import Erc20Token
|
5
|
+
|
6
|
+
from web3_wizzard_lib.core.contract.layerbank_price import LayerBankPrice
|
7
|
+
from web3_wizzard_lib.core.contract.layerbank_token import LayerBankToken
|
8
|
+
from web3_wizzard_lib.core.contract.layerbankcontract import LayerBankContract
|
9
|
+
from web3_wizzard_lib.core.modules.bank.bank import Bank
|
10
|
+
|
11
|
+
|
12
|
+
class LayerBank(Bank):
|
13
|
+
app_name = 'LAYERBANK'
|
14
|
+
supported_chains = ['LINEA']
|
15
|
+
|
16
|
+
def __init__(self, chain, web3):
|
17
|
+
self.chain = chain
|
18
|
+
self.web3 = web3
|
19
|
+
self.layerbank = LayerBankContract(get_contracts_for_chain(chain)["LAYERBANK"], web3)
|
20
|
+
|
21
|
+
lbwstETH = get_tokens_for_chain(chain)['lbwstETH']
|
22
|
+
self.lbWstETHToken = LayerBankToken(lbwstETH, web3)
|
23
|
+
|
24
|
+
lbETH = get_tokens_for_chain(chain)['lbETH']
|
25
|
+
self.lbETHToken = LayerBankToken(lbETH, web3)
|
26
|
+
|
27
|
+
def supply(self, account, token):
|
28
|
+
token = LayerBankToken(get_tokens_for_chain(self.chain)[token], self.web3)
|
29
|
+
|
30
|
+
erc20_token = Erc20Token(self.chain, token, self.web3)
|
31
|
+
amount = erc20_token.balance(account)
|
32
|
+
|
33
|
+
if 25 * token.one_decimal() <= self.layerbank.account_liquidity_of(account)[0]:
|
34
|
+
logger.info("Already supplied over 25$ worth, skip this step")
|
35
|
+
return
|
36
|
+
|
37
|
+
if erc20_token.allowance(account, token.contract_address) < amount.wei:
|
38
|
+
erc20_token.approve(account, token.contract_address)
|
39
|
+
|
40
|
+
if amount.wei > 0:
|
41
|
+
if token.contract_address not in self.layerbank.market_list_of(account):
|
42
|
+
logger.info("Add support wstETH to LayerBank")
|
43
|
+
self.layerbank.enter_markets(account, token.contract_address)
|
44
|
+
|
45
|
+
logger.info(f"Supply {amount.log_line()}")
|
46
|
+
|
47
|
+
self.layerbank.supply(account, token.contract_address, amount.wei)
|
48
|
+
|
49
|
+
if 25 * token.one_decimal() > self.layerbank.account_liquidity_of(account)[0]:
|
50
|
+
raise Exception(
|
51
|
+
f"Not enough supply for 25$ borrow {self.layerbank.account_liquidity_of(account)[0] / token.one_decimal()}"
|
52
|
+
)
|
53
|
+
|
54
|
+
def borrow(self, account, token):
|
55
|
+
token = LayerBankToken(get_tokens_for_chain(self.chain)[token], self.web3)
|
56
|
+
|
57
|
+
layerbank_price = LayerBankPrice(get_contracts_for_chain(self.chain)["LAYERBANK_PRICE"], self.web3)
|
58
|
+
|
59
|
+
usd_collateral = self.layerbank.account_liquidity_of(account)[0]
|
60
|
+
eth_amount = (usd_collateral / layerbank_price.get_underlying_price(token.contract_address))
|
61
|
+
|
62
|
+
logger.info(f"Borrow {eth_amount} {token.symbol()}")
|
63
|
+
|
64
|
+
borrow_amount = int(
|
65
|
+
eth_amount * token.one_decimal() * token.one_decimal() / token.exchange_rate())
|
66
|
+
|
67
|
+
self.layerbank.borrow(
|
68
|
+
account,
|
69
|
+
token.contract_address,
|
70
|
+
borrow_amount
|
71
|
+
)
|
72
|
+
|
73
|
+
def repay_borrow(self, account, token):
|
74
|
+
token = LayerBankToken(get_tokens_for_chain(self.chain)[token], self.web3)
|
75
|
+
|
76
|
+
layerbank_price = LayerBankPrice(get_contracts_for_chain(self.chain)["LAYERBANK_PRICE"], self.web3)
|
77
|
+
|
78
|
+
borrowed_usdc = self.layerbank.account_liquidity_of(account)[2]
|
79
|
+
lbETHPrice = layerbank_price.get_underlying_price(token.contract_address)
|
80
|
+
ethAmount = int(
|
81
|
+
(
|
82
|
+
borrowed_usdc / lbETHPrice) * token.one_decimal() * token.one_decimal() / token.exchange_rate()
|
83
|
+
)
|
84
|
+
|
85
|
+
if 2 * token.one_decimal() > borrowed_usdc:
|
86
|
+
logger.info("Less than 2$ borrowed, skip")
|
87
|
+
return
|
88
|
+
|
89
|
+
logger.info(f"Repay Borrow {ethAmount / token.one_decimal()}")
|
90
|
+
self.layerbank.repay_borrow(account, token.contract_address, ethAmount)
|
91
|
+
|
92
|
+
def redeem(self, account, amount, token):
|
93
|
+
if token == 'ETH':
|
94
|
+
token = self.lbETHToken
|
95
|
+
elif token == 'wstETH':
|
96
|
+
token = self.lbWstETHToken
|
97
|
+
|
98
|
+
underlying_balance = self.get_deposit_amount(account, token)
|
99
|
+
|
100
|
+
if underlying_balance < 10000:
|
101
|
+
logger.info("Less than 0.001$ supplied, skip")
|
102
|
+
return
|
103
|
+
|
104
|
+
self.layerbank.redeem_token(
|
105
|
+
account,
|
106
|
+
token.contract_address,
|
107
|
+
int(underlying_balance * token.one_decimal() * 0.999 / token.exchange_rate())
|
108
|
+
)
|
109
|
+
|
110
|
+
def get_deposit_amount(self, account, token):
|
111
|
+
if token == 'ETH':
|
112
|
+
token = self.lbETHToken
|
113
|
+
elif token == 'wstETH':
|
114
|
+
token = self.lbWstETHToken
|
115
|
+
|
116
|
+
return token.underlying_balance_of(account)
|
@@ -0,0 +1,57 @@
|
|
1
|
+
from loguru import logger
|
2
|
+
from sybil_engine.data.tokens import get_tokens_for_chain
|
3
|
+
from sybil_engine.domain.balance.tokens import Erc20Token
|
4
|
+
|
5
|
+
from web3_wizzard_lib.core.contract.mendi_token import MendiTokenContract
|
6
|
+
from web3_wizzard_lib.core.modules.bank.bank import Bank
|
7
|
+
|
8
|
+
|
9
|
+
class MendiFinance(Bank):
|
10
|
+
app_name = 'MENDI_FINANCE'
|
11
|
+
supported_chains = ['LINEA']
|
12
|
+
|
13
|
+
def __init__(self, chain, web3):
|
14
|
+
self.chain = chain
|
15
|
+
self.web3 = web3
|
16
|
+
|
17
|
+
def supply(self, account, amount):
|
18
|
+
erc20 = Erc20Token(self.chain, amount.token, self.web3)
|
19
|
+
amount = erc20.balance(account)
|
20
|
+
|
21
|
+
me_token = f'me{amount.token}'
|
22
|
+
mendi_token_address = get_tokens_for_chain(self.chain)[me_token]
|
23
|
+
|
24
|
+
logger.info(f"Mendi supply {amount} {amount.token}")
|
25
|
+
|
26
|
+
if erc20.allowance(account, mendi_token_address) < erc20.balance(account).wei:
|
27
|
+
erc20.approve(account, mendi_token_address)
|
28
|
+
|
29
|
+
mendi = MendiTokenContract(mendi_token_address, self.web3)
|
30
|
+
mendi.mint(account, amount.wei)
|
31
|
+
|
32
|
+
def borrow(self, account, amount):
|
33
|
+
logger.info(f"Mendi borrow {amount.token}")
|
34
|
+
|
35
|
+
def repay_borrow(self, account, amount):
|
36
|
+
logger.info(f"Mendi repay {amount.token}")
|
37
|
+
|
38
|
+
def redeem(self, account, amount):
|
39
|
+
me_token = f'me{amount.token}'
|
40
|
+
mendi_token_address = get_tokens_for_chain(self.chain)[me_token]
|
41
|
+
mendi = MendiTokenContract(mendi_token_address, self.web3)
|
42
|
+
|
43
|
+
redeem_balance = mendi.balance_of(account)
|
44
|
+
|
45
|
+
if redeem_balance > 1000000000:
|
46
|
+
logger.info(f"Mendi reedem {amount. token}")
|
47
|
+
mendi.redeem(account, redeem_balance)
|
48
|
+
else:
|
49
|
+
logger.info(f"Mendi balance is 0")
|
50
|
+
|
51
|
+
def get_deposit_amount(self, account, token):
|
52
|
+
#me_token = f'meweETH'
|
53
|
+
mendi_token_address = get_tokens_for_chain(self.chain)[token]
|
54
|
+
mendi = MendiTokenContract(mendi_token_address, self.web3)
|
55
|
+
|
56
|
+
return mendi.balance_of(account)
|
57
|
+
|