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.
Files changed (58) hide show
  1. iwa/core/chain/interface.py +32 -21
  2. iwa/core/chain/rate_limiter.py +0 -6
  3. iwa/core/chainlist.py +15 -10
  4. iwa/core/cli.py +3 -0
  5. iwa/core/contracts/cache.py +1 -1
  6. iwa/core/contracts/contract.py +1 -0
  7. iwa/core/contracts/decoder.py +10 -4
  8. iwa/core/http.py +31 -0
  9. iwa/core/ipfs.py +11 -19
  10. iwa/core/keys.py +10 -4
  11. iwa/core/models.py +1 -3
  12. iwa/core/pricing.py +3 -21
  13. iwa/core/rpc_monitor.py +1 -0
  14. iwa/core/services/balance.py +0 -1
  15. iwa/core/services/safe.py +8 -2
  16. iwa/core/services/safe_executor.py +52 -18
  17. iwa/core/services/transaction.py +32 -12
  18. iwa/core/services/transfer/erc20.py +0 -1
  19. iwa/core/services/transfer/native.py +1 -1
  20. iwa/core/tests/test_gnosis_fee.py +6 -2
  21. iwa/core/tests/test_ipfs.py +1 -1
  22. iwa/core/tests/test_regression_fixes.py +3 -6
  23. iwa/core/utils.py +2 -0
  24. iwa/core/wallet.py +3 -1
  25. iwa/plugins/olas/constants.py +15 -5
  26. iwa/plugins/olas/contracts/activity_checker.py +3 -3
  27. iwa/plugins/olas/contracts/staking.py +0 -1
  28. iwa/plugins/olas/events.py +15 -13
  29. iwa/plugins/olas/importer.py +26 -20
  30. iwa/plugins/olas/plugin.py +16 -14
  31. iwa/plugins/olas/service_manager/drain.py +1 -3
  32. iwa/plugins/olas/service_manager/lifecycle.py +9 -9
  33. iwa/plugins/olas/service_manager/staking.py +11 -6
  34. iwa/plugins/olas/tests/test_olas_archiving.py +25 -15
  35. iwa/plugins/olas/tests/test_olas_integration.py +49 -29
  36. iwa/plugins/olas/tests/test_service_manager.py +8 -10
  37. iwa/plugins/olas/tests/test_service_manager_errors.py +5 -4
  38. iwa/plugins/olas/tests/test_service_manager_flows.py +6 -5
  39. iwa/plugins/olas/tests/test_service_staking.py +64 -38
  40. iwa/tools/drain_accounts.py +2 -1
  41. iwa/tools/reset_env.py +2 -1
  42. iwa/tools/test_chainlist.py +5 -1
  43. iwa/tui/screens/wallets.py +1 -3
  44. iwa/web/routers/olas/services.py +10 -5
  45. {iwa-0.0.58.dist-info → iwa-0.0.59.dist-info}/METADATA +1 -1
  46. {iwa-0.0.58.dist-info → iwa-0.0.59.dist-info}/RECORD +58 -57
  47. tests/test_balance_service.py +0 -2
  48. tests/test_chain.py +1 -2
  49. tests/test_rate_limiter_retry.py +2 -7
  50. tests/test_rpc_efficiency.py +4 -1
  51. tests/test_rpc_rate_limit.py +1 -0
  52. tests/test_rpc_rotation.py +4 -4
  53. tests/test_safe_executor.py +76 -50
  54. tests/test_safe_integration.py +11 -6
  55. {iwa-0.0.58.dist-info → iwa-0.0.59.dist-info}/WHEEL +0 -0
  56. {iwa-0.0.58.dist-info → iwa-0.0.59.dist-info}/entry_points.txt +0 -0
  57. {iwa-0.0.58.dist-info → iwa-0.0.59.dist-info}/licenses/LICENSE +0 -0
  58. {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
 
@@ -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(f" - {node.url}: Tracking={node.is_tracking} (Privacy={node.privacy}, Tracking={node.tracking})")
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()
@@ -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:
@@ -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 = wallet.account_service.get_tag_by_address(req.staking_contract) or req.staking_contract
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 = wallet.account_service.get_tag_by_address(staking_contract) or staking_contract
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(signer_addr, "OLAS", chain)
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iwa
3
- Version: 0.0.58
3
+ Version: 0.0.59
4
4
  Summary: A secure, modular, and plugin-based framework for crypto agents and ops
5
5
  Requires-Python: <4.0,>=3.12
6
6
  Description-Content-Type: text/markdown
@@ -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=IOnlfRFaPlzdg91HbILynzvRfEJ9afikjFUS06K4rfU,4021
5
- iwa/core/cli.py,sha256=HMp1QapGTFi221MASrDZlcenCD-VgEtO5rdzjH_QzXY,8312
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/ipfs.py,sha256=6tVd15J6VoewRCbI9xr1rN9OfL3vOjI_SGNK4qa_ACk,5618
9
- iwa/core/keys.py,sha256=r1C05wdJPv7Z05COkHTk431Uo0-s4jb66bpE7mIy96w,24713
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=J5oNzKhWew4KA9ofH9sYWkmkonOaU9iYWJRcuoisweg,14544
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=NsRE_xwo7teBzGrJY5EgsgR9fe3sMPzrhOMq-DUccqE,4752
15
- iwa/core/rpc_monitor.py,sha256=-NHR1Mn2IJKJ9x975NGfsze_shI12yL0OyTPtmjUMKg,1661
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=shJuANkXSWVO3NF49syPA9hCG7H5AzaMJOG8V4fo6IM,4279
22
- iwa/core/wallet.py,sha256=MjjSMfrNAipDGjzyNXa7RCIHljR7XtL1yRL6XcKIf00,13107
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=wrcqRwXtuj_a9MxT9zkatwYEyS1ccmvSumFqbfir9Rw,23593
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=wcVErIpAI4pG9YMsGzAeQEE4mbfh9OhPC3suGkWl6JE,8099
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=7wGQgyXAmofvx-irbxSnGgIDzQik6Pcpm7up6wMQcoo,4454
31
- iwa/core/contracts/contract.py,sha256=RJaKh05p1MdgsCd8v799LwW1apkDboRDCu8Kah02760,13254
32
- iwa/core/contracts/decoder.py,sha256=HaPw43ZAGswaiLPasMNU2rXKSvozb5t-O46VzJ-YH-U,5488
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=m0GqJaBjIdR-aOzpGbh1nF9Xgz0aQWugEzH82DjtLqU,3325
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=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
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=EirjmzZNklJWZs96ZjiuDaRyZG_jh_gb7rxhp3wG9KY,10105
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=cG1PfLi8WM_kHvyx4XkLDVm-ynMQNfZ-Ghi2m5kIZmE,9899
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=4k73GpjVoJGMvmPF-dIhmUsWpPwQ0VaNI-iOCOuAc84,3658
52
- iwa/core/tests/test_ipfs.py,sha256=PKB05dxdnLlMDgQM2JPARRogRJ47KEUH1XgFEOXnQQ4,2773
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=9q7Tov-L1U3VSQ-xkUlVaLWSVlwgnAukPin0KlkUl4c,4032
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=iTFoO2QW3KbhL5k5sKsJxxyDytl9wVIb_9hAih55KrE,7728
69
- iwa/plugins/olas/events.py,sha256=SWD3wYdQ-l6dLUJSkfh_WsLmedH4Vsw_EvYXg7QC3yc,5970
70
- iwa/plugins/olas/importer.py,sha256=BQU3ykigPSuYlt61VarjBpP5NEAQSM9NoPqwjyjJgec,41972
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=zOPWyoVkSVh6guJ3TZj5enJFuiIbP3fRM8FkziPB-c0,15606
74
- iwa/plugins/olas/contracts/activity_checker.py,sha256=WXxuzbpXGVqIfEiMPiiqN3Z_UxIY-Lvx0raa1ErBfPA,5323
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=TimiHSJy5wAlx35uplyeG7TG6NpxPigkmKcrz_ZBCjY,18487
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=LCs1emIXxfb8a4w3I8LdFfmwYA61T1EUQ5bTAt3Wc04,12942
96
- iwa/plugins/olas/service_manager/lifecycle.py,sha256=eN0TgS77Qg5fvOSNEztgQ3jazLzR2iHYm3BeNr5B_8U,50593
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=e6yIsxOq0E-lfStTYp-IkbHChBpbDtQv4mSnniZ_ybQ,29555
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=NTeYp07P3uoGDoxK1QA0eluISv2qd5cW_TNzCU_2E30,3305
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=vjL8-RNdxXu6RFR5F1Bn7xqnxnUVWTzl2--Pp7-0r5A,22973
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=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
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=miNGZZoIrZf0Am-pJ8gTyvVAruL4P7jMvrtFEhG5wxQ,15694
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=8ED4tw2J72BzYysiqF34THGi_F1tAufasjG8fUADdJU,1759
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=lHWMUatl4n6KNCluX-egA9uSt0xSH9m48gt4Lz8GW28,3831
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=9J06sTsKgnEcN7WSn-YgJkCHhfbGDdVS-KNMDBhYllA,1143
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=8ClUpXMGk343WC2YejrXovIEW7zyJYy9XJzbJVx7zDQ,30824
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=mDQh_Hp118Ek8_WIfhmZA_7HC2slw_aKRUjY6PPx91A,18099
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.58.dist-info/licenses/LICENSE,sha256=eIubm_IlBHPYRQlLNZKbBNKhJUUP3JH0A2miZUhAVfI,1078
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=tvvokP24TuYAlikZvOiLjsHCcnRO0Xc5RlRmBqdheug,4981
177
- tests/test_chain.py,sha256=bDV6rL0twKovR722wax8aEzfr3wwcfQbapHJQPmg8kw,13957
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=JPLc1pXpwUlt2ZytpWnHhTXFLbkQf0v4mi15p5PbdQg,4296
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=EEcBlbUXEi9JVBorLU7mK7mmK0vcFt53KhefHr1oPQc,3741
200
- tests/test_rpc_rate_limit.py,sha256=CS9cgRqlu2jwfB4M0Nw0VY52k8idhfB3GTkzzuKyhPE,1010
201
- tests/test_rpc_rotation.py,sha256=jTJBAcGSomz3U1OFezaeaals5AUhLya1sJhVjw8ZtVE,12533
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=5XZ_TmafRjWr_r2XSMrBetIqxEsEbdZf-yt7_c9q_Vc,14226
205
- tests/test_safe_integration.py,sha256=HrSKA04WYElbuR3oDTvbjuDh0fAGYN9C7NYr_BKKO_g,5319
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.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,,
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,,
@@ -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 = {} # No baseFeePerGas
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)
@@ -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
@@ -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") # Check ignore case
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
@@ -14,6 +14,7 @@ def clean_rate_limiters():
14
14
  yield
15
15
  _rate_limiters.clear()
16
16
 
17
+
17
18
  def test_chain_interface_initializes_strict_limiter(clean_rate_limiters):
18
19
  """Verify ChainInterface initializes with rate=1.0 and burst=1."""
19
20
  # Create a dummy chain
@@ -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(side_effect=lambda new_w3: set_backend_calls.append(new_w3))
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