iwa 0.0.58__py3-none-any.whl → 0.0.59__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 +32 -21
- iwa/core/chain/rate_limiter.py +0 -6
- iwa/core/chainlist.py +15 -10
- iwa/core/cli.py +3 -0
- iwa/core/contracts/cache.py +1 -1
- iwa/core/contracts/contract.py +1 -0
- iwa/core/contracts/decoder.py +10 -4
- iwa/core/http.py +31 -0
- iwa/core/ipfs.py +11 -19
- iwa/core/keys.py +10 -4
- iwa/core/models.py +1 -3
- iwa/core/pricing.py +3 -21
- iwa/core/rpc_monitor.py +1 -0
- iwa/core/services/balance.py +0 -1
- iwa/core/services/safe.py +8 -2
- iwa/core/services/safe_executor.py +52 -18
- iwa/core/services/transaction.py +32 -12
- iwa/core/services/transfer/erc20.py +0 -1
- iwa/core/services/transfer/native.py +1 -1
- iwa/core/tests/test_gnosis_fee.py +6 -2
- iwa/core/tests/test_ipfs.py +1 -1
- iwa/core/tests/test_regression_fixes.py +3 -6
- iwa/core/utils.py +2 -0
- iwa/core/wallet.py +3 -1
- iwa/plugins/olas/constants.py +15 -5
- iwa/plugins/olas/contracts/activity_checker.py +3 -3
- iwa/plugins/olas/contracts/staking.py +0 -1
- iwa/plugins/olas/events.py +15 -13
- iwa/plugins/olas/importer.py +26 -20
- iwa/plugins/olas/plugin.py +16 -14
- iwa/plugins/olas/service_manager/drain.py +1 -3
- iwa/plugins/olas/service_manager/lifecycle.py +9 -9
- iwa/plugins/olas/service_manager/staking.py +11 -6
- iwa/plugins/olas/tests/test_olas_archiving.py +25 -15
- iwa/plugins/olas/tests/test_olas_integration.py +49 -29
- iwa/plugins/olas/tests/test_service_manager.py +8 -10
- iwa/plugins/olas/tests/test_service_manager_errors.py +5 -4
- iwa/plugins/olas/tests/test_service_manager_flows.py +6 -5
- iwa/plugins/olas/tests/test_service_staking.py +64 -38
- iwa/tools/drain_accounts.py +2 -1
- iwa/tools/reset_env.py +2 -1
- iwa/tools/test_chainlist.py +5 -1
- iwa/tui/screens/wallets.py +1 -3
- iwa/web/routers/olas/services.py +10 -5
- {iwa-0.0.58.dist-info → iwa-0.0.59.dist-info}/METADATA +1 -1
- {iwa-0.0.58.dist-info → iwa-0.0.59.dist-info}/RECORD +58 -57
- tests/test_balance_service.py +0 -2
- tests/test_chain.py +1 -2
- tests/test_rate_limiter_retry.py +2 -7
- tests/test_rpc_efficiency.py +4 -1
- tests/test_rpc_rate_limit.py +1 -0
- tests/test_rpc_rotation.py +4 -4
- tests/test_safe_executor.py +76 -50
- tests/test_safe_integration.py +11 -6
- {iwa-0.0.58.dist-info → iwa-0.0.59.dist-info}/WHEEL +0 -0
- {iwa-0.0.58.dist-info → iwa-0.0.59.dist-info}/entry_points.txt +0 -0
- {iwa-0.0.58.dist-info → iwa-0.0.59.dist-info}/licenses/LICENSE +0 -0
- {iwa-0.0.58.dist-info → iwa-0.0.59.dist-info}/top_level.txt +0 -0
iwa/tools/reset_env.py
CHANGED
|
@@ -25,6 +25,7 @@ def _reset_tenderly(profile: int) -> None:
|
|
|
25
25
|
env = {"PYTHONPATH": "src"}
|
|
26
26
|
# Merge with current env to keep PATH etc.
|
|
27
27
|
import os
|
|
28
|
+
|
|
28
29
|
full_env = os.environ.copy()
|
|
29
30
|
full_env.update(env)
|
|
30
31
|
|
|
@@ -110,7 +111,7 @@ def main():
|
|
|
110
111
|
parser.add_argument(
|
|
111
112
|
"--keep-data",
|
|
112
113
|
action="store_true",
|
|
113
|
-
help="Reset only Tenderly, keeping config.yaml and wallet.json intact."
|
|
114
|
+
help="Reset only Tenderly, keeping config.yaml and wallet.json intact.",
|
|
114
115
|
)
|
|
115
116
|
args = parser.parse_args()
|
|
116
117
|
|
iwa/tools/test_chainlist.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Script to verify ChainlistRPC functionality."""
|
|
2
|
+
|
|
2
3
|
from iwa.core.chainlist import ChainlistRPC
|
|
3
4
|
|
|
4
5
|
|
|
@@ -32,7 +33,10 @@ def main() -> None:
|
|
|
32
33
|
|
|
33
34
|
print("\nTracking info for first 5 RPCs:")
|
|
34
35
|
for node in all_rpcs[:5]:
|
|
35
|
-
print(
|
|
36
|
+
print(
|
|
37
|
+
f" - {node.url}: Tracking={node.is_tracking} (Privacy={node.privacy}, Tracking={node.tracking})"
|
|
38
|
+
)
|
|
39
|
+
|
|
36
40
|
|
|
37
41
|
if __name__ == "__main__":
|
|
38
42
|
main()
|
iwa/tui/screens/wallets.py
CHANGED
|
@@ -330,9 +330,7 @@ class WalletsScreen(VerticalScroll):
|
|
|
330
330
|
|
|
331
331
|
def _fetch_single_token_balance(self, address: str, token: str, chain_name: str) -> str:
|
|
332
332
|
"""Fetch a single token balance using BalanceService."""
|
|
333
|
-
val_token = self.wallet.balance_service.get_erc20_balance_eth(
|
|
334
|
-
address, token, chain_name
|
|
335
|
-
)
|
|
333
|
+
val_token = self.wallet.balance_service.get_erc20_balance_eth(address, token, chain_name)
|
|
336
334
|
val_token_str = f"{val_token:.4f}" if val_token is not None else "-"
|
|
337
335
|
|
|
338
336
|
if val_token is not None:
|
iwa/web/routers/olas/services.py
CHANGED
|
@@ -41,7 +41,9 @@ def _determine_bond_amount(req: CreateServiceRequest) -> int:
|
|
|
41
41
|
|
|
42
42
|
if req.token_address and req.staking_contract:
|
|
43
43
|
# If a contract is specified, we MUST use its requirements
|
|
44
|
-
staking_name =
|
|
44
|
+
staking_name = (
|
|
45
|
+
wallet.account_service.get_tag_by_address(req.staking_contract) or req.staking_contract
|
|
46
|
+
)
|
|
45
47
|
logger.info(f"Fetching requirements from {staking_name}...")
|
|
46
48
|
staking_contract = StakingContract(req.staking_contract, req.chain)
|
|
47
49
|
reqs = staking_contract.get_requirements()
|
|
@@ -73,6 +75,7 @@ def _determine_bond_amount(req: CreateServiceRequest) -> int:
|
|
|
73
75
|
)
|
|
74
76
|
return bond_amount
|
|
75
77
|
|
|
78
|
+
|
|
76
79
|
@router.post(
|
|
77
80
|
"/create",
|
|
78
81
|
summary="Create Service",
|
|
@@ -81,7 +84,6 @@ def _determine_bond_amount(req: CreateServiceRequest) -> int:
|
|
|
81
84
|
def create_service(req: CreateServiceRequest, auth: bool = Depends(verify_auth)):
|
|
82
85
|
"""Create a new Olas service using spin_up for seamless deployment."""
|
|
83
86
|
try:
|
|
84
|
-
|
|
85
87
|
from iwa.plugins.olas.contracts.staking import StakingContract
|
|
86
88
|
from iwa.plugins.olas.service_manager import ServiceManager
|
|
87
89
|
|
|
@@ -196,7 +198,9 @@ def deploy_service(
|
|
|
196
198
|
if staking_contract:
|
|
197
199
|
try:
|
|
198
200
|
staking_obj = StakingContract(staking_contract, service.chain_name)
|
|
199
|
-
staking_name =
|
|
201
|
+
staking_name = (
|
|
202
|
+
wallet.account_service.get_tag_by_address(staking_contract) or staking_contract
|
|
203
|
+
)
|
|
200
204
|
logger.info(f"Will stake in {staking_name} after deployment")
|
|
201
205
|
except Exception as e:
|
|
202
206
|
logger.warning(f"Could not set up staking contract: {e}")
|
|
@@ -230,7 +234,6 @@ def deploy_service(
|
|
|
230
234
|
raise HTTPException(status_code=400, detail=str(e)) from None
|
|
231
235
|
|
|
232
236
|
|
|
233
|
-
|
|
234
237
|
def _resolve_service_accounts(service) -> dict:
|
|
235
238
|
"""Resolve basic accounts info including owner_signer if applicable."""
|
|
236
239
|
accounts = {}
|
|
@@ -279,7 +282,9 @@ def _resolve_service_balances(service, chain: str) -> dict:
|
|
|
279
282
|
if role == "owner" and stored and hasattr(stored, "signers") and stored.signers:
|
|
280
283
|
signer_addr = stored.signers[0]
|
|
281
284
|
s_native = wallet.get_native_balance_eth(signer_addr, chain)
|
|
282
|
-
s_olas_wei = wallet.balance_service.get_erc20_balance_wei(
|
|
285
|
+
s_olas_wei = wallet.balance_service.get_erc20_balance_wei(
|
|
286
|
+
signer_addr, "OLAS", chain
|
|
287
|
+
)
|
|
283
288
|
s_olas = float(s_olas_wei) / 1e18 if s_olas_wei else 0
|
|
284
289
|
s_stored = wallet.key_storage.find_stored_account(signer_addr)
|
|
285
290
|
balances["owner_signer"] = {
|
|
@@ -1,35 +1,36 @@
|
|
|
1
1
|
iwa/__init__.py,sha256=vu12UytYNREtMRvIWp6AfV1GgUe53XWwCMhYyqKAPgo,19
|
|
2
2
|
iwa/__main__.py,sha256=eJU5Uxeu9Y7shWg5dt5Mcq0pMC4wFVNWjeYGKSf4Apw,88
|
|
3
3
|
iwa/core/__init__.py,sha256=GJv4LJOXeZ3hgGvbt5I6omkoFkP2A9qhHjpDlOep9ik,24
|
|
4
|
-
iwa/core/chainlist.py,sha256=
|
|
5
|
-
iwa/core/cli.py,sha256=
|
|
4
|
+
iwa/core/chainlist.py,sha256=bcbv1P9R-RiCghullse0qVmqkTs1l4_ZOkOHZ0MzjtI,4097
|
|
5
|
+
iwa/core/cli.py,sha256=Qo0SXvgKFOd3Ru-LnX5zEXIaR7r3uwYoqwPhVShEqiQ,8315
|
|
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/
|
|
9
|
-
iwa/core/
|
|
8
|
+
iwa/core/http.py,sha256=3OB6j2E2TzhNbKJgpoRPvt20yu5NX_agCssDbxEUm8w,953
|
|
9
|
+
iwa/core/ipfs.py,sha256=xYpcg3Y8k_4FpDiZUQO_wmc8ldybET1ReM6CwrKrbz0,5423
|
|
10
|
+
iwa/core/keys.py,sha256=THDq1W1AALSTY1HULNYDYoPj1V0DbFZzGjhtZtXcrjU,24803
|
|
10
11
|
iwa/core/mnemonic.py,sha256=LiG1VmpydQoHQ0pHUJ1OIlrWJry47VSMnOqPM_Yk-O8,12930
|
|
11
|
-
iwa/core/models.py,sha256=
|
|
12
|
+
iwa/core/models.py,sha256=hSIjwWs7speLDlv4jxAT0Itr02jL_kMb2-yTFnuY6qs,14530
|
|
12
13
|
iwa/core/monitor.py,sha256=6hQHAdJIsyoOwnZ9KdYDk_k0mclgr94iFk8V6BtatFQ,7957
|
|
13
14
|
iwa/core/plugins.py,sha256=FLvOG4S397fKi0aTH1fWBEtexn4yvGv_QzGWqFrhSKE,1102
|
|
14
|
-
iwa/core/pricing.py,sha256=
|
|
15
|
-
iwa/core/rpc_monitor.py,sha256
|
|
15
|
+
iwa/core/pricing.py,sha256=xMihEHi0Mupu1nO5YwujafWLOZnd50Lj9fYQS_JDWTQ,4236
|
|
16
|
+
iwa/core/rpc_monitor.py,sha256=C6AX5pSs5TEE43u3nVlE9oZ-ISKn5pq1jMQb5xatZ-g,1662
|
|
16
17
|
iwa/core/secrets.py,sha256=5cPUtNVsAUKakNHFCaPOQ3aygAOs_FemSTNZpljqiRs,3920
|
|
17
18
|
iwa/core/tables.py,sha256=y7Cg67PAGHYVMVyAjbo_CQ9t2iz7UXE-OTuUHRyFRTo,2021
|
|
18
19
|
iwa/core/test.py,sha256=gey0dql5eajo1itOhgkSrgfyGWue2eSfpr0xzX3vc38,643
|
|
19
20
|
iwa/core/types.py,sha256=EfDfIwLajTNK-BP9K17QLOIsGCs8legplKI_bUD_NjM,1992
|
|
20
21
|
iwa/core/ui.py,sha256=DglmrI7XhUmOpLn9Nog9Cej4r-VT0JGFkuSNBx-XorQ,3131
|
|
21
|
-
iwa/core/utils.py,sha256=
|
|
22
|
-
iwa/core/wallet.py,sha256=
|
|
22
|
+
iwa/core/utils.py,sha256=FTYpIdQ1wnugD4lYU4TQ7d7_TlDs4CTUIhEpHGEJph4,4281
|
|
23
|
+
iwa/core/wallet.py,sha256=xSGFOK5Wzh-ctLGhBMK1BySlXN0Ircpztyk1an21QiQ,13129
|
|
23
24
|
iwa/core/chain/__init__.py,sha256=XJMmn0ed-_aVkY2iEMKpuTxPgIKBd41dexSVmEZTa-o,1604
|
|
24
25
|
iwa/core/chain/errors.py,sha256=9SEbhxZ-qASPkzt-DoI51qq0GRJVqRgqgL720gO7a64,1275
|
|
25
|
-
iwa/core/chain/interface.py,sha256=
|
|
26
|
+
iwa/core/chain/interface.py,sha256=FNb_M1Hl1FlgyC3FUPKH91RW7tF-wKJXQP4iOI14vGg,23798
|
|
26
27
|
iwa/core/chain/manager.py,sha256=cFEzh6pK5OyVhjhpeMAqhc9RnRDQR1DjIGiGKp-FXBI,1159
|
|
27
28
|
iwa/core/chain/models.py,sha256=WUhAighMKcFdbAUkPU_3dkGbWyAUpRJqXMHLcWFC1xg,5261
|
|
28
|
-
iwa/core/chain/rate_limiter.py,sha256=
|
|
29
|
+
iwa/core/chain/rate_limiter.py,sha256=6XnaB6i3Tvf-6YD4L-YBeJnKjAIuAxBGDvTmm1dQDTM,7924
|
|
29
30
|
iwa/core/contracts/__init__.py,sha256=P5GFY_pnuI02teqVY2U0t98bn1_SSPAbcAzRMpCdTi4,34
|
|
30
|
-
iwa/core/contracts/cache.py,sha256=
|
|
31
|
-
iwa/core/contracts/contract.py,sha256=
|
|
32
|
-
iwa/core/contracts/decoder.py,sha256=
|
|
31
|
+
iwa/core/contracts/cache.py,sha256=vN7ArNhNsSDr1rYHDMWsMm6VbSszBt4Xej9MeI-rkgc,4452
|
|
32
|
+
iwa/core/contracts/contract.py,sha256=TLZGF7BtMl2fr92B80Gp3ttnP4hJsdAG-raaFZiNLO8,13255
|
|
33
|
+
iwa/core/contracts/decoder.py,sha256=fe84N4wdVCADIz6ytT6IvC5NS_7uiosaXsMk5vRE414,5630
|
|
33
34
|
iwa/core/contracts/erc20.py,sha256=VqriOdUXej0ilTgpukpm1FUF_9sSrVMAPuEpIvyZ2SQ,2646
|
|
34
35
|
iwa/core/contracts/multisend.py,sha256=tSdBCWe7LSdBoKZ7z2QebmRFK4M2ln7H3kmJBeEb4Ho,2431
|
|
35
36
|
iwa/core/contracts/abis/erc20.json,sha256=vrdExMWcIogg_nO59j1Pmipmpa2Ulj3oCCdcdrrFVCE,16995
|
|
@@ -37,21 +38,21 @@ iwa/core/contracts/abis/multisend.json,sha256=BE8JbNQU_m1VsIppNK0GKP1E9R7Aor9YTr
|
|
|
37
38
|
iwa/core/contracts/abis/multisend_call_only.json,sha256=lamMZflFtsoBKcG4QgmLWKyTK1-TcIaTM-j3r23EqJU,287
|
|
38
39
|
iwa/core/services/__init__.py,sha256=ab5pYzmu3LrZLTO5N-plx6Rp4R0hBEnbbzsgz84zWGM,498
|
|
39
40
|
iwa/core/services/account.py,sha256=0l14qD8_-ZbN_hQUNa7bRZt0tkceHPPc4GHmB8UKqy4,2009
|
|
40
|
-
iwa/core/services/balance.py,sha256=
|
|
41
|
+
iwa/core/services/balance.py,sha256=MSCEzPRDPlHIjaWD1A2X2oIuiMz5MFJjD7sSHUxQ8OM,3324
|
|
41
42
|
iwa/core/services/plugin.py,sha256=GNNlbtELyHl7MNVChrypF76GYphxXduxDog4kx1MLi8,3277
|
|
42
|
-
iwa/core/services/safe.py,sha256=
|
|
43
|
-
iwa/core/services/safe_executor.py,sha256=
|
|
44
|
-
iwa/core/services/transaction.py,sha256=
|
|
43
|
+
iwa/core/services/safe.py,sha256=vqvpk7aIqHljaG1zYYpmKdW4mi5OVuoyXcpReISPYM0,15744
|
|
44
|
+
iwa/core/services/safe_executor.py,sha256=e7M4Z0w00W5H88I1Yf2qQGP_orI5FDDVSzgilhJaeQo,13509
|
|
45
|
+
iwa/core/services/transaction.py,sha256=FrGRWn1xo5rbGIr2ToZ2kPzapr3zmWW38oycyB87TK8,19971
|
|
45
46
|
iwa/core/services/transfer/__init__.py,sha256=ZJfshFxJRsp8rkOqfVvd1cqEzIJ9tqBJh8pc0l90GLk,5576
|
|
46
47
|
iwa/core/services/transfer/base.py,sha256=sohz-Ss2i-pGYGl4x9bD93cnYKcSvsXaXyvyRawvgQs,9043
|
|
47
|
-
iwa/core/services/transfer/erc20.py,sha256=
|
|
48
|
+
iwa/core/services/transfer/erc20.py,sha256=e6RD1_QcI_-iJvP85kj7aw4p6NnCPjZcm-QSKi14RRA,10104
|
|
48
49
|
iwa/core/services/transfer/multisend.py,sha256=MuOTjzUQoYg1eSixXKhJGBmB1c0ymLelvk4puHm_VGE,15194
|
|
49
|
-
iwa/core/services/transfer/native.py,sha256=
|
|
50
|
+
iwa/core/services/transfer/native.py,sha256=fZZJURW5kcNPEA_R9c5eG813F-7_odLcvdHLZqlUavQ,9900
|
|
50
51
|
iwa/core/services/transfer/swap.py,sha256=jsLCj_wc8Q4iWIXplcOIEtAvQnTpgTQF_5wrhQ6GjEk,12306
|
|
51
|
-
iwa/core/tests/test_gnosis_fee.py,sha256
|
|
52
|
-
iwa/core/tests/test_ipfs.py,sha256=
|
|
52
|
+
iwa/core/tests/test_gnosis_fee.py,sha256=-Qs4yQy8qMrsqWMA5DHYWiF0UEW7PpT3sekJbnKn-uM,3702
|
|
53
|
+
iwa/core/tests/test_ipfs.py,sha256=nhS1ZRAuc9_rtnBd9aJhG7RD5yzA1vWKqcek2Q16pj8,2774
|
|
53
54
|
iwa/core/tests/test_pricing.py,sha256=B2f8vx_JSdilIMu6cb8TxfVyr6kDLt5wN8ZCPvEAuOY,1876
|
|
54
|
-
iwa/core/tests/test_regression_fixes.py,sha256=
|
|
55
|
+
iwa/core/tests/test_regression_fixes.py,sha256=W53R5Gj-gj8lZJwO_PBVNE3h7pWybj0G99oDwJcCl3g,3972
|
|
55
56
|
iwa/core/tests/test_wallet.py,sha256=N8_gO7KkV5nqk_KcHqW_xOwNNKpDuXHeFgnala3bB84,9361
|
|
56
57
|
iwa/plugins/__init__.py,sha256=zy-DjOZn8GSgIETN2X_GAb9O6yk71t6ZRzeUgoZ52KA,23
|
|
57
58
|
iwa/plugins/gnosis/__init__.py,sha256=dpx0mE84eV-g5iZaH5nKivZJnoKWyRFX5rhdjowBwuU,114
|
|
@@ -65,19 +66,19 @@ iwa/plugins/gnosis/cow/types.py,sha256=-9VRiFhAkmN1iIJ95Pg7zLFSeXtkkW00sl13usxi3
|
|
|
65
66
|
iwa/plugins/gnosis/tests/test_cow.py,sha256=50bj9kZ-PwrZXIdTTTNlien5WdDWHhxI44dcB89jOc8,8809
|
|
66
67
|
iwa/plugins/gnosis/tests/test_safe.py,sha256=hQHVHBWQhGnuvzvx4U9fOWEwASJWwql42q6cfRcuAls,3218
|
|
67
68
|
iwa/plugins/olas/__init__.py,sha256=_NhBczzM61fhGYwGhnWfEeL8Jywyy_730GASe2BxzeQ,106
|
|
68
|
-
iwa/plugins/olas/constants.py,sha256=
|
|
69
|
-
iwa/plugins/olas/events.py,sha256=
|
|
70
|
-
iwa/plugins/olas/importer.py,sha256=
|
|
69
|
+
iwa/plugins/olas/constants.py,sha256=BbEDho_TAh10cCGsrlk2vP1OVrS_ZWBE_cAEITd_658,7838
|
|
70
|
+
iwa/plugins/olas/events.py,sha256=HHjYu4pN3tuZATIh8vGWWzDb7z9wuqhsaTqI3_4H0-I,6086
|
|
71
|
+
iwa/plugins/olas/importer.py,sha256=5xTtlQe5hO5bUCOg1sRuFkN2UcohYdJEQwfMm2JckyI,42088
|
|
71
72
|
iwa/plugins/olas/mech_reference.py,sha256=CaSCpQnQL4F7wOG6Ox6Zdoy-uNEQ78YBwVLILQZKL8Q,5782
|
|
72
73
|
iwa/plugins/olas/models.py,sha256=uXih8UcmBYj6PlxqP-cnyAiazJezjShjkCaN1Kqlb2I,4921
|
|
73
|
-
iwa/plugins/olas/plugin.py,sha256=
|
|
74
|
-
iwa/plugins/olas/contracts/activity_checker.py,sha256=
|
|
74
|
+
iwa/plugins/olas/plugin.py,sha256=kz21CxIGQw3Is6HC2dvKvFRIm9m1FRKHO0YgUuDEplQ,15650
|
|
75
|
+
iwa/plugins/olas/contracts/activity_checker.py,sha256=OXh0SFPGfcpeD665ay-I19LqcIx38qEz8o62dw0A9zE,5361
|
|
75
76
|
iwa/plugins/olas/contracts/base.py,sha256=y73aQbDq6l4zUpz_eQAg4MsLkTAEqjjupXlcvxjfgCI,240
|
|
76
77
|
iwa/plugins/olas/contracts/mech.py,sha256=dXYtyORc-oiu9ga5PtTquOFkoakb6BLGKvlUsteygIg,2767
|
|
77
78
|
iwa/plugins/olas/contracts/mech_marketplace.py,sha256=hMADl5MQGvT2wLRKu4vHGe4RrAZVq8Y2M_EvXWWz528,1554
|
|
78
79
|
iwa/plugins/olas/contracts/mech_marketplace_v1.py,sha256=ooF5uw1wxwYsoriGUGGxXxmaD8DtWZtK4TJBCUNTGtI,2501
|
|
79
80
|
iwa/plugins/olas/contracts/service.py,sha256=BDQKeCTCnBNrwKD1a8rrlLytpKG3CAdjr-s0ec-dsFY,8243
|
|
80
|
-
iwa/plugins/olas/contracts/staking.py,sha256=
|
|
81
|
+
iwa/plugins/olas/contracts/staking.py,sha256=kKF4Uc2cFr9_drKG5OzFgzKTdgGyHIM_PUa-L0LX9gU,18486
|
|
81
82
|
iwa/plugins/olas/contracts/abis/activity_checker.json,sha256=HT0IMbyTLMO71ITBKwoS950rHe772suPP4b8eDAodJ0,2230
|
|
82
83
|
iwa/plugins/olas/contracts/abis/mech.json,sha256=bMMCXInjE_2PTPnc_sIyS_H8pod5Sm_e-xTbKgZppKc,16369
|
|
83
84
|
iwa/plugins/olas/contracts/abis/mech_marketplace.json,sha256=KPnF-H_UATb3wdb_7o6ky_hSp5xwgvckD-QqylsWJLg,32468
|
|
@@ -92,17 +93,17 @@ iwa/plugins/olas/scripts/test_full_mech_flow.py,sha256=Fqoq5bn7Z_3YyRrnuqNAZy9cw
|
|
|
92
93
|
iwa/plugins/olas/scripts/test_simple_lifecycle.py,sha256=8T50tOZx3afeECSfCNAb0rAHNtYOsBaeXlMwKXElCk8,2099
|
|
93
94
|
iwa/plugins/olas/service_manager/__init__.py,sha256=GXiThMEY3nPgHUl1i-DLrF4h96z9jPxxI8Jepo2E1PM,1926
|
|
94
95
|
iwa/plugins/olas/service_manager/base.py,sha256=EBPg0ymqgtAb7ZvVSfTt31QYgv_6gp4UAc6je00NLAg,5009
|
|
95
|
-
iwa/plugins/olas/service_manager/drain.py,sha256=
|
|
96
|
-
iwa/plugins/olas/service_manager/lifecycle.py,sha256=
|
|
96
|
+
iwa/plugins/olas/service_manager/drain.py,sha256=Hoa8rTIDwp9xGf_0O-7Nvn58LMZ_8PTOTr2ETUY5TjY,12920
|
|
97
|
+
iwa/plugins/olas/service_manager/lifecycle.py,sha256=JCLGN7RjJbbPXXHOqvD64OKj2wH2NVh7o3mCBqJQEAQ,50570
|
|
97
98
|
iwa/plugins/olas/service_manager/mech.py,sha256=NVzVbEmyOe3wK92VEzCCOSuy3HDkEP1MSoVt7Av8Psk,27949
|
|
98
|
-
iwa/plugins/olas/service_manager/staking.py,sha256=
|
|
99
|
+
iwa/plugins/olas/service_manager/staking.py,sha256=kT9OOQ4fi3FrIJB2T2gsvmv7DBRD6pDxqcXXh2o6iwc,29600
|
|
99
100
|
iwa/plugins/olas/tests/conftest.py,sha256=4vM7EI00SrTGyeP0hNzsGSQHEj2-iznVgzlNh2_OGfo,739
|
|
100
101
|
iwa/plugins/olas/tests/test_importer.py,sha256=i9LKov7kNRECB3hmRnhKBwcfx3uxtjWe4BB77bOOpeo,4282
|
|
101
102
|
iwa/plugins/olas/tests/test_importer_error_handling.py,sha256=GeXu4Par3_FAUL9hT6Sn5PdRg2_EU2gf3iaL73atoYo,12256
|
|
102
103
|
iwa/plugins/olas/tests/test_mech_contracts.py,sha256=wvxuigPafF-ySIHVBdWVei3AO418iPh7cSVdAlUGm_s,3566
|
|
103
|
-
iwa/plugins/olas/tests/test_olas_archiving.py,sha256=
|
|
104
|
+
iwa/plugins/olas/tests/test_olas_archiving.py,sha256=rwyP-9eZ1cNvvV4h4bBOrs_8qV-du9yt-VNMuH_13nY,3443
|
|
104
105
|
iwa/plugins/olas/tests/test_olas_contracts.py,sha256=B8X-5l1KfYMoZOiM94_rcNzbILLl78rqt_jhyxzAOqE,10835
|
|
105
|
-
iwa/plugins/olas/tests/test_olas_integration.py,sha256=
|
|
106
|
+
iwa/plugins/olas/tests/test_olas_integration.py,sha256=LGkdeso5lvi7_0GjlS9EFlSs6PEEn_b5aD2USmperDA,23086
|
|
106
107
|
iwa/plugins/olas/tests/test_olas_models.py,sha256=5scX-wvRLGH3G44S2okq_tyQ9Rk7Pd0Ak1zNCZ2HtI4,4957
|
|
107
108
|
iwa/plugins/olas/tests/test_olas_view.py,sha256=2SsQYayeV3rf_mAPVvt4vINcMysAXmICkkQe3MRn4K8,10662
|
|
108
109
|
iwa/plugins/olas/tests/test_olas_view_actions.py,sha256=jAxr9bjFNAaxGf1btIrxdMaHgJ0PWX9aDwVU-oPGMpk,5109
|
|
@@ -110,26 +111,26 @@ iwa/plugins/olas/tests/test_olas_view_modals.py,sha256=8j0PNFjKqFC5V1kBdVFWNLMvq
|
|
|
110
111
|
iwa/plugins/olas/tests/test_plugin.py,sha256=RVgU-Cq6t_3mOh90xFAGwlJOV7ZIgp0VNaK5ZAxisAQ,2565
|
|
111
112
|
iwa/plugins/olas/tests/test_plugin_full.py,sha256=55EBa07JhJLVG3IMi6QKlR_ivWLYCdLQTySP66qbEXo,8584
|
|
112
113
|
iwa/plugins/olas/tests/test_service_lifecycle.py,sha256=sOCtpz8T9s55AZe9AoqP1h3XrXw5NDSjDqwLgYThvU4,5559
|
|
113
|
-
iwa/plugins/olas/tests/test_service_manager.py,sha256=
|
|
114
|
-
iwa/plugins/olas/tests/test_service_manager_errors.py,sha256
|
|
115
|
-
iwa/plugins/olas/tests/test_service_manager_flows.py,sha256=
|
|
114
|
+
iwa/plugins/olas/tests/test_service_manager.py,sha256=_mFRptssimITHhjvZA5jUPU2bInUIPCKll5wlj9elcA,40905
|
|
115
|
+
iwa/plugins/olas/tests/test_service_manager_errors.py,sha256=-qpLmU4Uiqqtre59L2wXpO4WPMs4ej_K_gAL3naEvRg,8554
|
|
116
|
+
iwa/plugins/olas/tests/test_service_manager_flows.py,sha256=ZSmBJNa18d_MyAaLQRoPpfFYRwzmk9k-5AhSAGd7WeI,20737
|
|
116
117
|
iwa/plugins/olas/tests/test_service_manager_mech.py,sha256=qG6qu5IPRNypXUsblU2OEkuiuwDJ0TH8RXZbibmTFcQ,4937
|
|
117
118
|
iwa/plugins/olas/tests/test_service_manager_rewards.py,sha256=jVAe4HSAxDfnq8Ec-JMsvE2E0HYsydO78ITFHnSSka4,11993
|
|
118
119
|
iwa/plugins/olas/tests/test_service_manager_validation.py,sha256=ajlfH5uc4mAHf8A7GLE5cW7X8utM2vUilM0JdGDdlVg,5382
|
|
119
|
-
iwa/plugins/olas/tests/test_service_staking.py,sha256=
|
|
120
|
+
iwa/plugins/olas/tests/test_service_staking.py,sha256=ETNnWzV52FDhK0mrPb9xl9gSiYRH2EeDVxcaQIV0d5Q,15849
|
|
120
121
|
iwa/plugins/olas/tests/test_staking_integration.py,sha256=QCBQf6P2ZmmsEGt2k8W2r53lG2aVRuoMJE-aFxVDLss,9701
|
|
121
122
|
iwa/plugins/olas/tests/test_staking_validation.py,sha256=uug64jFcXYJ3Nw_lNa3O4fnhNr5wAWHHIrchSbR2MVE,4020
|
|
122
123
|
iwa/plugins/olas/tui/__init__.py,sha256=5ZRsbC7J3z1xfkZRiwr4bLEklf78rNVjdswe2p7SlS8,28
|
|
123
124
|
iwa/plugins/olas/tui/olas_view.py,sha256=OlhciDK1Ni4BdzggqTzQeYnP2azB-We02hH6jQhbZuU,37388
|
|
124
125
|
iwa/tools/__init__.py,sha256=jQyuwDQGRigSe7S9JMb4yK3CXPgZFJNffzt6N2v9PU0,21
|
|
125
126
|
iwa/tools/check_profile.py,sha256=0LAv9wx4wMM610mX88-6tIoDi2I5LDzh0W9nkprt42s,2177
|
|
126
|
-
iwa/tools/drain_accounts.py,sha256=
|
|
127
|
+
iwa/tools/drain_accounts.py,sha256=Xd0ephHENms2f5G7IotpFBazPpKrvXoRurctS7fYrc4,1760
|
|
127
128
|
iwa/tools/list_contracts.py,sha256=c7ugXfblJ47cC2n5ruGzBwN5DYWiZVJqKYqIttc_PMk,5013
|
|
128
129
|
iwa/tools/release.py,sha256=-Z9GG6Y-K6KG32K0VUf_MruiUdJxG6W7ToOMzhyCH7Y,3963
|
|
129
|
-
iwa/tools/reset_env.py,sha256=
|
|
130
|
+
iwa/tools/reset_env.py,sha256=UbstfM9zIVNyH_8Oa3T4rSixQLmueR903pRx_aEu_Pk,3833
|
|
130
131
|
iwa/tools/reset_tenderly.py,sha256=usKfOLrQvdCzEncueg-Sz3spqX80vHPQmbh2tIygo8o,11295
|
|
131
132
|
iwa/tools/restore_backup.py,sha256=_LJbmKv9SlekLUQFdjI3aHCvAc6uePobJe3bQEFyatk,2455
|
|
132
|
-
iwa/tools/test_chainlist.py,sha256=
|
|
133
|
+
iwa/tools/test_chainlist.py,sha256=CtSA1p-lUxhaJFqYL8LN20gyDiFwVgHmdyEbSJSxD0M,1167
|
|
133
134
|
iwa/tools/wallet_check.py,sha256=IQLgb8oCt4oG6FMEAqzUxM57DLv_UE24dFUSVxtBo_Y,4774
|
|
134
135
|
iwa/tui/__init__.py,sha256=XYIZNQNy-fZC1NHHM0sd9qUO0vE1slml-cm0CpQ4NLY,27
|
|
135
136
|
iwa/tui/app.py,sha256=XDQ4nAPGBwhrEmdL_e3V8oYSOho8pY7jsd3C_wk92UU,4163
|
|
@@ -138,7 +139,7 @@ iwa/tui/workers.py,sha256=lvzbIS375_H1rj7-9d-w0PKnkDJ4lW_13aWzZRaX9fY,1192
|
|
|
138
139
|
iwa/tui/modals/__init__.py,sha256=OyrjWjaPqQAllZcUJ-Ac_e1PtTouJy8m1eGo132p-EA,130
|
|
139
140
|
iwa/tui/modals/base.py,sha256=q9dEV6We_SPxbMRh711amFDwAOBywD00Qg0jcqvh5LE,12060
|
|
140
141
|
iwa/tui/screens/__init__.py,sha256=j0brLsuVd9M8hM5LHH05E7manY3ZVj24yf7nFyGryp4,31
|
|
141
|
-
iwa/tui/screens/wallets.py,sha256=
|
|
142
|
+
iwa/tui/screens/wallets.py,sha256=PJWDwXt3LYBaGny1DH0WtvWzMQGGgWR1kUzlEr8dLW8,30802
|
|
142
143
|
iwa/tui/tests/test_app.py,sha256=F0tJthsyWzwNbHcGtiyDQtKDPn3m9N1qt2vMGiXrQTQ,3868
|
|
143
144
|
iwa/tui/tests/test_rpc.py,sha256=4m2HC-R5R9kO5pluo2G_CrTBQv63YYrdZNufTjtnGUk,4330
|
|
144
145
|
iwa/tui/tests/test_wallets_refactor.py,sha256=71G3HLbhTtgDy3ffVbYv0MFYRgdYd-NWGBdvdzW4M9c,998
|
|
@@ -156,7 +157,7 @@ iwa/web/routers/olas/__init__.py,sha256=Jo6Dm1e8fHafCD800fbxsxeFz3tvuEEKXEf5-9tj
|
|
|
156
157
|
iwa/web/routers/olas/admin.py,sha256=PMRdNelqYgQ1xbqh3floFV5xrVtBRQiwZPd8J9_ffxg,5785
|
|
157
158
|
iwa/web/routers/olas/funding.py,sha256=f8fADNtbZEBFl-vuVKfas6os38Vot6K5tJBTenZmCD0,4832
|
|
158
159
|
iwa/web/routers/olas/general.py,sha256=dPsBQppTGoQY1RztliUhseOHOZGeeCR10lhThD9kyXo,803
|
|
159
|
-
iwa/web/routers/olas/services.py,sha256=
|
|
160
|
+
iwa/web/routers/olas/services.py,sha256=jDbxLUJBN48vs2-fXrIpxhPSM6quqYxggmMOkUVEIaI,18200
|
|
160
161
|
iwa/web/routers/olas/staking.py,sha256=jktJ2C1Q9X4aC0tWJByN3sHpEXY0EIvr3rr4N0MtXXc,14081
|
|
161
162
|
iwa/web/static/app.js,sha256=hBjUSivxf5Uyy2H6BR-rfdvF8e7qBoDPK23aY3dagNY,114418
|
|
162
163
|
iwa/web/static/index.html,sha256=q7s7plnMbN1Nkzr5bRxZgvgOFerUChEGIZW7SpAVtPc,28514
|
|
@@ -165,7 +166,7 @@ iwa/web/tests/test_web_endpoints.py,sha256=vA25YghHNB23sbmhD4ciesn_f_okSq0tjlkrS
|
|
|
165
166
|
iwa/web/tests/test_web_olas.py,sha256=0CVSsrncOeJ3x0ECV7mVLQV_CXZRrOqGiVjgLIi6hZ8,16308
|
|
166
167
|
iwa/web/tests/test_web_swap.py,sha256=7A4gBJFL01kIXPtW1E1J17SCsVc_0DmUn-R8kKrnnVA,2974
|
|
167
168
|
iwa/web/tests/test_web_swap_coverage.py,sha256=zGNrzlhZ_vWDCvWmLcoUwFgqxnrp_ACbo49AtWBS_Kw,5584
|
|
168
|
-
iwa-0.0.
|
|
169
|
+
iwa-0.0.59.dist-info/licenses/LICENSE,sha256=eIubm_IlBHPYRQlLNZKbBNKhJUUP3JH0A2miZUhAVfI,1078
|
|
169
170
|
tests/legacy_cow.py,sha256=oOkZvIxL70ReEoD9oHQbOD5GpjIr6AGNHcOCgfPlerU,8389
|
|
170
171
|
tests/legacy_safe.py,sha256=AssM2g13E74dNGODu_H0Q0y412lgqsrYnEzI97nm_Ts,2972
|
|
171
172
|
tests/legacy_transaction_retry_logic.py,sha256=D9RqZ7DBu61Xr2djBAodU2p9UE939LL-DnQXswX5iQk,1497
|
|
@@ -173,8 +174,8 @@ tests/legacy_tui.py,sha256=qu5-_C0H9dumElLFEWB71ACOgcA6bxbipgmWCBB12DM,15676
|
|
|
173
174
|
tests/legacy_wallets_screen.py,sha256=9hZnX-VhKgwH9w8MxbNdboRyNxLDhOakLKJECsw_vhc,19262
|
|
174
175
|
tests/legacy_web.py,sha256=q2ERIriaDHT3Q8axG2N3ucO7f2VSvV_WkuPR00DVko4,8577
|
|
175
176
|
tests/test_account_service.py,sha256=g_AIVT2jhlvUtbFTaCd-d15x4CmXJQaV66tlAgnaXwY,3745
|
|
176
|
-
tests/test_balance_service.py,sha256=
|
|
177
|
-
tests/test_chain.py,sha256=
|
|
177
|
+
tests/test_balance_service.py,sha256=wcuCOVszxPy8nPkldAVcEiygcOK3BuQt797fqAJvbp4,4979
|
|
178
|
+
tests/test_chain.py,sha256=VZoidSojWyt1y4mQdZdoZsjuuDZjLC6neTC-2SF_Q7I,13957
|
|
178
179
|
tests/test_chain_interface.py,sha256=Wu0q0sREtmYBp7YvWrBIrrSTtqeQj18oJp2VmMUEMec,8312
|
|
179
180
|
tests/test_chain_interface_coverage.py,sha256=fvrVvw8-DMwdsSFKQHUhpbfutrVRxnnTc-tjB7Bb-jo,3327
|
|
180
181
|
tests/test_cli.py,sha256=Pl4RC2xp1omiJUnL3Dza6pCmIoO29LJ0vGw33_ZpT5c,3980
|
|
@@ -194,15 +195,15 @@ tests/test_monitor.py,sha256=dRVS6EkTwfvGEOg7t0dVhs6M3oEZExBH7iBZe6hmk4M,7261
|
|
|
194
195
|
tests/test_multisend.py,sha256=IvXpwnC5xSDRCyCDGcMdO3L-eQegvdjAzHZB0FoVFUI,2685
|
|
195
196
|
tests/test_plugin_service.py,sha256=ZEe37kV_sv4Eb04032O1hZIoo9yf5gJo83ks7Grzrng,3767
|
|
196
197
|
tests/test_rate_limiter.py,sha256=gC-mVsTCqGbBoUxAllY_WS9kl12rBHQv7MNr1zdUdGQ,7334
|
|
197
|
-
tests/test_rate_limiter_retry.py,sha256=
|
|
198
|
+
tests/test_rate_limiter_retry.py,sha256=gU4AJk1s39HvdcbGeIoIrr1M7p6WMba_n2y8eFNSXc8,4261
|
|
198
199
|
tests/test_reset_tenderly.py,sha256=GVoqbDT3n4_GnlKF5Lx-8ew15jT8I2hIPdTulQDb6dI,7215
|
|
199
|
-
tests/test_rpc_efficiency.py,sha256=
|
|
200
|
-
tests/test_rpc_rate_limit.py,sha256=
|
|
201
|
-
tests/test_rpc_rotation.py,sha256=
|
|
200
|
+
tests/test_rpc_efficiency.py,sha256=mNuCoa5r6lSEyTqcRX98oz-huoKMTUlKM2UcOHlTQ6M,3745
|
|
201
|
+
tests/test_rpc_rate_limit.py,sha256=Eo-Nr_7p8jERtouCtKuEmcSzACeiVUb33kt7BeTo4uA,1011
|
|
202
|
+
tests/test_rpc_rotation.py,sha256=a1cFKsf0fo-73_MSDnTuU6Zpv7bJHjrCVu3ANe8PXDU,12541
|
|
202
203
|
tests/test_rpc_view.py,sha256=sgZ53KEHl8VGb7WKYa0VI7Cdxbf8JH1SdroHYbWHjfQ,2031
|
|
203
204
|
tests/test_safe_coverage.py,sha256=KBxKz64XkK8CgN0N0LTNVKakf8Wg8EpghcBlLmDFmLs,6119
|
|
204
|
-
tests/test_safe_executor.py,sha256=
|
|
205
|
-
tests/test_safe_integration.py,sha256=
|
|
205
|
+
tests/test_safe_executor.py,sha256=V3ovBRY1lOuW5rm8rpm5Ns7jb-rgmHKHpz9pMTqz6c4,14448
|
|
206
|
+
tests/test_safe_integration.py,sha256=WWAKDio3N-CFyr5RRvphbOPdu3TI9WSM8IesfbFbvWQ,5363
|
|
206
207
|
tests/test_safe_service.py,sha256=5ULlj0fPZRwg-4fCBJplhm4Msr_Beof7W-Zf_JljZc8,5782
|
|
207
208
|
tests/test_service_manager_integration.py,sha256=I_BLUzEKrVTyg_8jqsUK0oFD3aQVPCRJ7z0gY8P-j04,2354
|
|
208
209
|
tests/test_service_manager_structure.py,sha256=zK506ucCXCBHcjPYKrKEuK1bgq0xsbawyL8Y-wahXf8,868
|
|
@@ -221,8 +222,8 @@ tests/test_utils.py,sha256=vkP49rYNI8BRzLpWR3WnKdDr8upeZjZcs7Rx0pjbQMo,1292
|
|
|
221
222
|
tests/test_workers.py,sha256=MInwdkFY5LdmFB3o1odIaSD7AQZb3263hNafO1De5PE,2793
|
|
222
223
|
tools/create_and_stake_service.py,sha256=1xwy_bJQI1j9yIQ968Oc9Db_F6mk1659LuuZntTASDE,3742
|
|
223
224
|
tools/verify_drain.py,sha256=PkMjblyOOAuQge88FwfEzRtCYeEtJxXhPBmtQYCoQ-8,6743
|
|
224
|
-
iwa-0.0.
|
|
225
|
-
iwa-0.0.
|
|
226
|
-
iwa-0.0.
|
|
227
|
-
iwa-0.0.
|
|
228
|
-
iwa-0.0.
|
|
225
|
+
iwa-0.0.59.dist-info/METADATA,sha256=FZrh67solKvQcjzWzdns2HPQGMwPZs0B6_Z2rK7hLJA,7337
|
|
226
|
+
iwa-0.0.59.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
227
|
+
iwa-0.0.59.dist-info/entry_points.txt,sha256=nwB6kscrfA7M00pYmL2j-sBH6eF6h2ga9IK1BZxdiyQ,241
|
|
228
|
+
iwa-0.0.59.dist-info/top_level.txt,sha256=kedS9cRUbm4JE2wYeabIXilhHjN8KCw0IGbqqqsw0Bs,16
|
|
229
|
+
iwa-0.0.59.dist-info/RECORD,,
|
tests/test_balance_service.py
CHANGED
|
@@ -131,8 +131,6 @@ def test_get_erc20_balance_wei_account_not_found(
|
|
|
131
131
|
assert result is None
|
|
132
132
|
|
|
133
133
|
|
|
134
|
-
|
|
135
|
-
|
|
136
134
|
def test_balance_service_with_wallet(mock_account_service):
|
|
137
135
|
"""Test BalanceService initialization with Wallet (has key_storage attr)."""
|
|
138
136
|
from iwa.core.services.balance import BalanceService
|
tests/test_chain.py
CHANGED
|
@@ -155,7 +155,7 @@ def test_calculate_transaction_params(mock_web3):
|
|
|
155
155
|
ci.web3.eth.gas_price = 20
|
|
156
156
|
|
|
157
157
|
# Mock for EIP-1559 check (disable it for simple test)
|
|
158
|
-
ci.web3.eth.get_block.return_value = {}
|
|
158
|
+
ci.web3.eth.get_block.return_value = {} # No baseFeePerGas
|
|
159
159
|
|
|
160
160
|
with patch.object(ci, "estimate_gas", return_value=1000):
|
|
161
161
|
params = ci.calculate_transaction_params(MagicMock(), {"from": "0xSender"})
|
|
@@ -326,7 +326,6 @@ def test_chain_interface_with_real_chains():
|
|
|
326
326
|
# --- Negative Tests ---
|
|
327
327
|
|
|
328
328
|
|
|
329
|
-
|
|
330
329
|
def test_get_token_symbol_fallback_on_error(mock_web3):
|
|
331
330
|
"""Test get_token_symbol returns truncated address on error."""
|
|
332
331
|
chain = MagicMock(spec=SupportedChain)
|
tests/test_rate_limiter_retry.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
from unittest.mock import MagicMock, PropertyMock, patch
|
|
3
2
|
|
|
4
3
|
import pytest
|
|
@@ -12,7 +11,6 @@ class MockChainInterface:
|
|
|
12
11
|
|
|
13
12
|
|
|
14
13
|
class TestRateLimitedEthRetry:
|
|
15
|
-
|
|
16
14
|
@pytest.fixture
|
|
17
15
|
def mock_deps(self):
|
|
18
16
|
web3_eth = MagicMock()
|
|
@@ -30,7 +28,7 @@ class TestRateLimitedEthRetry:
|
|
|
30
28
|
web3_eth.get_balance.side_effect = [
|
|
31
29
|
ValueError("RPC error 1"),
|
|
32
30
|
ValueError("RPC error 2"),
|
|
33
|
-
100 # Success
|
|
31
|
+
100, # Success
|
|
34
32
|
]
|
|
35
33
|
|
|
36
34
|
# Use patch to speed up sleep
|
|
@@ -95,10 +93,7 @@ class TestRateLimitedEthRetry:
|
|
|
95
93
|
# web3.eth.block_number is a property.
|
|
96
94
|
|
|
97
95
|
# We need to set side_effect on the PROPERTY of the mock
|
|
98
|
-
type(web3_eth).block_number = PropertyMock(side_effect=[
|
|
99
|
-
ValueError("Fail 1"),
|
|
100
|
-
12345
|
|
101
|
-
])
|
|
96
|
+
type(web3_eth).block_number = PropertyMock(side_effect=[ValueError("Fail 1"), 12345])
|
|
102
97
|
|
|
103
98
|
with patch("time.sleep"):
|
|
104
99
|
val = eth_wrapper.block_number
|
tests/test_rpc_efficiency.py
CHANGED
|
@@ -25,6 +25,7 @@ def mock_chain_interface():
|
|
|
25
25
|
# Yield both interface and contract mock
|
|
26
26
|
yield mock_interface, mock_contract
|
|
27
27
|
|
|
28
|
+
|
|
28
29
|
def test_staking_contract_lazy_loading(mock_chain_interface):
|
|
29
30
|
"""Verify StakingContract init does NOT make RPC calls."""
|
|
30
31
|
mock_interface, mock_contract = mock_chain_interface
|
|
@@ -55,13 +56,14 @@ def test_staking_contract_lazy_loading(mock_chain_interface):
|
|
|
55
56
|
# Assert still 1 call (cached)
|
|
56
57
|
assert mock_contract.functions.livenessPeriod.return_value.call.call_count == 1
|
|
57
58
|
|
|
59
|
+
|
|
58
60
|
def test_contract_cache_singleton(mock_chain_interface):
|
|
59
61
|
"""Verify ContractCache returns same instance and reuses property cache."""
|
|
60
62
|
mock_interface, mock_contract = mock_chain_interface
|
|
61
63
|
ContractCache().clear()
|
|
62
64
|
|
|
63
65
|
c1 = ContractCache().get_contract(StakingContract, "0xABC", "gnosis")
|
|
64
|
-
c2 = ContractCache().get_contract(StakingContract, "0xabc", "gnosis")
|
|
66
|
+
c2 = ContractCache().get_contract(StakingContract, "0xabc", "gnosis") # Check ignore case
|
|
65
67
|
|
|
66
68
|
assert c1 is c2
|
|
67
69
|
|
|
@@ -78,6 +80,7 @@ def test_contract_cache_singleton(mock_chain_interface):
|
|
|
78
80
|
# Call count should NOT increase
|
|
79
81
|
assert mock_contract.functions.maxNumServices.return_value.call.call_count == 1
|
|
80
82
|
|
|
83
|
+
|
|
81
84
|
def test_epoch_aware_caching(mock_chain_interface):
|
|
82
85
|
"""Verify ts_checkpoint caching logic."""
|
|
83
86
|
mock_interface, mock_contract = mock_chain_interface
|
tests/test_rpc_rate_limit.py
CHANGED
tests/test_rpc_rotation.py
CHANGED
|
@@ -91,7 +91,9 @@ def test_rpc_rotation_updates_provider():
|
|
|
91
91
|
class MockRateLimitedWeb3:
|
|
92
92
|
def __init__(self, w3, rl, ci):
|
|
93
93
|
self._web3 = w3
|
|
94
|
-
self.set_backend = MagicMock(
|
|
94
|
+
self.set_backend = MagicMock(
|
|
95
|
+
side_effect=lambda new_w3: set_backend_calls.append(new_w3)
|
|
96
|
+
)
|
|
95
97
|
|
|
96
98
|
def __getattr__(self, name):
|
|
97
99
|
return getattr(self._web3, name)
|
|
@@ -230,9 +232,7 @@ def test_rotation_applies_to_subsequent_calls():
|
|
|
230
232
|
mock_web3_class.side_effect = create_web3
|
|
231
233
|
mock_web3_class.HTTPProvider = create_provider
|
|
232
234
|
|
|
233
|
-
with patch(
|
|
234
|
-
"iwa.core.chain.interface.RateLimitedWeb3", side_effect=lambda w3, rl, ci: w3
|
|
235
|
-
):
|
|
235
|
+
with patch("iwa.core.chain.interface.RateLimitedWeb3", side_effect=lambda w3, rl, ci: w3):
|
|
236
236
|
ci = ChainInterface(chain)
|
|
237
237
|
|
|
238
238
|
# First call uses RPC 1
|