iwa 0.0.32__py3-none-any.whl → 0.0.58__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.
- iwa/core/chain/interface.py +116 -8
- iwa/core/chain/models.py +15 -3
- iwa/core/chain/rate_limiter.py +54 -12
- iwa/core/cli.py +1 -1
- iwa/core/ipfs.py +24 -2
- iwa/core/keys.py +59 -15
- iwa/core/models.py +60 -13
- iwa/core/pricing.py +24 -2
- iwa/core/secrets.py +27 -0
- iwa/core/services/account.py +1 -1
- iwa/core/services/balance.py +0 -22
- iwa/core/services/safe.py +64 -43
- iwa/core/services/safe_executor.py +316 -0
- iwa/core/services/transaction.py +11 -1
- iwa/core/services/transfer/erc20.py +14 -2
- iwa/core/services/transfer/native.py +14 -31
- iwa/core/services/transfer/swap.py +1 -0
- iwa/core/tests/test_gnosis_fee.py +87 -0
- iwa/core/tests/test_ipfs.py +85 -0
- iwa/core/tests/test_pricing.py +65 -0
- iwa/core/tests/test_regression_fixes.py +100 -0
- iwa/core/wallet.py +3 -3
- iwa/plugins/gnosis/cow/quotes.py +2 -2
- iwa/plugins/gnosis/cow/swap.py +18 -32
- iwa/plugins/gnosis/tests/test_cow.py +19 -10
- iwa/plugins/olas/importer.py +5 -7
- iwa/plugins/olas/models.py +0 -3
- iwa/plugins/olas/service_manager/drain.py +16 -7
- iwa/plugins/olas/service_manager/lifecycle.py +15 -4
- iwa/plugins/olas/service_manager/staking.py +4 -4
- iwa/plugins/olas/tests/test_importer_error_handling.py +13 -0
- iwa/plugins/olas/tests/test_olas_archiving.py +73 -0
- iwa/plugins/olas/tests/test_olas_view.py +5 -1
- iwa/plugins/olas/tests/test_service_manager.py +7 -7
- iwa/plugins/olas/tests/test_service_manager_errors.py +1 -1
- iwa/plugins/olas/tests/test_service_manager_flows.py +1 -1
- iwa/plugins/olas/tests/test_service_manager_rewards.py +5 -1
- iwa/tools/drain_accounts.py +60 -0
- iwa/tools/list_contracts.py +2 -0
- iwa/tui/screens/wallets.py +2 -2
- iwa/web/routers/accounts.py +1 -1
- iwa/web/static/app.js +21 -9
- iwa/web/static/style.css +4 -0
- iwa/web/tests/test_web_endpoints.py +2 -2
- {iwa-0.0.32.dist-info → iwa-0.0.58.dist-info}/METADATA +6 -3
- {iwa-0.0.32.dist-info → iwa-0.0.58.dist-info}/RECORD +64 -54
- {iwa-0.0.32.dist-info → iwa-0.0.58.dist-info}/WHEEL +1 -1
- tests/test_balance_service.py +0 -41
- tests/test_chain.py +13 -4
- tests/test_cli.py +2 -2
- tests/test_drain_coverage.py +12 -6
- tests/test_keys.py +23 -23
- tests/test_rate_limiter.py +2 -2
- tests/test_rate_limiter_retry.py +108 -0
- tests/test_rpc_rate_limit.py +33 -0
- tests/test_rpc_rotation.py +55 -7
- tests/test_safe_coverage.py +37 -23
- tests/test_safe_executor.py +335 -0
- tests/test_safe_integration.py +148 -0
- tests/test_safe_service.py +1 -1
- tests/test_transfer_swap_unit.py +5 -1
- tests/test_pricing.py +0 -160
- {iwa-0.0.32.dist-info → iwa-0.0.58.dist-info}/entry_points.txt +0 -0
- {iwa-0.0.32.dist-info → iwa-0.0.58.dist-info}/licenses/LICENSE +0 -0
- {iwa-0.0.32.dist-info → iwa-0.0.58.dist-info}/top_level.txt +0 -0
|
@@ -2,30 +2,30 @@ iwa/__init__.py,sha256=vu12UytYNREtMRvIWp6AfV1GgUe53XWwCMhYyqKAPgo,19
|
|
|
2
2
|
iwa/__main__.py,sha256=eJU5Uxeu9Y7shWg5dt5Mcq0pMC4wFVNWjeYGKSf4Apw,88
|
|
3
3
|
iwa/core/__init__.py,sha256=GJv4LJOXeZ3hgGvbt5I6omkoFkP2A9qhHjpDlOep9ik,24
|
|
4
4
|
iwa/core/chainlist.py,sha256=IOnlfRFaPlzdg91HbILynzvRfEJ9afikjFUS06K4rfU,4021
|
|
5
|
-
iwa/core/cli.py,sha256=
|
|
5
|
+
iwa/core/cli.py,sha256=HMp1QapGTFi221MASrDZlcenCD-VgEtO5rdzjH_QzXY,8312
|
|
6
6
|
iwa/core/constants.py,sha256=_CYUVQpR--dRPuxotsmbzQE-22y61tlnjUD7IhlvVVA,997
|
|
7
7
|
iwa/core/db.py,sha256=WI-mP0tQAmwFPeEi9w7RCa_Mcf_zBfd_7JcbHJwU1aU,10377
|
|
8
|
-
iwa/core/ipfs.py,sha256=
|
|
9
|
-
iwa/core/keys.py,sha256=
|
|
8
|
+
iwa/core/ipfs.py,sha256=6tVd15J6VoewRCbI9xr1rN9OfL3vOjI_SGNK4qa_ACk,5618
|
|
9
|
+
iwa/core/keys.py,sha256=r1C05wdJPv7Z05COkHTk431Uo0-s4jb66bpE7mIy96w,24713
|
|
10
10
|
iwa/core/mnemonic.py,sha256=LiG1VmpydQoHQ0pHUJ1OIlrWJry47VSMnOqPM_Yk-O8,12930
|
|
11
|
-
iwa/core/models.py,sha256=
|
|
11
|
+
iwa/core/models.py,sha256=J5oNzKhWew4KA9ofH9sYWkmkonOaU9iYWJRcuoisweg,14544
|
|
12
12
|
iwa/core/monitor.py,sha256=6hQHAdJIsyoOwnZ9KdYDk_k0mclgr94iFk8V6BtatFQ,7957
|
|
13
13
|
iwa/core/plugins.py,sha256=FLvOG4S397fKi0aTH1fWBEtexn4yvGv_QzGWqFrhSKE,1102
|
|
14
|
-
iwa/core/pricing.py,sha256=
|
|
14
|
+
iwa/core/pricing.py,sha256=NsRE_xwo7teBzGrJY5EgsgR9fe3sMPzrhOMq-DUccqE,4752
|
|
15
15
|
iwa/core/rpc_monitor.py,sha256=-NHR1Mn2IJKJ9x975NGfsze_shI12yL0OyTPtmjUMKg,1661
|
|
16
|
-
iwa/core/secrets.py,sha256=
|
|
16
|
+
iwa/core/secrets.py,sha256=5cPUtNVsAUKakNHFCaPOQ3aygAOs_FemSTNZpljqiRs,3920
|
|
17
17
|
iwa/core/tables.py,sha256=y7Cg67PAGHYVMVyAjbo_CQ9t2iz7UXE-OTuUHRyFRTo,2021
|
|
18
18
|
iwa/core/test.py,sha256=gey0dql5eajo1itOhgkSrgfyGWue2eSfpr0xzX3vc38,643
|
|
19
19
|
iwa/core/types.py,sha256=EfDfIwLajTNK-BP9K17QLOIsGCs8legplKI_bUD_NjM,1992
|
|
20
20
|
iwa/core/ui.py,sha256=DglmrI7XhUmOpLn9Nog9Cej4r-VT0JGFkuSNBx-XorQ,3131
|
|
21
21
|
iwa/core/utils.py,sha256=shJuANkXSWVO3NF49syPA9hCG7H5AzaMJOG8V4fo6IM,4279
|
|
22
|
-
iwa/core/wallet.py,sha256=
|
|
22
|
+
iwa/core/wallet.py,sha256=MjjSMfrNAipDGjzyNXa7RCIHljR7XtL1yRL6XcKIf00,13107
|
|
23
23
|
iwa/core/chain/__init__.py,sha256=XJMmn0ed-_aVkY2iEMKpuTxPgIKBd41dexSVmEZTa-o,1604
|
|
24
24
|
iwa/core/chain/errors.py,sha256=9SEbhxZ-qASPkzt-DoI51qq0GRJVqRgqgL720gO7a64,1275
|
|
25
|
-
iwa/core/chain/interface.py,sha256=
|
|
25
|
+
iwa/core/chain/interface.py,sha256=wrcqRwXtuj_a9MxT9zkatwYEyS1ccmvSumFqbfir9Rw,23593
|
|
26
26
|
iwa/core/chain/manager.py,sha256=cFEzh6pK5OyVhjhpeMAqhc9RnRDQR1DjIGiGKp-FXBI,1159
|
|
27
|
-
iwa/core/chain/models.py,sha256=
|
|
28
|
-
iwa/core/chain/rate_limiter.py,sha256=
|
|
27
|
+
iwa/core/chain/models.py,sha256=WUhAighMKcFdbAUkPU_3dkGbWyAUpRJqXMHLcWFC1xg,5261
|
|
28
|
+
iwa/core/chain/rate_limiter.py,sha256=wcVErIpAI4pG9YMsGzAeQEE4mbfh9OhPC3suGkWl6JE,8099
|
|
29
29
|
iwa/core/contracts/__init__.py,sha256=P5GFY_pnuI02teqVY2U0t98bn1_SSPAbcAzRMpCdTi4,34
|
|
30
30
|
iwa/core/contracts/cache.py,sha256=7wGQgyXAmofvx-irbxSnGgIDzQik6Pcpm7up6wMQcoo,4454
|
|
31
31
|
iwa/core/contracts/contract.py,sha256=RJaKh05p1MdgsCd8v799LwW1apkDboRDCu8Kah02760,13254
|
|
@@ -36,17 +36,22 @@ iwa/core/contracts/abis/erc20.json,sha256=vrdExMWcIogg_nO59j1Pmipmpa2Ulj3oCCdcdr
|
|
|
36
36
|
iwa/core/contracts/abis/multisend.json,sha256=BE8JbNQU_m1VsIppNK0GKP1E9R7Aor9YTrCAwsC0pNQ,396
|
|
37
37
|
iwa/core/contracts/abis/multisend_call_only.json,sha256=lamMZflFtsoBKcG4QgmLWKyTK1-TcIaTM-j3r23EqJU,287
|
|
38
38
|
iwa/core/services/__init__.py,sha256=ab5pYzmu3LrZLTO5N-plx6Rp4R0hBEnbbzsgz84zWGM,498
|
|
39
|
-
iwa/core/services/account.py,sha256=
|
|
40
|
-
iwa/core/services/balance.py,sha256=
|
|
39
|
+
iwa/core/services/account.py,sha256=0l14qD8_-ZbN_hQUNa7bRZt0tkceHPPc4GHmB8UKqy4,2009
|
|
40
|
+
iwa/core/services/balance.py,sha256=m0GqJaBjIdR-aOzpGbh1nF9Xgz0aQWugEzH82DjtLqU,3325
|
|
41
41
|
iwa/core/services/plugin.py,sha256=GNNlbtELyHl7MNVChrypF76GYphxXduxDog4kx1MLi8,3277
|
|
42
|
-
iwa/core/services/safe.py,sha256=
|
|
43
|
-
iwa/core/services/
|
|
42
|
+
iwa/core/services/safe.py,sha256=pe_gpu-7PgnQUgzIcCrx07d4h6Pmr_txJnqWMH6iubs,15535
|
|
43
|
+
iwa/core/services/safe_executor.py,sha256=t2rlq3WwNOtvgu66FnOnoCezsB6xCOhyB7dZWQXpjqc,12885
|
|
44
|
+
iwa/core/services/transaction.py,sha256=lvKPkOrN-689iAgDeT3qAocDUfi20KhXS3kEHaZ6pRw,19626
|
|
44
45
|
iwa/core/services/transfer/__init__.py,sha256=ZJfshFxJRsp8rkOqfVvd1cqEzIJ9tqBJh8pc0l90GLk,5576
|
|
45
46
|
iwa/core/services/transfer/base.py,sha256=sohz-Ss2i-pGYGl4x9bD93cnYKcSvsXaXyvyRawvgQs,9043
|
|
46
|
-
iwa/core/services/transfer/erc20.py,sha256=
|
|
47
|
+
iwa/core/services/transfer/erc20.py,sha256=EirjmzZNklJWZs96ZjiuDaRyZG_jh_gb7rxhp3wG9KY,10105
|
|
47
48
|
iwa/core/services/transfer/multisend.py,sha256=MuOTjzUQoYg1eSixXKhJGBmB1c0ymLelvk4puHm_VGE,15194
|
|
48
|
-
iwa/core/services/transfer/native.py,sha256=
|
|
49
|
-
iwa/core/services/transfer/swap.py,sha256=
|
|
49
|
+
iwa/core/services/transfer/native.py,sha256=cG1PfLi8WM_kHvyx4XkLDVm-ynMQNfZ-Ghi2m5kIZmE,9899
|
|
50
|
+
iwa/core/services/transfer/swap.py,sha256=jsLCj_wc8Q4iWIXplcOIEtAvQnTpgTQF_5wrhQ6GjEk,12306
|
|
51
|
+
iwa/core/tests/test_gnosis_fee.py,sha256=4k73GpjVoJGMvmPF-dIhmUsWpPwQ0VaNI-iOCOuAc84,3658
|
|
52
|
+
iwa/core/tests/test_ipfs.py,sha256=PKB05dxdnLlMDgQM2JPARRogRJ47KEUH1XgFEOXnQQ4,2773
|
|
53
|
+
iwa/core/tests/test_pricing.py,sha256=B2f8vx_JSdilIMu6cb8TxfVyr6kDLt5wN8ZCPvEAuOY,1876
|
|
54
|
+
iwa/core/tests/test_regression_fixes.py,sha256=9q7Tov-L1U3VSQ-xkUlVaLWSVlwgnAukPin0KlkUl4c,4032
|
|
50
55
|
iwa/core/tests/test_wallet.py,sha256=N8_gO7KkV5nqk_KcHqW_xOwNNKpDuXHeFgnala3bB84,9361
|
|
51
56
|
iwa/plugins/__init__.py,sha256=zy-DjOZn8GSgIETN2X_GAb9O6yk71t6ZRzeUgoZ52KA,23
|
|
52
57
|
iwa/plugins/gnosis/__init__.py,sha256=dpx0mE84eV-g5iZaH5nKivZJnoKWyRFX5rhdjowBwuU,114
|
|
@@ -54,17 +59,17 @@ iwa/plugins/gnosis/cow_utils.py,sha256=iSvbfgTr2bCqRsUznKCWqmoTnyuX-WZX4oh0E-l3X
|
|
|
54
59
|
iwa/plugins/gnosis/plugin.py,sha256=AgkgOGYfnrcjWrPUiAvySMj6ITnss0SFXiEi6Z6fnMs,1885
|
|
55
60
|
iwa/plugins/gnosis/safe.py,sha256=ye5GQhzKALPNiyJhr7lyrhDgdrDyIj_h3TN2QWI4Xds,5519
|
|
56
61
|
iwa/plugins/gnosis/cow/__init__.py,sha256=lZN5QpIYWL67rE8r7z7zS9dlr8OqFrYeD9T4-RwUghU,224
|
|
57
|
-
iwa/plugins/gnosis/cow/quotes.py,sha256=
|
|
58
|
-
iwa/plugins/gnosis/cow/swap.py,sha256=
|
|
62
|
+
iwa/plugins/gnosis/cow/quotes.py,sha256=2emu4St016Gf7Nn5P2XW5CcSNxprKoVecdZQ016RpcY,5177
|
|
63
|
+
iwa/plugins/gnosis/cow/swap.py,sha256=XgeMnTDnCiTXVlrrh2pXk4qmjJnFxIVnhZsa1K82uDQ,14729
|
|
59
64
|
iwa/plugins/gnosis/cow/types.py,sha256=-9VRiFhAkmN1iIJ95Pg7zLFSeXtkkW00sl13usxi3o8,470
|
|
60
|
-
iwa/plugins/gnosis/tests/test_cow.py,sha256=
|
|
65
|
+
iwa/plugins/gnosis/tests/test_cow.py,sha256=50bj9kZ-PwrZXIdTTTNlien5WdDWHhxI44dcB89jOc8,8809
|
|
61
66
|
iwa/plugins/gnosis/tests/test_safe.py,sha256=hQHVHBWQhGnuvzvx4U9fOWEwASJWwql42q6cfRcuAls,3218
|
|
62
67
|
iwa/plugins/olas/__init__.py,sha256=_NhBczzM61fhGYwGhnWfEeL8Jywyy_730GASe2BxzeQ,106
|
|
63
68
|
iwa/plugins/olas/constants.py,sha256=iTFoO2QW3KbhL5k5sKsJxxyDytl9wVIb_9hAih55KrE,7728
|
|
64
69
|
iwa/plugins/olas/events.py,sha256=SWD3wYdQ-l6dLUJSkfh_WsLmedH4Vsw_EvYXg7QC3yc,5970
|
|
65
|
-
iwa/plugins/olas/importer.py,sha256=
|
|
70
|
+
iwa/plugins/olas/importer.py,sha256=BQU3ykigPSuYlt61VarjBpP5NEAQSM9NoPqwjyjJgec,41972
|
|
66
71
|
iwa/plugins/olas/mech_reference.py,sha256=CaSCpQnQL4F7wOG6Ox6Zdoy-uNEQ78YBwVLILQZKL8Q,5782
|
|
67
|
-
iwa/plugins/olas/models.py,sha256=
|
|
72
|
+
iwa/plugins/olas/models.py,sha256=uXih8UcmBYj6PlxqP-cnyAiazJezjShjkCaN1Kqlb2I,4921
|
|
68
73
|
iwa/plugins/olas/plugin.py,sha256=zOPWyoVkSVh6guJ3TZj5enJFuiIbP3fRM8FkziPB-c0,15606
|
|
69
74
|
iwa/plugins/olas/contracts/activity_checker.py,sha256=WXxuzbpXGVqIfEiMPiiqN3Z_UxIY-Lvx0raa1ErBfPA,5323
|
|
70
75
|
iwa/plugins/olas/contracts/base.py,sha256=y73aQbDq6l4zUpz_eQAg4MsLkTAEqjjupXlcvxjfgCI,240
|
|
@@ -87,28 +92,29 @@ iwa/plugins/olas/scripts/test_full_mech_flow.py,sha256=Fqoq5bn7Z_3YyRrnuqNAZy9cw
|
|
|
87
92
|
iwa/plugins/olas/scripts/test_simple_lifecycle.py,sha256=8T50tOZx3afeECSfCNAb0rAHNtYOsBaeXlMwKXElCk8,2099
|
|
88
93
|
iwa/plugins/olas/service_manager/__init__.py,sha256=GXiThMEY3nPgHUl1i-DLrF4h96z9jPxxI8Jepo2E1PM,1926
|
|
89
94
|
iwa/plugins/olas/service_manager/base.py,sha256=EBPg0ymqgtAb7ZvVSfTt31QYgv_6gp4UAc6je00NLAg,5009
|
|
90
|
-
iwa/plugins/olas/service_manager/drain.py,sha256=
|
|
91
|
-
iwa/plugins/olas/service_manager/lifecycle.py,sha256=
|
|
95
|
+
iwa/plugins/olas/service_manager/drain.py,sha256=LCs1emIXxfb8a4w3I8LdFfmwYA61T1EUQ5bTAt3Wc04,12942
|
|
96
|
+
iwa/plugins/olas/service_manager/lifecycle.py,sha256=eN0TgS77Qg5fvOSNEztgQ3jazLzR2iHYm3BeNr5B_8U,50593
|
|
92
97
|
iwa/plugins/olas/service_manager/mech.py,sha256=NVzVbEmyOe3wK92VEzCCOSuy3HDkEP1MSoVt7Av8Psk,27949
|
|
93
|
-
iwa/plugins/olas/service_manager/staking.py,sha256=
|
|
98
|
+
iwa/plugins/olas/service_manager/staking.py,sha256=e6yIsxOq0E-lfStTYp-IkbHChBpbDtQv4mSnniZ_ybQ,29555
|
|
94
99
|
iwa/plugins/olas/tests/conftest.py,sha256=4vM7EI00SrTGyeP0hNzsGSQHEj2-iznVgzlNh2_OGfo,739
|
|
95
100
|
iwa/plugins/olas/tests/test_importer.py,sha256=i9LKov7kNRECB3hmRnhKBwcfx3uxtjWe4BB77bOOpeo,4282
|
|
96
|
-
iwa/plugins/olas/tests/test_importer_error_handling.py,sha256=
|
|
101
|
+
iwa/plugins/olas/tests/test_importer_error_handling.py,sha256=GeXu4Par3_FAUL9hT6Sn5PdRg2_EU2gf3iaL73atoYo,12256
|
|
97
102
|
iwa/plugins/olas/tests/test_mech_contracts.py,sha256=wvxuigPafF-ySIHVBdWVei3AO418iPh7cSVdAlUGm_s,3566
|
|
103
|
+
iwa/plugins/olas/tests/test_olas_archiving.py,sha256=NTeYp07P3uoGDoxK1QA0eluISv2qd5cW_TNzCU_2E30,3305
|
|
98
104
|
iwa/plugins/olas/tests/test_olas_contracts.py,sha256=B8X-5l1KfYMoZOiM94_rcNzbILLl78rqt_jhyxzAOqE,10835
|
|
99
105
|
iwa/plugins/olas/tests/test_olas_integration.py,sha256=vjL8-RNdxXu6RFR5F1Bn7xqnxnUVWTzl2--Pp7-0r5A,22973
|
|
100
106
|
iwa/plugins/olas/tests/test_olas_models.py,sha256=5scX-wvRLGH3G44S2okq_tyQ9Rk7Pd0Ak1zNCZ2HtI4,4957
|
|
101
|
-
iwa/plugins/olas/tests/test_olas_view.py,sha256=
|
|
107
|
+
iwa/plugins/olas/tests/test_olas_view.py,sha256=2SsQYayeV3rf_mAPVvt4vINcMysAXmICkkQe3MRn4K8,10662
|
|
102
108
|
iwa/plugins/olas/tests/test_olas_view_actions.py,sha256=jAxr9bjFNAaxGf1btIrxdMaHgJ0PWX9aDwVU-oPGMpk,5109
|
|
103
109
|
iwa/plugins/olas/tests/test_olas_view_modals.py,sha256=8j0PNFjKqFC5V1kBdVFWNLMvqGt49H6fLSYGxn02c8o,5562
|
|
104
110
|
iwa/plugins/olas/tests/test_plugin.py,sha256=RVgU-Cq6t_3mOh90xFAGwlJOV7ZIgp0VNaK5ZAxisAQ,2565
|
|
105
111
|
iwa/plugins/olas/tests/test_plugin_full.py,sha256=55EBa07JhJLVG3IMi6QKlR_ivWLYCdLQTySP66qbEXo,8584
|
|
106
112
|
iwa/plugins/olas/tests/test_service_lifecycle.py,sha256=sOCtpz8T9s55AZe9AoqP1h3XrXw5NDSjDqwLgYThvU4,5559
|
|
107
|
-
iwa/plugins/olas/tests/test_service_manager.py,sha256=
|
|
108
|
-
iwa/plugins/olas/tests/test_service_manager_errors.py,sha256=
|
|
109
|
-
iwa/plugins/olas/tests/test_service_manager_flows.py,sha256=
|
|
113
|
+
iwa/plugins/olas/tests/test_service_manager.py,sha256=b3PwS1tUnQJgF5DzYBDsZiYruh2QB8jLkXBmruc5czg,40893
|
|
114
|
+
iwa/plugins/olas/tests/test_service_manager_errors.py,sha256=XxUXdEqsu7th5BwkAqzuNkdoFeQG-C75zrzxxQm1lZo,8544
|
|
115
|
+
iwa/plugins/olas/tests/test_service_manager_flows.py,sha256=M1oDM42m-0JPBrjcp0WsmXgCN7JxBenN_fZqFu1rdR8,20728
|
|
110
116
|
iwa/plugins/olas/tests/test_service_manager_mech.py,sha256=qG6qu5IPRNypXUsblU2OEkuiuwDJ0TH8RXZbibmTFcQ,4937
|
|
111
|
-
iwa/plugins/olas/tests/test_service_manager_rewards.py,sha256=
|
|
117
|
+
iwa/plugins/olas/tests/test_service_manager_rewards.py,sha256=jVAe4HSAxDfnq8Ec-JMsvE2E0HYsydO78ITFHnSSka4,11993
|
|
112
118
|
iwa/plugins/olas/tests/test_service_manager_validation.py,sha256=ajlfH5uc4mAHf8A7GLE5cW7X8utM2vUilM0JdGDdlVg,5382
|
|
113
119
|
iwa/plugins/olas/tests/test_service_staking.py,sha256=miNGZZoIrZf0Am-pJ8gTyvVAruL4P7jMvrtFEhG5wxQ,15694
|
|
114
120
|
iwa/plugins/olas/tests/test_staking_integration.py,sha256=QCBQf6P2ZmmsEGt2k8W2r53lG2aVRuoMJE-aFxVDLss,9701
|
|
@@ -117,7 +123,8 @@ iwa/plugins/olas/tui/__init__.py,sha256=5ZRsbC7J3z1xfkZRiwr4bLEklf78rNVjdswe2p7S
|
|
|
117
123
|
iwa/plugins/olas/tui/olas_view.py,sha256=OlhciDK1Ni4BdzggqTzQeYnP2azB-We02hH6jQhbZuU,37388
|
|
118
124
|
iwa/tools/__init__.py,sha256=jQyuwDQGRigSe7S9JMb4yK3CXPgZFJNffzt6N2v9PU0,21
|
|
119
125
|
iwa/tools/check_profile.py,sha256=0LAv9wx4wMM610mX88-6tIoDi2I5LDzh0W9nkprt42s,2177
|
|
120
|
-
iwa/tools/
|
|
126
|
+
iwa/tools/drain_accounts.py,sha256=8ED4tw2J72BzYysiqF34THGi_F1tAufasjG8fUADdJU,1759
|
|
127
|
+
iwa/tools/list_contracts.py,sha256=c7ugXfblJ47cC2n5ruGzBwN5DYWiZVJqKYqIttc_PMk,5013
|
|
121
128
|
iwa/tools/release.py,sha256=-Z9GG6Y-K6KG32K0VUf_MruiUdJxG6W7ToOMzhyCH7Y,3963
|
|
122
129
|
iwa/tools/reset_env.py,sha256=lHWMUatl4n6KNCluX-egA9uSt0xSH9m48gt4Lz8GW28,3831
|
|
123
130
|
iwa/tools/reset_tenderly.py,sha256=usKfOLrQvdCzEncueg-Sz3spqX80vHPQmbh2tIygo8o,11295
|
|
@@ -131,7 +138,7 @@ iwa/tui/workers.py,sha256=lvzbIS375_H1rj7-9d-w0PKnkDJ4lW_13aWzZRaX9fY,1192
|
|
|
131
138
|
iwa/tui/modals/__init__.py,sha256=OyrjWjaPqQAllZcUJ-Ac_e1PtTouJy8m1eGo132p-EA,130
|
|
132
139
|
iwa/tui/modals/base.py,sha256=q9dEV6We_SPxbMRh711amFDwAOBywD00Qg0jcqvh5LE,12060
|
|
133
140
|
iwa/tui/screens/__init__.py,sha256=j0brLsuVd9M8hM5LHH05E7manY3ZVj24yf7nFyGryp4,31
|
|
134
|
-
iwa/tui/screens/wallets.py,sha256=
|
|
141
|
+
iwa/tui/screens/wallets.py,sha256=8ClUpXMGk343WC2YejrXovIEW7zyJYy9XJzbJVx7zDQ,30824
|
|
135
142
|
iwa/tui/tests/test_app.py,sha256=F0tJthsyWzwNbHcGtiyDQtKDPn3m9N1qt2vMGiXrQTQ,3868
|
|
136
143
|
iwa/tui/tests/test_rpc.py,sha256=4m2HC-R5R9kO5pluo2G_CrTBQv63YYrdZNufTjtnGUk,4330
|
|
137
144
|
iwa/tui/tests/test_wallets_refactor.py,sha256=71G3HLbhTtgDy3ffVbYv0MFYRgdYd-NWGBdvdzW4M9c,998
|
|
@@ -141,7 +148,7 @@ iwa/tui/widgets/base.py,sha256=Z8FigMhsfD76PkFVERqMaotd-xwXfuFZm_8TmCMOsl4,3381
|
|
|
141
148
|
iwa/web/dependencies.py,sha256=0_dAJlRh6gKrUDRPKUe92eshFsg572yx_H0lQgSqGDA,2103
|
|
142
149
|
iwa/web/models.py,sha256=MSD9WPy_Nz_amWgoo2KSDTn4ZLv_AV0o0amuNtSf-68,3035
|
|
143
150
|
iwa/web/server.py,sha256=4ZLVFEKoGs_NoCcXMeyYzDNdxUXazjwHQaX7CR1pwHE,5239
|
|
144
|
-
iwa/web/routers/accounts.py,sha256=
|
|
151
|
+
iwa/web/routers/accounts.py,sha256=VhCHrwzRWqZcSW-tTEqFWT5hFl-IYEWpqXeuN8xM3-4,3922
|
|
145
152
|
iwa/web/routers/state.py,sha256=aEfeGFAOyaS6kWhXuWLrdvEbnQAeonKIWxJrQkqJ1GY,2198
|
|
146
153
|
iwa/web/routers/swap.py,sha256=8xycAytquR29ELxW3vx428W8s9bI_w_x2kpRhhJ0KXY,22630
|
|
147
154
|
iwa/web/routers/transactions.py,sha256=bRjfD7zcuX3orVIHzOMVsIkEtcE_pM_KCom4cdAKV6Q,5602
|
|
@@ -151,14 +158,14 @@ iwa/web/routers/olas/funding.py,sha256=f8fADNtbZEBFl-vuVKfas6os38Vot6K5tJBTenZmC
|
|
|
151
158
|
iwa/web/routers/olas/general.py,sha256=dPsBQppTGoQY1RztliUhseOHOZGeeCR10lhThD9kyXo,803
|
|
152
159
|
iwa/web/routers/olas/services.py,sha256=mDQh_Hp118Ek8_WIfhmZA_7HC2slw_aKRUjY6PPx91A,18099
|
|
153
160
|
iwa/web/routers/olas/staking.py,sha256=jktJ2C1Q9X4aC0tWJByN3sHpEXY0EIvr3rr4N0MtXXc,14081
|
|
154
|
-
iwa/web/static/app.js,sha256=
|
|
161
|
+
iwa/web/static/app.js,sha256=hBjUSivxf5Uyy2H6BR-rfdvF8e7qBoDPK23aY3dagNY,114418
|
|
155
162
|
iwa/web/static/index.html,sha256=q7s7plnMbN1Nkzr5bRxZgvgOFerUChEGIZW7SpAVtPc,28514
|
|
156
|
-
iwa/web/static/style.css,sha256=
|
|
157
|
-
iwa/web/tests/test_web_endpoints.py,sha256=
|
|
163
|
+
iwa/web/static/style.css,sha256=7i6T96pS7gXSLDZfyp_87gRlyB9rpsFWJEHJ-dRY1ug,24371
|
|
164
|
+
iwa/web/tests/test_web_endpoints.py,sha256=vA25YghHNB23sbmhD4ciesn_f_okSq0tjlkrSiKZ0rs,24007
|
|
158
165
|
iwa/web/tests/test_web_olas.py,sha256=0CVSsrncOeJ3x0ECV7mVLQV_CXZRrOqGiVjgLIi6hZ8,16308
|
|
159
166
|
iwa/web/tests/test_web_swap.py,sha256=7A4gBJFL01kIXPtW1E1J17SCsVc_0DmUn-R8kKrnnVA,2974
|
|
160
167
|
iwa/web/tests/test_web_swap_coverage.py,sha256=zGNrzlhZ_vWDCvWmLcoUwFgqxnrp_ACbo49AtWBS_Kw,5584
|
|
161
|
-
iwa-0.0.
|
|
168
|
+
iwa-0.0.58.dist-info/licenses/LICENSE,sha256=eIubm_IlBHPYRQlLNZKbBNKhJUUP3JH0A2miZUhAVfI,1078
|
|
162
169
|
tests/legacy_cow.py,sha256=oOkZvIxL70ReEoD9oHQbOD5GpjIr6AGNHcOCgfPlerU,8389
|
|
163
170
|
tests/legacy_safe.py,sha256=AssM2g13E74dNGODu_H0Q0y412lgqsrYnEzI97nm_Ts,2972
|
|
164
171
|
tests/legacy_transaction_retry_logic.py,sha256=D9RqZ7DBu61Xr2djBAodU2p9UE939LL-DnQXswX5iQk,1497
|
|
@@ -166,17 +173,17 @@ tests/legacy_tui.py,sha256=qu5-_C0H9dumElLFEWB71ACOgcA6bxbipgmWCBB12DM,15676
|
|
|
166
173
|
tests/legacy_wallets_screen.py,sha256=9hZnX-VhKgwH9w8MxbNdboRyNxLDhOakLKJECsw_vhc,19262
|
|
167
174
|
tests/legacy_web.py,sha256=q2ERIriaDHT3Q8axG2N3ucO7f2VSvV_WkuPR00DVko4,8577
|
|
168
175
|
tests/test_account_service.py,sha256=g_AIVT2jhlvUtbFTaCd-d15x4CmXJQaV66tlAgnaXwY,3745
|
|
169
|
-
tests/test_balance_service.py,sha256=
|
|
170
|
-
tests/test_chain.py,sha256=
|
|
176
|
+
tests/test_balance_service.py,sha256=tvvokP24TuYAlikZvOiLjsHCcnRO0Xc5RlRmBqdheug,4981
|
|
177
|
+
tests/test_chain.py,sha256=bDV6rL0twKovR722wax8aEzfr3wwcfQbapHJQPmg8kw,13957
|
|
171
178
|
tests/test_chain_interface.py,sha256=Wu0q0sREtmYBp7YvWrBIrrSTtqeQj18oJp2VmMUEMec,8312
|
|
172
179
|
tests/test_chain_interface_coverage.py,sha256=fvrVvw8-DMwdsSFKQHUhpbfutrVRxnnTc-tjB7Bb-jo,3327
|
|
173
|
-
tests/test_cli.py,sha256=
|
|
180
|
+
tests/test_cli.py,sha256=Pl4RC2xp1omiJUnL3Dza6pCmIoO29LJ0vGw33_ZpT5c,3980
|
|
174
181
|
tests/test_contract.py,sha256=tApHAxsfKGawYJWA9PhTNrOZUE0VVAq79ruIe3KxeWY,14412
|
|
175
182
|
tests/test_db.py,sha256=dmbrupj0qlUeiiycZ2mzMFjf7HrDa6tcqMPY8zpiKIk,5710
|
|
176
|
-
tests/test_drain_coverage.py,sha256=
|
|
183
|
+
tests/test_drain_coverage.py,sha256=oFpY7tFPXWe9WLh3z2D4L2GxuAJO6_txLNxJmtgZT7M,7208
|
|
177
184
|
tests/test_erc20.py,sha256=kNEw1afpm5EbXRNXkjpkBNZIy7Af1nqGlztKH5IWAwU,3074
|
|
178
185
|
tests/test_gnosis_plugin.py,sha256=XMoHBCTrnVBq9bXYPzMUIrhr95caucMVRxooCjKrzjg,3454
|
|
179
|
-
tests/test_keys.py,sha256=
|
|
186
|
+
tests/test_keys.py,sha256=Qk4n3QDZ2HjXYRvehdrSlvDS_q3NLRLMnCq45Eo1Q9o,17551
|
|
180
187
|
tests/test_legacy_wallet.py,sha256=Caj3xP1FijRyLKa-xKiZu6NCAsQRHjWbsnAarncAoA0,49798
|
|
181
188
|
tests/test_main.py,sha256=y2xr7HjCt4rHsxm8y6n24FKCteSHPyxC3DFuMcUgX1Y,475
|
|
182
189
|
tests/test_migration.py,sha256=fYoxzI3KqGh0cPV0bFcbvGrAnKcNlvnwjggG_uD0QGo,1789
|
|
@@ -186,14 +193,17 @@ tests/test_models.py,sha256=1bEfPiDVgEdtwFEzwecSPAHjCF8kjOPSMeQExJ7eCJ4,7107
|
|
|
186
193
|
tests/test_monitor.py,sha256=dRVS6EkTwfvGEOg7t0dVhs6M3oEZExBH7iBZe6hmk4M,7261
|
|
187
194
|
tests/test_multisend.py,sha256=IvXpwnC5xSDRCyCDGcMdO3L-eQegvdjAzHZB0FoVFUI,2685
|
|
188
195
|
tests/test_plugin_service.py,sha256=ZEe37kV_sv4Eb04032O1hZIoo9yf5gJo83ks7Grzrng,3767
|
|
189
|
-
tests/
|
|
190
|
-
tests/
|
|
196
|
+
tests/test_rate_limiter.py,sha256=gC-mVsTCqGbBoUxAllY_WS9kl12rBHQv7MNr1zdUdGQ,7334
|
|
197
|
+
tests/test_rate_limiter_retry.py,sha256=JPLc1pXpwUlt2ZytpWnHhTXFLbkQf0v4mi15p5PbdQg,4296
|
|
191
198
|
tests/test_reset_tenderly.py,sha256=GVoqbDT3n4_GnlKF5Lx-8ew15jT8I2hIPdTulQDb6dI,7215
|
|
192
199
|
tests/test_rpc_efficiency.py,sha256=EEcBlbUXEi9JVBorLU7mK7mmK0vcFt53KhefHr1oPQc,3741
|
|
193
|
-
tests/
|
|
200
|
+
tests/test_rpc_rate_limit.py,sha256=CS9cgRqlu2jwfB4M0Nw0VY52k8idhfB3GTkzzuKyhPE,1010
|
|
201
|
+
tests/test_rpc_rotation.py,sha256=jTJBAcGSomz3U1OFezaeaals5AUhLya1sJhVjw8ZtVE,12533
|
|
194
202
|
tests/test_rpc_view.py,sha256=sgZ53KEHl8VGb7WKYa0VI7Cdxbf8JH1SdroHYbWHjfQ,2031
|
|
195
|
-
tests/test_safe_coverage.py,sha256=
|
|
196
|
-
tests/
|
|
203
|
+
tests/test_safe_coverage.py,sha256=KBxKz64XkK8CgN0N0LTNVKakf8Wg8EpghcBlLmDFmLs,6119
|
|
204
|
+
tests/test_safe_executor.py,sha256=5XZ_TmafRjWr_r2XSMrBetIqxEsEbdZf-yt7_c9q_Vc,14226
|
|
205
|
+
tests/test_safe_integration.py,sha256=HrSKA04WYElbuR3oDTvbjuDh0fAGYN9C7NYr_BKKO_g,5319
|
|
206
|
+
tests/test_safe_service.py,sha256=5ULlj0fPZRwg-4fCBJplhm4Msr_Beof7W-Zf_JljZc8,5782
|
|
197
207
|
tests/test_service_manager_integration.py,sha256=I_BLUzEKrVTyg_8jqsUK0oFD3aQVPCRJ7z0gY8P-j04,2354
|
|
198
208
|
tests/test_service_manager_structure.py,sha256=zK506ucCXCBHcjPYKrKEuK1bgq0xsbawyL8Y-wahXf8,868
|
|
199
209
|
tests/test_service_transaction.py,sha256=IeqYhmRD-pIXffBJrBQwfPx-qnfNEJs0iPM3eCb8MLo,7054
|
|
@@ -205,14 +215,14 @@ tests/test_transfer_multisend.py,sha256=PErjNqNwN66TMh4oVa307re64Ucccg1LkXqB0Klk
|
|
|
205
215
|
tests/test_transfer_native.py,sha256=cDbb4poV_veIw6eHpokrHe9yUndOjA6rQhrHd_IY3HQ,7445
|
|
206
216
|
tests/test_transfer_security.py,sha256=gdpC6ybdXQbQgILbAQ0GqjWdwn9AJRNR3B_7TYg0NxI,3617
|
|
207
217
|
tests/test_transfer_structure.py,sha256=Q2rHB8QotipbvPuwL5hbgwcQG-DE-1RFXgoyuFyxpPQ,1172
|
|
208
|
-
tests/test_transfer_swap_unit.py,sha256=
|
|
218
|
+
tests/test_transfer_swap_unit.py,sha256=XkHuitzbOl-Fgzxx26sPtBI7Tlp-B2tHILryIE_jD_E,5056
|
|
209
219
|
tests/test_ui_coverage.py,sha256=N-7uhPlKOXCKyS32VjwG3JQRnAS1PoAJxR-InaOZtCQ,2423
|
|
210
220
|
tests/test_utils.py,sha256=vkP49rYNI8BRzLpWR3WnKdDr8upeZjZcs7Rx0pjbQMo,1292
|
|
211
221
|
tests/test_workers.py,sha256=MInwdkFY5LdmFB3o1odIaSD7AQZb3263hNafO1De5PE,2793
|
|
212
222
|
tools/create_and_stake_service.py,sha256=1xwy_bJQI1j9yIQ968Oc9Db_F6mk1659LuuZntTASDE,3742
|
|
213
223
|
tools/verify_drain.py,sha256=PkMjblyOOAuQge88FwfEzRtCYeEtJxXhPBmtQYCoQ-8,6743
|
|
214
|
-
iwa-0.0.
|
|
215
|
-
iwa-0.0.
|
|
216
|
-
iwa-0.0.
|
|
217
|
-
iwa-0.0.
|
|
218
|
-
iwa-0.0.
|
|
224
|
+
iwa-0.0.58.dist-info/METADATA,sha256=Gl_qD0GNnfLLm-j4s4FTihXqwZbNB1yQ4aiclOfCQ8c,7337
|
|
225
|
+
iwa-0.0.58.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
226
|
+
iwa-0.0.58.dist-info/entry_points.txt,sha256=nwB6kscrfA7M00pYmL2j-sBH6eF6h2ga9IK1BZxdiyQ,241
|
|
227
|
+
iwa-0.0.58.dist-info/top_level.txt,sha256=kedS9cRUbm4JE2wYeabIXilhHjN8KCw0IGbqqqsw0Bs,16
|
|
228
|
+
iwa-0.0.58.dist-info/RECORD,,
|
tests/test_balance_service.py
CHANGED
|
@@ -131,47 +131,6 @@ def test_get_erc20_balance_wei_account_not_found(
|
|
|
131
131
|
assert result is None
|
|
132
132
|
|
|
133
133
|
|
|
134
|
-
def test_get_erc20_balance_with_retry_success(
|
|
135
|
-
balance_service, mock_chain_interfaces, mock_account_service
|
|
136
|
-
):
|
|
137
|
-
"""Test get_erc20_balance_with_retry succeeds on first try."""
|
|
138
|
-
with patch("iwa.core.services.balance.ERC20Contract") as mock_erc20:
|
|
139
|
-
mock_erc20.return_value.balance_of_eth.return_value = 50.0
|
|
140
|
-
|
|
141
|
-
result = balance_service.get_erc20_balance_with_retry("0xAccount", "DAI", "gnosis")
|
|
142
|
-
|
|
143
|
-
assert result == 50.0
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
def test_get_erc20_balance_with_retry_fails_then_succeeds(
|
|
147
|
-
balance_service, mock_chain_interfaces, mock_account_service
|
|
148
|
-
):
|
|
149
|
-
"""Test get_erc20_balance_with_retry retries on failure."""
|
|
150
|
-
with patch("iwa.core.services.balance.ERC20Contract") as mock_erc20, patch("time.sleep"):
|
|
151
|
-
mock_erc20.return_value.balance_of_eth.side_effect = [
|
|
152
|
-
Exception("Network error"),
|
|
153
|
-
25.0,
|
|
154
|
-
]
|
|
155
|
-
|
|
156
|
-
result = balance_service.get_erc20_balance_with_retry(
|
|
157
|
-
"0xAccount", "DAI", "gnosis", retries=3
|
|
158
|
-
)
|
|
159
|
-
|
|
160
|
-
assert result == 25.0
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
def test_get_erc20_balance_with_retry_all_attempts_fail(
|
|
164
|
-
balance_service, mock_chain_interfaces, mock_account_service
|
|
165
|
-
):
|
|
166
|
-
"""Test get_erc20_balance_with_retry returns None after all retries fail."""
|
|
167
|
-
with patch("iwa.core.services.balance.ERC20Contract") as mock_erc20, patch("time.sleep"):
|
|
168
|
-
mock_erc20.return_value.balance_of_eth.side_effect = Exception("Network error")
|
|
169
|
-
|
|
170
|
-
result = balance_service.get_erc20_balance_with_retry(
|
|
171
|
-
"0xAccount", "DAI", "gnosis", retries=3
|
|
172
|
-
)
|
|
173
|
-
|
|
174
|
-
assert result is None
|
|
175
134
|
|
|
176
135
|
|
|
177
136
|
def test_balance_service_with_wallet(mock_account_service):
|
tests/test_chain.py
CHANGED
|
@@ -124,9 +124,7 @@ def test_get_native_balance(mock_web3):
|
|
|
124
124
|
assert ci.get_native_balance_eth("0xAddress") == 1.0
|
|
125
125
|
|
|
126
126
|
|
|
127
|
-
# NOTE:
|
|
128
|
-
# from ChainInterface for security reasons. Transaction signing is now handled exclusively
|
|
129
|
-
# through TransactionService.sign_and_send() which uses KeyStorage internally.
|
|
127
|
+
# NOTE: sign_and_send_transaction tests are in test_wallet.py - method moved to Wallet class
|
|
130
128
|
|
|
131
129
|
|
|
132
130
|
def test_estimate_gas(mock_web3):
|
|
@@ -156,11 +154,19 @@ def test_calculate_transaction_params(mock_web3):
|
|
|
156
154
|
ci.web3.eth.get_transaction_count.return_value = 5
|
|
157
155
|
ci.web3.eth.gas_price = 20
|
|
158
156
|
|
|
157
|
+
# Mock for EIP-1559 check (disable it for simple test)
|
|
158
|
+
ci.web3.eth.get_block.return_value = {} # No baseFeePerGas
|
|
159
|
+
|
|
159
160
|
with patch.object(ci, "estimate_gas", return_value=1000):
|
|
160
161
|
params = ci.calculate_transaction_params(MagicMock(), {"from": "0xSender"})
|
|
161
162
|
assert params["nonce"] == 5
|
|
162
163
|
assert params["gas"] == 1000
|
|
163
|
-
|
|
164
|
+
# If EIP-1559 is disabled by the mock above, it uses gasPrice
|
|
165
|
+
if "gasPrice" in params:
|
|
166
|
+
assert params["gasPrice"] == 20
|
|
167
|
+
else:
|
|
168
|
+
assert "maxFeePerGas" in params
|
|
169
|
+
assert "maxPriorityFeePerGas" in params
|
|
164
170
|
|
|
165
171
|
|
|
166
172
|
def test_wait_for_no_pending_tx(mock_web3):
|
|
@@ -237,10 +243,12 @@ def test_rotate_rpc(mock_web3):
|
|
|
237
243
|
assert ci._current_rpc_index == 1
|
|
238
244
|
|
|
239
245
|
# Rotate 2
|
|
246
|
+
ci._last_rotation_time = 0 # Bypass cooldown
|
|
240
247
|
assert ci.rotate_rpc() is True
|
|
241
248
|
assert ci._current_rpc_index == 2
|
|
242
249
|
|
|
243
250
|
# Rotate 3 (back to 0)
|
|
251
|
+
ci._last_rotation_time = 0 # Bypass cooldown
|
|
244
252
|
assert ci.rotate_rpc() is True
|
|
245
253
|
assert ci._current_rpc_index == 0
|
|
246
254
|
|
|
@@ -286,6 +294,7 @@ def test_chain_interface_with_real_chains():
|
|
|
286
294
|
|
|
287
295
|
# Mock health check to pass
|
|
288
296
|
with patch.object(interface, "check_rpc_health", return_value=True):
|
|
297
|
+
interface._last_rotation_time = 0 # Bypass cooldown
|
|
289
298
|
rotated = interface.rotate_rpc()
|
|
290
299
|
assert rotated is True
|
|
291
300
|
|
tests/test_cli.py
CHANGED
|
@@ -61,11 +61,11 @@ def mock_wallet():
|
|
|
61
61
|
def test_account_create(cli, mock_key_storage):
|
|
62
62
|
result = runner.invoke(cli, ["wallet", "create", "--tag", "test"])
|
|
63
63
|
assert result.exit_code == 0
|
|
64
|
-
mock_key_storage.
|
|
64
|
+
mock_key_storage.generate_new_account.assert_called_with("test")
|
|
65
65
|
|
|
66
66
|
|
|
67
67
|
def test_account_create_error(cli, mock_key_storage):
|
|
68
|
-
mock_key_storage.
|
|
68
|
+
mock_key_storage.generate_new_account.side_effect = ValueError("Error creating account")
|
|
69
69
|
result = runner.invoke(cli, ["wallet", "create", "--tag", "test"])
|
|
70
70
|
assert result.exit_code == 1
|
|
71
71
|
assert "Error: Error creating account" in result.stdout
|
tests/test_drain_coverage.py
CHANGED
|
@@ -94,14 +94,20 @@ def test_claim_rewards_success_no_event(mock_drain_manager):
|
|
|
94
94
|
assert amount == 1000000000000000000
|
|
95
95
|
|
|
96
96
|
|
|
97
|
-
def
|
|
98
|
-
"""Test withdraw_rewards
|
|
99
|
-
mock_drain_manager.service.multisig_address = "
|
|
97
|
+
def test_withdraw_rewards_fallback_to_master(mock_drain_manager):
|
|
98
|
+
"""Test withdraw_rewards falls back to master account when not configured."""
|
|
99
|
+
mock_drain_manager.service.multisig_address = "0x1111111111111111111111111111111111111111"
|
|
100
100
|
mock_drain_manager.olas_config.withdrawal_address = None
|
|
101
|
+
mock_drain_manager.wallet.master_account.address = "0x2222222222222222222222222222222222222222"
|
|
101
102
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
with patch("iwa.plugins.olas.service_manager.drain.ERC20Contract") as mock_erc20_cls:
|
|
104
|
+
mock_erc20 = mock_erc20_cls.return_value
|
|
105
|
+
mock_erc20.balance_of_wei.return_value = 0
|
|
106
|
+
|
|
107
|
+
success, amount = mock_drain_manager.withdraw_rewards()
|
|
108
|
+
# If balance is 0, it logs info and returns (False, 0) in drain.py
|
|
109
|
+
assert not success
|
|
110
|
+
assert amount == 0
|
|
105
111
|
|
|
106
112
|
|
|
107
113
|
def test_drain_service_no_service(mock_drain_manager):
|
tests/test_keys.py
CHANGED
|
@@ -52,7 +52,7 @@ def mock_account():
|
|
|
52
52
|
|
|
53
53
|
def create_side_effect():
|
|
54
54
|
# Skip the first address if it's reserved for the master account
|
|
55
|
-
# (to avoid overwriting master if
|
|
55
|
+
# (to avoid overwriting master if generate_new_account is called immediately)
|
|
56
56
|
addr = next(addresses)
|
|
57
57
|
if addr == "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4":
|
|
58
58
|
addr = next(addresses)
|
|
@@ -207,7 +207,7 @@ def test_keystorage_save(
|
|
|
207
207
|
assert "accounts" in data
|
|
208
208
|
|
|
209
209
|
|
|
210
|
-
def
|
|
210
|
+
def test_keystorage_generate_new_account(
|
|
211
211
|
tmp_path, mock_secrets, mock_account, mock_aesgcm, mock_scrypt, mock_bip_utils
|
|
212
212
|
):
|
|
213
213
|
"""Test creating additional accounts."""
|
|
@@ -215,21 +215,21 @@ def test_keystorage_create_account(
|
|
|
215
215
|
storage = KeyStorage(wallet_path, password="test_password")
|
|
216
216
|
|
|
217
217
|
# Master created in init
|
|
218
|
-
enc_account = storage.
|
|
218
|
+
enc_account = storage.generate_new_account("tag")
|
|
219
219
|
assert enc_account.tag == "tag"
|
|
220
220
|
assert len(storage.accounts) == 2 # master + tag
|
|
221
221
|
|
|
222
222
|
|
|
223
|
-
def
|
|
223
|
+
def test_keystorage_generate_new_account_duplicate_tag(
|
|
224
224
|
tmp_path, mock_secrets, mock_account, mock_aesgcm, mock_scrypt, mock_bip_utils
|
|
225
225
|
):
|
|
226
226
|
"""Test creating account with duplicate tag raises error."""
|
|
227
227
|
wallet_path = tmp_path / "wallet.json"
|
|
228
228
|
storage = KeyStorage(wallet_path, password="test_password")
|
|
229
|
-
storage.
|
|
229
|
+
storage.generate_new_account("tag")
|
|
230
230
|
|
|
231
|
-
with pytest.raises(ValueError, match="already
|
|
232
|
-
storage.
|
|
231
|
+
with pytest.raises(ValueError, match="already used"):
|
|
232
|
+
storage.generate_new_account("tag")
|
|
233
233
|
|
|
234
234
|
|
|
235
235
|
def test_keystorage_get_private_key(tmp_path, mock_secrets, mock_account, mock_aesgcm, mock_scrypt):
|
|
@@ -246,7 +246,7 @@ def test_keystorage_sign_message(tmp_path, mock_secrets, mock_account, mock_aesg
|
|
|
246
246
|
"""Test message signing."""
|
|
247
247
|
wallet_path = tmp_path / "wallet.json"
|
|
248
248
|
storage = KeyStorage(wallet_path, password="test_password")
|
|
249
|
-
storage.
|
|
249
|
+
storage.generate_new_account("tag")
|
|
250
250
|
|
|
251
251
|
mock_signed_msg = MagicMock()
|
|
252
252
|
mock_signed_msg.signature = b"signature"
|
|
@@ -262,7 +262,7 @@ def test_keystorage_sign_transaction(
|
|
|
262
262
|
"""Test transaction signing."""
|
|
263
263
|
wallet_path = tmp_path / "wallet.json"
|
|
264
264
|
storage = KeyStorage(wallet_path, password="test_password")
|
|
265
|
-
storage.
|
|
265
|
+
storage.generate_new_account("tag")
|
|
266
266
|
|
|
267
267
|
tx = {
|
|
268
268
|
"to": "0x0000000000000000000000000000000000000000",
|
|
@@ -295,7 +295,7 @@ def test_keystorage_get_account(tmp_path, mock_secrets, mock_account, mock_aesgc
|
|
|
295
295
|
"""Test getting account by address or tag."""
|
|
296
296
|
wallet_path = tmp_path / "wallet.json"
|
|
297
297
|
storage = KeyStorage(wallet_path, password="test_password")
|
|
298
|
-
acc1 = storage.
|
|
298
|
+
acc1 = storage.generate_new_account("tag")
|
|
299
299
|
|
|
300
300
|
# Get by address
|
|
301
301
|
acct = storage.get_account(acc1.address)
|
|
@@ -312,7 +312,7 @@ def test_keystorage_get_tag_by_address(
|
|
|
312
312
|
"""Test getting tag by address."""
|
|
313
313
|
wallet_path = tmp_path / "wallet.json"
|
|
314
314
|
storage = KeyStorage(wallet_path, password="test_password")
|
|
315
|
-
acc = storage.
|
|
315
|
+
acc = storage.generate_new_account("tag")
|
|
316
316
|
|
|
317
317
|
assert storage.get_tag_by_address(acc.address) == "tag"
|
|
318
318
|
master = storage.get_account("master")
|
|
@@ -326,7 +326,7 @@ def test_keystorage_get_address_by_tag(
|
|
|
326
326
|
"""Test getting address by tag."""
|
|
327
327
|
wallet_path = tmp_path / "wallet.json"
|
|
328
328
|
storage = KeyStorage(wallet_path, password="test_password")
|
|
329
|
-
acc = storage.
|
|
329
|
+
acc = storage.generate_new_account("tag")
|
|
330
330
|
|
|
331
331
|
assert storage.get_address_by_tag("tag") == acc.address
|
|
332
332
|
assert storage.get_address_by_tag("unknown") is None
|
|
@@ -348,10 +348,10 @@ def test_keystorage_master_account_fallback(tmp_path, mock_secrets):
|
|
|
348
348
|
data = {"accounts": {enc_account.address: enc_account.model_dump()}}
|
|
349
349
|
wallet_path.write_text(json.dumps(data))
|
|
350
350
|
|
|
351
|
-
# Patch
|
|
352
|
-
with patch.object(KeyStorage, "
|
|
351
|
+
# Patch generate_new_account to prevent auto-creation of master
|
|
352
|
+
with patch.object(KeyStorage, "generate_new_account"):
|
|
353
353
|
storage = KeyStorage(wallet_path, password="test_password")
|
|
354
|
-
# Manually add the account since
|
|
354
|
+
# Manually add the account since generate_new_account is mocked
|
|
355
355
|
storage.accounts[enc_account.address] = enc_account
|
|
356
356
|
|
|
357
357
|
# Should return the first account if master not found
|
|
@@ -369,14 +369,14 @@ def test_keystorage_master_account_success(
|
|
|
369
369
|
assert storage.master_account.address is not None
|
|
370
370
|
|
|
371
371
|
|
|
372
|
-
def
|
|
372
|
+
def test_keystorage_generate_new_account_default_tag(
|
|
373
373
|
tmp_path, mock_secrets, mock_account, mock_aesgcm, mock_scrypt, mock_bip_utils
|
|
374
374
|
):
|
|
375
375
|
"""Test creating account with custom tag."""
|
|
376
376
|
wallet_path = tmp_path / "wallet.json"
|
|
377
377
|
storage = KeyStorage(wallet_path, password="test_password")
|
|
378
378
|
|
|
379
|
-
acc = storage.
|
|
379
|
+
acc = storage.generate_new_account("foo")
|
|
380
380
|
assert acc.tag == "foo"
|
|
381
381
|
assert len(storage.accounts) == 2
|
|
382
382
|
|
|
@@ -418,8 +418,8 @@ def test_keystorage_get_account_none(tmp_path, mock_secrets):
|
|
|
418
418
|
data = {"accounts": {}}
|
|
419
419
|
wallet_path.write_text(json.dumps(data))
|
|
420
420
|
|
|
421
|
-
# Patch
|
|
422
|
-
with patch.object(KeyStorage, "
|
|
421
|
+
# Patch generate_new_account to prevent auto-creation
|
|
422
|
+
with patch.object(KeyStorage, "generate_new_account"):
|
|
423
423
|
storage = KeyStorage(wallet_path, password="test_password")
|
|
424
424
|
assert storage.get_account("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4") is None
|
|
425
425
|
assert storage.get_account("tag") is None
|
|
@@ -429,7 +429,7 @@ def test_get_account_info(tmp_path, mock_secrets, mock_account, mock_aesgcm, moc
|
|
|
429
429
|
"""Test get_account_info alias."""
|
|
430
430
|
wallet_path = tmp_path / "wallet.json"
|
|
431
431
|
storage = KeyStorage(wallet_path, password="test_password")
|
|
432
|
-
storage.
|
|
432
|
+
storage.generate_new_account("tag1")
|
|
433
433
|
|
|
434
434
|
info = storage.get_account_info("tag1")
|
|
435
435
|
assert info.address == storage.find_stored_account("tag1").address
|
|
@@ -441,7 +441,7 @@ def test_get_signer(tmp_path, mock_secrets, mock_account, mock_aesgcm, mock_scry
|
|
|
441
441
|
"""Test get_signer method."""
|
|
442
442
|
wallet_path = tmp_path / "wallet.json"
|
|
443
443
|
storage = KeyStorage(wallet_path, password="test_password")
|
|
444
|
-
storage.
|
|
444
|
+
storage.generate_new_account("tag")
|
|
445
445
|
|
|
446
446
|
# Test valid signer retrieval
|
|
447
447
|
signer = storage.get_signer("tag")
|
|
@@ -469,7 +469,7 @@ def test_keystorage_edge_cases_with_real_storage(tmp_path):
|
|
|
469
469
|
storage = KeyStorage(wallet_path, password="password")
|
|
470
470
|
|
|
471
471
|
# Create account
|
|
472
|
-
encrypted_acc = storage.
|
|
472
|
+
encrypted_acc = storage.generate_new_account("acc1")
|
|
473
473
|
assert encrypted_acc is not None
|
|
474
474
|
|
|
475
475
|
# Get by address
|
|
@@ -484,7 +484,7 @@ def test_keystorage_edge_cases_with_real_storage(tmp_path):
|
|
|
484
484
|
assert storage.get_account("acc1") is None
|
|
485
485
|
|
|
486
486
|
# Get private key via internal method
|
|
487
|
-
encrypted_acc2 = storage.
|
|
487
|
+
encrypted_acc2 = storage.generate_new_account("acc2")
|
|
488
488
|
pk = storage._get_private_key(encrypted_acc2.address)
|
|
489
489
|
assert pk is not None
|
|
490
490
|
|
tests/test_rate_limiter.py
CHANGED
|
@@ -193,7 +193,7 @@ class TestRateLimitRotationInterplay:
|
|
|
193
193
|
rate_limit_error = Exception("Error 429: Too Many Requests")
|
|
194
194
|
result = ci._handle_rpc_error(rate_limit_error)
|
|
195
195
|
|
|
196
|
-
# Should have triggered backoff
|
|
196
|
+
# Should have triggered retry but NO backoff (skipped for single RPC)
|
|
197
197
|
assert result["should_retry"] is True
|
|
198
198
|
assert result["rotated"] is False
|
|
199
|
-
assert ci._rate_limiter.get_status()["in_backoff"] is
|
|
199
|
+
assert ci._rate_limiter.get_status()["in_backoff"] is False
|