iwa 0.0.33__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 (83) hide show
  1. iwa/core/chain/interface.py +130 -11
  2. iwa/core/chain/models.py +15 -3
  3. iwa/core/chain/rate_limiter.py +48 -12
  4. iwa/core/chainlist.py +15 -10
  5. iwa/core/cli.py +4 -1
  6. iwa/core/contracts/cache.py +1 -1
  7. iwa/core/contracts/contract.py +1 -0
  8. iwa/core/contracts/decoder.py +10 -4
  9. iwa/core/http.py +31 -0
  10. iwa/core/ipfs.py +21 -7
  11. iwa/core/keys.py +65 -15
  12. iwa/core/models.py +58 -13
  13. iwa/core/pricing.py +10 -6
  14. iwa/core/rpc_monitor.py +1 -0
  15. iwa/core/secrets.py +27 -0
  16. iwa/core/services/account.py +1 -1
  17. iwa/core/services/balance.py +0 -23
  18. iwa/core/services/safe.py +72 -45
  19. iwa/core/services/safe_executor.py +350 -0
  20. iwa/core/services/transaction.py +43 -13
  21. iwa/core/services/transfer/erc20.py +14 -3
  22. iwa/core/services/transfer/native.py +14 -31
  23. iwa/core/services/transfer/swap.py +1 -0
  24. iwa/core/tests/test_gnosis_fee.py +91 -0
  25. iwa/core/tests/test_ipfs.py +85 -0
  26. iwa/core/tests/test_pricing.py +65 -0
  27. iwa/core/tests/test_regression_fixes.py +97 -0
  28. iwa/core/utils.py +2 -0
  29. iwa/core/wallet.py +6 -4
  30. iwa/plugins/gnosis/cow/quotes.py +2 -2
  31. iwa/plugins/gnosis/cow/swap.py +18 -32
  32. iwa/plugins/gnosis/tests/test_cow.py +19 -10
  33. iwa/plugins/olas/constants.py +15 -5
  34. iwa/plugins/olas/contracts/activity_checker.py +3 -3
  35. iwa/plugins/olas/contracts/staking.py +0 -1
  36. iwa/plugins/olas/events.py +15 -13
  37. iwa/plugins/olas/importer.py +29 -25
  38. iwa/plugins/olas/models.py +0 -3
  39. iwa/plugins/olas/plugin.py +16 -14
  40. iwa/plugins/olas/service_manager/drain.py +16 -9
  41. iwa/plugins/olas/service_manager/lifecycle.py +23 -12
  42. iwa/plugins/olas/service_manager/staking.py +15 -10
  43. iwa/plugins/olas/tests/test_importer_error_handling.py +13 -0
  44. iwa/plugins/olas/tests/test_olas_archiving.py +83 -0
  45. iwa/plugins/olas/tests/test_olas_integration.py +49 -29
  46. iwa/plugins/olas/tests/test_olas_view.py +5 -1
  47. iwa/plugins/olas/tests/test_service_manager.py +15 -17
  48. iwa/plugins/olas/tests/test_service_manager_errors.py +6 -5
  49. iwa/plugins/olas/tests/test_service_manager_flows.py +7 -6
  50. iwa/plugins/olas/tests/test_service_manager_rewards.py +5 -1
  51. iwa/plugins/olas/tests/test_service_staking.py +64 -38
  52. iwa/tools/drain_accounts.py +61 -0
  53. iwa/tools/list_contracts.py +2 -0
  54. iwa/tools/reset_env.py +2 -1
  55. iwa/tools/test_chainlist.py +5 -1
  56. iwa/tui/screens/wallets.py +2 -4
  57. iwa/web/routers/accounts.py +1 -1
  58. iwa/web/routers/olas/services.py +10 -5
  59. iwa/web/static/app.js +21 -9
  60. iwa/web/static/style.css +4 -0
  61. iwa/web/tests/test_web_endpoints.py +2 -2
  62. {iwa-0.0.33.dist-info → iwa-0.0.59.dist-info}/METADATA +6 -3
  63. {iwa-0.0.33.dist-info → iwa-0.0.59.dist-info}/RECORD +82 -71
  64. {iwa-0.0.33.dist-info → iwa-0.0.59.dist-info}/WHEEL +1 -1
  65. tests/test_balance_service.py +0 -43
  66. tests/test_chain.py +13 -5
  67. tests/test_cli.py +2 -2
  68. tests/test_drain_coverage.py +12 -6
  69. tests/test_keys.py +23 -23
  70. tests/test_rate_limiter.py +2 -2
  71. tests/test_rate_limiter_retry.py +103 -0
  72. tests/test_rpc_efficiency.py +4 -1
  73. tests/test_rpc_rate_limit.py +34 -0
  74. tests/test_rpc_rotation.py +59 -11
  75. tests/test_safe_coverage.py +37 -23
  76. tests/test_safe_executor.py +361 -0
  77. tests/test_safe_integration.py +153 -0
  78. tests/test_safe_service.py +1 -1
  79. tests/test_transfer_swap_unit.py +5 -1
  80. tests/test_pricing.py +0 -160
  81. {iwa-0.0.33.dist-info → iwa-0.0.59.dist-info}/entry_points.txt +0 -0
  82. {iwa-0.0.33.dist-info → iwa-0.0.59.dist-info}/licenses/LICENSE +0 -0
  83. {iwa-0.0.33.dist-info → iwa-0.0.59.dist-info}/top_level.txt +0 -0
iwa/web/static/app.js CHANGED
@@ -2096,13 +2096,24 @@ document.addEventListener("DOMContentLoaded", () => {
2096
2096
  <span class="value ${
2097
2097
  isLoading
2098
2098
  ? ""
2099
- : isStaked
2100
- ? "staked"
2101
- : service.state === "DEPLOYED"
2102
- ? "deployed"
2103
- : "not-staked"
2099
+ : staking.staking_state === "EVICTED"
2100
+ ? "evicted"
2101
+ : isStaked
2102
+ ? "staked"
2103
+ : service.state === "DEPLOYED"
2104
+ ? "deployed"
2105
+ : "not-staked"
2104
2106
  }">
2105
- ${isLoading ? '<span class="cell-spinner"></span>' : service.state ? service.state : isStaked ? "✓ STAKED" : "○ NOT STAKED"}
2107
+ ${
2108
+ isLoading
2109
+ ? '<span class="cell-spinner"></span>'
2110
+ : (service.state || "UNKNOWN") +
2111
+ (staking.staking_state
2112
+ ? `, ${staking.staking_state.replace(/_/g, " ")}`
2113
+ : isStaked
2114
+ ? ", STAKED"
2115
+ : ", NOT STAKED")
2116
+ }
2106
2117
  </span>
2107
2118
  </div>
2108
2119
  <div class="staking-row">
@@ -2638,11 +2649,11 @@ document.addEventListener("DOMContentLoaded", () => {
2638
2649
 
2639
2650
  // Show select, hide spinner
2640
2651
  select.style.display = "";
2641
- spinnerDiv.style.display = "none";
2652
+ spinnerDiv.classList.add("hidden");
2642
2653
  } catch (err) {
2643
2654
  select.innerHTML = '<option value="">Error loading contracts</option>';
2644
2655
  select.style.display = "";
2645
- spinnerDiv.style.display = "none";
2656
+ spinnerDiv.classList.add("hidden");
2646
2657
  confirmBtn.disabled = false;
2647
2658
  }
2648
2659
  };
@@ -2699,7 +2710,8 @@ document.addEventListener("DOMContentLoaded", () => {
2699
2710
 
2700
2711
  // Load staking contracts
2701
2712
  contractSelect.style.display = "none";
2702
- spinnerDiv.style.display = "block";
2713
+ spinnerDiv.classList.remove("hidden");
2714
+ spinnerDiv.style.display = "block"; // Ensure display block for visibility
2703
2715
  spinnerDiv.innerHTML =
2704
2716
  '<span class="loading-spinner"></span> Loading contracts...';
2705
2717
  submitBtn.disabled = true;
iwa/web/static/style.css CHANGED
@@ -1101,6 +1101,10 @@ textarea:focus {
1101
1101
  color: var(--warning);
1102
1102
  }
1103
1103
 
1104
+ .staking-row .value.evicted {
1105
+ color: var(--error);
1106
+ }
1107
+
1104
1108
  .staking-row .value.countdown {
1105
1109
  color: var(--accent-color);
1106
1110
  }
@@ -284,7 +284,7 @@ def test_safe_create_request_validation(client):
284
284
 
285
285
  def test_create_eoa_success(client):
286
286
  """Cover create_eoa success (lines 308-315)."""
287
- wallet.key_storage.create_account = MagicMock()
287
+ wallet.key_storage.generate_new_account = MagicMock()
288
288
 
289
289
  response = client.post("/api/accounts/eoa", json={"tag": "my_wallet"})
290
290
  assert response.status_code == 200
@@ -293,7 +293,7 @@ def test_create_eoa_success(client):
293
293
 
294
294
  def test_create_eoa_error(client):
295
295
  """Cover create_eoa error (lines 314-315)."""
296
- wallet.key_storage.create_account = MagicMock(side_effect=Exception("Tag exists"))
296
+ wallet.key_storage.generate_new_account = MagicMock(side_effect=Exception("Tag exists"))
297
297
 
298
298
  response = client.post("/api/accounts/eoa", json={"tag": "existing"})
299
299
  assert response.status_code == 400
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iwa
3
- Version: 0.0.33
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
@@ -17,6 +17,7 @@ Requires-Dist: tomli-w>=1.2.0
17
17
  Requires-Dist: typer>=0.19.2
18
18
  Requires-Dist: web3>=7.13.0
19
19
  Requires-Dist: pyyaml<7.0.0,>=6.0.3
20
+ Requires-Dist: ruamel.yaml>=0.18.0
20
21
  Requires-Dist: safe-eth-py>=7.14.0
21
22
  Requires-Dist: twine>=6.2.0
22
23
  Requires-Dist: cowdao-cowpy>=1.0.1
@@ -82,7 +83,7 @@ iwa/
82
83
  ├── core/ # Core wallet functionality
83
84
  │ ├── keys.py # KeyStorage - Encrypted key management
84
85
  │ ├── wallet.py # Wallet - High-level interface
85
- │ ├── chain.py # ChainInterface - Blockchain interaction with rate limiting
86
+ │ ├── chain/ # Blockchain interface with rate limiting
86
87
  │ ├── services/ # Service layer (accounts, balances, transactions)
87
88
  │ └── contracts/ # Contract abstractions (ERC20, Safe)
88
89
  ├── plugins/ # Protocol integrations
@@ -134,6 +135,9 @@ GNOSIS_RPC=https://rpc.gnosis.io,https://gnosis.drpc.org
134
135
  ETHEREUM_RPC=https://mainnet.infura.io/v3/YOUR_KEY
135
136
  BASE_RPC=https://mainnet.base.org
136
137
 
138
+ # Testing mode (default: true uses Tenderly test RPCs)
139
+ TESTING=false
140
+
137
141
  # Optional
138
142
  GNOSISSCAN_API_KEY=your_api_key
139
143
  COINGECKO_API_KEY=your_api_key
@@ -150,7 +154,6 @@ just web
150
154
 
151
155
  # Use CLI
152
156
  iwa wallet list --chain gnosis
153
- iwa wallet balance <address> --chain gnosis
154
157
  ```
155
158
 
156
159
  ### Running Tests
@@ -1,52 +1,58 @@
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=7zKhPq5Yeb8yq3J3JpSGX5uHPrL6xkm79r2715ltzwo,8306
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=aHjq_pflgwDVHl8g5EMQv0q2RAmMs-a0pOTVsj_L5xE,4980
9
- iwa/core/keys.py,sha256=ckacVZxm_02V9hlmHIxz-CkxjXdGHqvGGAXfO6EeHCw,22365
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=kBQ0cBe6uFmL2QfW7mjKiMFeZxhT-FRN-RyK3Ko0vE8,12849
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=uENpqVMmuogZHctsLuEsU7WJ1cLSNAI-rZTtbpTDjeQ,4048
15
- iwa/core/rpc_monitor.py,sha256=-NHR1Mn2IJKJ9x975NGfsze_shI12yL0OyTPtmjUMKg,1661
16
- iwa/core/secrets.py,sha256=U7DZKrwKuSOFV00Ij3ISrrO1cWn_t1GBW_0PyAqjcD4,2588
15
+ iwa/core/pricing.py,sha256=xMihEHi0Mupu1nO5YwujafWLOZnd50Lj9fYQS_JDWTQ,4236
16
+ iwa/core/rpc_monitor.py,sha256=C6AX5pSs5TEE43u3nVlE9oZ-ISKn5pq1jMQb5xatZ-g,1662
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=GI83BOFGTto6u8LPKepJDqWxxNsHqfNF-vCxy4pTk3U,13057
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=04eGlhonHAvxFnqLoHRWUaQBzys6jW6BppUuNNjlnSk,18809
26
+ iwa/core/chain/interface.py,sha256=FNb_M1Hl1FlgyC3FUPKH91RW7tF-wKJXQP4iOI14vGg,23798
26
27
  iwa/core/chain/manager.py,sha256=cFEzh6pK5OyVhjhpeMAqhc9RnRDQR1DjIGiGKp-FXBI,1159
27
- iwa/core/chain/models.py,sha256=0OgBo08FZEQisOdd00YUMXSAV7BC0CcWpqJ2y-gs0cI,4863
28
- iwa/core/chain/rate_limiter.py,sha256=gU7TmWdH9D_wbXKT1X7mIgoIUCWVuebgvRhxiyLGAmI,6613
28
+ iwa/core/chain/models.py,sha256=WUhAighMKcFdbAUkPU_3dkGbWyAUpRJqXMHLcWFC1xg,5261
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
36
37
  iwa/core/contracts/abis/multisend.json,sha256=BE8JbNQU_m1VsIppNK0GKP1E9R7Aor9YTrCAwsC0pNQ,396
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
- iwa/core/services/account.py,sha256=01MoEvl6FJlMnMB4fGwsPtnGa4kgA-d5hJeKu_ACg7Y,1982
40
- iwa/core/services/balance.py,sha256=mPE12CuOFfCaJXaQXWOcQM1O03ZF3ghpy_-oOjNk_GE,4104
40
+ iwa/core/services/account.py,sha256=0l14qD8_-ZbN_hQUNa7bRZt0tkceHPPc4GHmB8UKqy4,2009
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=ZmgVwbQhYlH5r3qhlY5uP8nCPtkkvV3sNnYG7_UCWUQ,14831
43
- iwa/core/services/transaction.py,sha256=Z5H5dXEXEMYT6YJWt5q04d_eciv8bKUuHQfWKZRYz1U,19106
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
44
46
  iwa/core/services/transfer/__init__.py,sha256=ZJfshFxJRsp8rkOqfVvd1cqEzIJ9tqBJh8pc0l90GLk,5576
45
47
  iwa/core/services/transfer/base.py,sha256=sohz-Ss2i-pGYGl4x9bD93cnYKcSvsXaXyvyRawvgQs,9043
46
- iwa/core/services/transfer/erc20.py,sha256=vs7OQR36C7JNScZ_UF2Fc9webQLLgAQjaMbMeqdB3do,9736
48
+ iwa/core/services/transfer/erc20.py,sha256=e6RD1_QcI_-iJvP85kj7aw4p6NnCPjZcm-QSKi14RRA,10104
47
49
  iwa/core/services/transfer/multisend.py,sha256=MuOTjzUQoYg1eSixXKhJGBmB1c0ymLelvk4puHm_VGE,15194
48
- iwa/core/services/transfer/native.py,sha256=2CiUOP1gHEXAtLG0-8FaykV3u3jclq5y71gXQNEoc3w,10433
49
- iwa/core/services/transfer/swap.py,sha256=exOJdzwkZaGbrFWfmQT_2JMcZUxnkiehXca8TH-vlF0,12269
50
+ iwa/core/services/transfer/native.py,sha256=fZZJURW5kcNPEA_R9c5eG813F-7_odLcvdHLZqlUavQ,9900
51
+ iwa/core/services/transfer/swap.py,sha256=jsLCj_wc8Q4iWIXplcOIEtAvQnTpgTQF_5wrhQ6GjEk,12306
52
+ iwa/core/tests/test_gnosis_fee.py,sha256=-Qs4yQy8qMrsqWMA5DHYWiF0UEW7PpT3sekJbnKn-uM,3702
53
+ iwa/core/tests/test_ipfs.py,sha256=nhS1ZRAuc9_rtnBd9aJhG7RD5yzA1vWKqcek2Q16pj8,2774
54
+ iwa/core/tests/test_pricing.py,sha256=B2f8vx_JSdilIMu6cb8TxfVyr6kDLt5wN8ZCPvEAuOY,1876
55
+ iwa/core/tests/test_regression_fixes.py,sha256=W53R5Gj-gj8lZJwO_PBVNE3h7pWybj0G99oDwJcCl3g,3972
50
56
  iwa/core/tests/test_wallet.py,sha256=N8_gO7KkV5nqk_KcHqW_xOwNNKpDuXHeFgnala3bB84,9361
51
57
  iwa/plugins/__init__.py,sha256=zy-DjOZn8GSgIETN2X_GAb9O6yk71t6ZRzeUgoZ52KA,23
52
58
  iwa/plugins/gnosis/__init__.py,sha256=dpx0mE84eV-g5iZaH5nKivZJnoKWyRFX5rhdjowBwuU,114
@@ -54,25 +60,25 @@ iwa/plugins/gnosis/cow_utils.py,sha256=iSvbfgTr2bCqRsUznKCWqmoTnyuX-WZX4oh0E-l3X
54
60
  iwa/plugins/gnosis/plugin.py,sha256=AgkgOGYfnrcjWrPUiAvySMj6ITnss0SFXiEi6Z6fnMs,1885
55
61
  iwa/plugins/gnosis/safe.py,sha256=ye5GQhzKALPNiyJhr7lyrhDgdrDyIj_h3TN2QWI4Xds,5519
56
62
  iwa/plugins/gnosis/cow/__init__.py,sha256=lZN5QpIYWL67rE8r7z7zS9dlr8OqFrYeD9T4-RwUghU,224
57
- iwa/plugins/gnosis/cow/quotes.py,sha256=u2xFKgL7QTKqCkSPMv1RHaXvZ6WzID4haaZDMVS42Bs,5177
58
- iwa/plugins/gnosis/cow/swap.py,sha256=XZdvJbTbh54hxer7cKkum7lNQ-03gddMK95K3MenaFE,15209
63
+ iwa/plugins/gnosis/cow/quotes.py,sha256=2emu4St016Gf7Nn5P2XW5CcSNxprKoVecdZQ016RpcY,5177
64
+ iwa/plugins/gnosis/cow/swap.py,sha256=XgeMnTDnCiTXVlrrh2pXk4qmjJnFxIVnhZsa1K82uDQ,14729
59
65
  iwa/plugins/gnosis/cow/types.py,sha256=-9VRiFhAkmN1iIJ95Pg7zLFSeXtkkW00sl13usxi3o8,470
60
- iwa/plugins/gnosis/tests/test_cow.py,sha256=iVy5ockMIcPZWsX4WGXU91DhBsYEZ5NOxtFzAQ2sK3o,8440
66
+ iwa/plugins/gnosis/tests/test_cow.py,sha256=50bj9kZ-PwrZXIdTTTNlien5WdDWHhxI44dcB89jOc8,8809
61
67
  iwa/plugins/gnosis/tests/test_safe.py,sha256=hQHVHBWQhGnuvzvx4U9fOWEwASJWwql42q6cfRcuAls,3218
62
68
  iwa/plugins/olas/__init__.py,sha256=_NhBczzM61fhGYwGhnWfEeL8Jywyy_730GASe2BxzeQ,106
63
- iwa/plugins/olas/constants.py,sha256=iTFoO2QW3KbhL5k5sKsJxxyDytl9wVIb_9hAih55KrE,7728
64
- iwa/plugins/olas/events.py,sha256=SWD3wYdQ-l6dLUJSkfh_WsLmedH4Vsw_EvYXg7QC3yc,5970
65
- iwa/plugins/olas/importer.py,sha256=ZnMi5noNUZMJzQ-aEmtPZz-eOK3cvboIJPL625F3mHQ,42042
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
66
72
  iwa/plugins/olas/mech_reference.py,sha256=CaSCpQnQL4F7wOG6Ox6Zdoy-uNEQ78YBwVLILQZKL8Q,5782
67
- iwa/plugins/olas/models.py,sha256=36N2Wuia7DVfpekJJ2pXPeS0lqhe5ED-Hjdox9YQG2c,5230
68
- iwa/plugins/olas/plugin.py,sha256=zOPWyoVkSVh6guJ3TZj5enJFuiIbP3fRM8FkziPB-c0,15606
69
- iwa/plugins/olas/contracts/activity_checker.py,sha256=WXxuzbpXGVqIfEiMPiiqN3Z_UxIY-Lvx0raa1ErBfPA,5323
73
+ iwa/plugins/olas/models.py,sha256=uXih8UcmBYj6PlxqP-cnyAiazJezjShjkCaN1Kqlb2I,4921
74
+ iwa/plugins/olas/plugin.py,sha256=kz21CxIGQw3Is6HC2dvKvFRIm9m1FRKHO0YgUuDEplQ,15650
75
+ iwa/plugins/olas/contracts/activity_checker.py,sha256=OXh0SFPGfcpeD665ay-I19LqcIx38qEz8o62dw0A9zE,5361
70
76
  iwa/plugins/olas/contracts/base.py,sha256=y73aQbDq6l4zUpz_eQAg4MsLkTAEqjjupXlcvxjfgCI,240
71
77
  iwa/plugins/olas/contracts/mech.py,sha256=dXYtyORc-oiu9ga5PtTquOFkoakb6BLGKvlUsteygIg,2767
72
78
  iwa/plugins/olas/contracts/mech_marketplace.py,sha256=hMADl5MQGvT2wLRKu4vHGe4RrAZVq8Y2M_EvXWWz528,1554
73
79
  iwa/plugins/olas/contracts/mech_marketplace_v1.py,sha256=ooF5uw1wxwYsoriGUGGxXxmaD8DtWZtK4TJBCUNTGtI,2501
74
80
  iwa/plugins/olas/contracts/service.py,sha256=BDQKeCTCnBNrwKD1a8rrlLytpKG3CAdjr-s0ec-dsFY,8243
75
- iwa/plugins/olas/contracts/staking.py,sha256=TimiHSJy5wAlx35uplyeG7TG6NpxPigkmKcrz_ZBCjY,18487
81
+ iwa/plugins/olas/contracts/staking.py,sha256=kKF4Uc2cFr9_drKG5OzFgzKTdgGyHIM_PUa-L0LX9gU,18486
76
82
  iwa/plugins/olas/contracts/abis/activity_checker.json,sha256=HT0IMbyTLMO71ITBKwoS950rHe772suPP4b8eDAodJ0,2230
77
83
  iwa/plugins/olas/contracts/abis/mech.json,sha256=bMMCXInjE_2PTPnc_sIyS_H8pod5Sm_e-xTbKgZppKc,16369
78
84
  iwa/plugins/olas/contracts/abis/mech_marketplace.json,sha256=KPnF-H_UATb3wdb_7o6ky_hSp5xwgvckD-QqylsWJLg,32468
@@ -87,42 +93,44 @@ iwa/plugins/olas/scripts/test_full_mech_flow.py,sha256=Fqoq5bn7Z_3YyRrnuqNAZy9cw
87
93
  iwa/plugins/olas/scripts/test_simple_lifecycle.py,sha256=8T50tOZx3afeECSfCNAb0rAHNtYOsBaeXlMwKXElCk8,2099
88
94
  iwa/plugins/olas/service_manager/__init__.py,sha256=GXiThMEY3nPgHUl1i-DLrF4h96z9jPxxI8Jepo2E1PM,1926
89
95
  iwa/plugins/olas/service_manager/base.py,sha256=EBPg0ymqgtAb7ZvVSfTt31QYgv_6gp4UAc6je00NLAg,5009
90
- iwa/plugins/olas/service_manager/drain.py,sha256=1Ku7axThwLtKxaNTkwhP4j1yjIXbFXAqNFDrCSmgfto,12569
91
- iwa/plugins/olas/service_manager/lifecycle.py,sha256=wvg49bv9_zFH1aR26TqM4VYzH8Ff7J8MJt98-zvkV_Q,49880
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
92
98
  iwa/plugins/olas/service_manager/mech.py,sha256=NVzVbEmyOe3wK92VEzCCOSuy3HDkEP1MSoVt7Av8Psk,27949
93
- iwa/plugins/olas/service_manager/staking.py,sha256=U_Akma_8PDeymHDEH5lNc64AQZ2xN8uljYo0ER7-wYQ,29554
99
+ iwa/plugins/olas/service_manager/staking.py,sha256=kT9OOQ4fi3FrIJB2T2gsvmv7DBRD6pDxqcXXh2o6iwc,29600
94
100
  iwa/plugins/olas/tests/conftest.py,sha256=4vM7EI00SrTGyeP0hNzsGSQHEj2-iznVgzlNh2_OGfo,739
95
101
  iwa/plugins/olas/tests/test_importer.py,sha256=i9LKov7kNRECB3hmRnhKBwcfx3uxtjWe4BB77bOOpeo,4282
96
- iwa/plugins/olas/tests/test_importer_error_handling.py,sha256=yHpdxfN20gnZ1cHPJqk9xHC_26jyVN8kiziY-sl4FuA,11696
102
+ iwa/plugins/olas/tests/test_importer_error_handling.py,sha256=GeXu4Par3_FAUL9hT6Sn5PdRg2_EU2gf3iaL73atoYo,12256
97
103
  iwa/plugins/olas/tests/test_mech_contracts.py,sha256=wvxuigPafF-ySIHVBdWVei3AO418iPh7cSVdAlUGm_s,3566
104
+ iwa/plugins/olas/tests/test_olas_archiving.py,sha256=rwyP-9eZ1cNvvV4h4bBOrs_8qV-du9yt-VNMuH_13nY,3443
98
105
  iwa/plugins/olas/tests/test_olas_contracts.py,sha256=B8X-5l1KfYMoZOiM94_rcNzbILLl78rqt_jhyxzAOqE,10835
99
- 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
100
107
  iwa/plugins/olas/tests/test_olas_models.py,sha256=5scX-wvRLGH3G44S2okq_tyQ9Rk7Pd0Ak1zNCZ2HtI4,4957
101
- iwa/plugins/olas/tests/test_olas_view.py,sha256=kh3crsriyoRiZC6l8vzGllocvQnYmqziv-csbmXih0E,10489
108
+ iwa/plugins/olas/tests/test_olas_view.py,sha256=2SsQYayeV3rf_mAPVvt4vINcMysAXmICkkQe3MRn4K8,10662
102
109
  iwa/plugins/olas/tests/test_olas_view_actions.py,sha256=jAxr9bjFNAaxGf1btIrxdMaHgJ0PWX9aDwVU-oPGMpk,5109
103
110
  iwa/plugins/olas/tests/test_olas_view_modals.py,sha256=8j0PNFjKqFC5V1kBdVFWNLMvqGt49H6fLSYGxn02c8o,5562
104
111
  iwa/plugins/olas/tests/test_plugin.py,sha256=RVgU-Cq6t_3mOh90xFAGwlJOV7ZIgp0VNaK5ZAxisAQ,2565
105
112
  iwa/plugins/olas/tests/test_plugin_full.py,sha256=55EBa07JhJLVG3IMi6QKlR_ivWLYCdLQTySP66qbEXo,8584
106
113
  iwa/plugins/olas/tests/test_service_lifecycle.py,sha256=sOCtpz8T9s55AZe9AoqP1h3XrXw5NDSjDqwLgYThvU4,5559
107
- iwa/plugins/olas/tests/test_service_manager.py,sha256=g9PREmYEHu2iRx9VzQhNJbxQU000dpXg57KN3ApMCTQ,40851
108
- iwa/plugins/olas/tests/test_service_manager_errors.py,sha256=udlAsQj_t1F5TwVQuWhroF6jDJ4RmGEXaxPh87tMsuA,8538
109
- iwa/plugins/olas/tests/test_service_manager_flows.py,sha256=QvRFpJIapZXbagxPApr-995i64aJDapxSFyae8tNSHU,20722
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
110
117
  iwa/plugins/olas/tests/test_service_manager_mech.py,sha256=qG6qu5IPRNypXUsblU2OEkuiuwDJ0TH8RXZbibmTFcQ,4937
111
- iwa/plugins/olas/tests/test_service_manager_rewards.py,sha256=hIVckGl5rEr-KHGNUxxVopal0Tpw4EZharBt0MbaCVA,11798
118
+ iwa/plugins/olas/tests/test_service_manager_rewards.py,sha256=jVAe4HSAxDfnq8Ec-JMsvE2E0HYsydO78ITFHnSSka4,11993
112
119
  iwa/plugins/olas/tests/test_service_manager_validation.py,sha256=ajlfH5uc4mAHf8A7GLE5cW7X8utM2vUilM0JdGDdlVg,5382
113
- iwa/plugins/olas/tests/test_service_staking.py,sha256=miNGZZoIrZf0Am-pJ8gTyvVAruL4P7jMvrtFEhG5wxQ,15694
120
+ iwa/plugins/olas/tests/test_service_staking.py,sha256=ETNnWzV52FDhK0mrPb9xl9gSiYRH2EeDVxcaQIV0d5Q,15849
114
121
  iwa/plugins/olas/tests/test_staking_integration.py,sha256=QCBQf6P2ZmmsEGt2k8W2r53lG2aVRuoMJE-aFxVDLss,9701
115
122
  iwa/plugins/olas/tests/test_staking_validation.py,sha256=uug64jFcXYJ3Nw_lNa3O4fnhNr5wAWHHIrchSbR2MVE,4020
116
123
  iwa/plugins/olas/tui/__init__.py,sha256=5ZRsbC7J3z1xfkZRiwr4bLEklf78rNVjdswe2p7SlS8,28
117
124
  iwa/plugins/olas/tui/olas_view.py,sha256=OlhciDK1Ni4BdzggqTzQeYnP2azB-We02hH6jQhbZuU,37388
118
125
  iwa/tools/__init__.py,sha256=jQyuwDQGRigSe7S9JMb4yK3CXPgZFJNffzt6N2v9PU0,21
119
126
  iwa/tools/check_profile.py,sha256=0LAv9wx4wMM610mX88-6tIoDi2I5LDzh0W9nkprt42s,2177
120
- iwa/tools/list_contracts.py,sha256=2w-LYB2RVS-eGil2kLiBIEm3tYYhYzT4lAuGO6VtLJU,4861
127
+ iwa/tools/drain_accounts.py,sha256=Xd0ephHENms2f5G7IotpFBazPpKrvXoRurctS7fYrc4,1760
128
+ iwa/tools/list_contracts.py,sha256=c7ugXfblJ47cC2n5ruGzBwN5DYWiZVJqKYqIttc_PMk,5013
121
129
  iwa/tools/release.py,sha256=-Z9GG6Y-K6KG32K0VUf_MruiUdJxG6W7ToOMzhyCH7Y,3963
122
- iwa/tools/reset_env.py,sha256=lHWMUatl4n6KNCluX-egA9uSt0xSH9m48gt4Lz8GW28,3831
130
+ iwa/tools/reset_env.py,sha256=UbstfM9zIVNyH_8Oa3T4rSixQLmueR903pRx_aEu_Pk,3833
123
131
  iwa/tools/reset_tenderly.py,sha256=usKfOLrQvdCzEncueg-Sz3spqX80vHPQmbh2tIygo8o,11295
124
132
  iwa/tools/restore_backup.py,sha256=_LJbmKv9SlekLUQFdjI3aHCvAc6uePobJe3bQEFyatk,2455
125
- iwa/tools/test_chainlist.py,sha256=9J06sTsKgnEcN7WSn-YgJkCHhfbGDdVS-KNMDBhYllA,1143
133
+ iwa/tools/test_chainlist.py,sha256=CtSA1p-lUxhaJFqYL8LN20gyDiFwVgHmdyEbSJSxD0M,1167
126
134
  iwa/tools/wallet_check.py,sha256=IQLgb8oCt4oG6FMEAqzUxM57DLv_UE24dFUSVxtBo_Y,4774
127
135
  iwa/tui/__init__.py,sha256=XYIZNQNy-fZC1NHHM0sd9qUO0vE1slml-cm0CpQ4NLY,27
128
136
  iwa/tui/app.py,sha256=XDQ4nAPGBwhrEmdL_e3V8oYSOho8pY7jsd3C_wk92UU,4163
@@ -131,7 +139,7 @@ iwa/tui/workers.py,sha256=lvzbIS375_H1rj7-9d-w0PKnkDJ4lW_13aWzZRaX9fY,1192
131
139
  iwa/tui/modals/__init__.py,sha256=OyrjWjaPqQAllZcUJ-Ac_e1PtTouJy8m1eGo132p-EA,130
132
140
  iwa/tui/modals/base.py,sha256=q9dEV6We_SPxbMRh711amFDwAOBywD00Qg0jcqvh5LE,12060
133
141
  iwa/tui/screens/__init__.py,sha256=j0brLsuVd9M8hM5LHH05E7manY3ZVj24yf7nFyGryp4,31
134
- iwa/tui/screens/wallets.py,sha256=U6IUbV_7ByAyUi3aBVdFr3A1QlGzNORRE4uOHBQXQB0,30825
142
+ iwa/tui/screens/wallets.py,sha256=PJWDwXt3LYBaGny1DH0WtvWzMQGGgWR1kUzlEr8dLW8,30802
135
143
  iwa/tui/tests/test_app.py,sha256=F0tJthsyWzwNbHcGtiyDQtKDPn3m9N1qt2vMGiXrQTQ,3868
136
144
  iwa/tui/tests/test_rpc.py,sha256=4m2HC-R5R9kO5pluo2G_CrTBQv63YYrdZNufTjtnGUk,4330
137
145
  iwa/tui/tests/test_wallets_refactor.py,sha256=71G3HLbhTtgDy3ffVbYv0MFYRgdYd-NWGBdvdzW4M9c,998
@@ -141,7 +149,7 @@ iwa/tui/widgets/base.py,sha256=Z8FigMhsfD76PkFVERqMaotd-xwXfuFZm_8TmCMOsl4,3381
141
149
  iwa/web/dependencies.py,sha256=0_dAJlRh6gKrUDRPKUe92eshFsg572yx_H0lQgSqGDA,2103
142
150
  iwa/web/models.py,sha256=MSD9WPy_Nz_amWgoo2KSDTn4ZLv_AV0o0amuNtSf-68,3035
143
151
  iwa/web/server.py,sha256=4ZLVFEKoGs_NoCcXMeyYzDNdxUXazjwHQaX7CR1pwHE,5239
144
- iwa/web/routers/accounts.py,sha256=HP7DdUbbnRb1dFCs7zqyhx61_IBJwDMKtmXpvAPZodg,3916
152
+ iwa/web/routers/accounts.py,sha256=VhCHrwzRWqZcSW-tTEqFWT5hFl-IYEWpqXeuN8xM3-4,3922
145
153
  iwa/web/routers/state.py,sha256=aEfeGFAOyaS6kWhXuWLrdvEbnQAeonKIWxJrQkqJ1GY,2198
146
154
  iwa/web/routers/swap.py,sha256=8xycAytquR29ELxW3vx428W8s9bI_w_x2kpRhhJ0KXY,22630
147
155
  iwa/web/routers/transactions.py,sha256=bRjfD7zcuX3orVIHzOMVsIkEtcE_pM_KCom4cdAKV6Q,5602
@@ -149,16 +157,16 @@ iwa/web/routers/olas/__init__.py,sha256=Jo6Dm1e8fHafCD800fbxsxeFz3tvuEEKXEf5-9tj
149
157
  iwa/web/routers/olas/admin.py,sha256=PMRdNelqYgQ1xbqh3floFV5xrVtBRQiwZPd8J9_ffxg,5785
150
158
  iwa/web/routers/olas/funding.py,sha256=f8fADNtbZEBFl-vuVKfas6os38Vot6K5tJBTenZmCD0,4832
151
159
  iwa/web/routers/olas/general.py,sha256=dPsBQppTGoQY1RztliUhseOHOZGeeCR10lhThD9kyXo,803
152
- iwa/web/routers/olas/services.py,sha256=mDQh_Hp118Ek8_WIfhmZA_7HC2slw_aKRUjY6PPx91A,18099
160
+ iwa/web/routers/olas/services.py,sha256=jDbxLUJBN48vs2-fXrIpxhPSM6quqYxggmMOkUVEIaI,18200
153
161
  iwa/web/routers/olas/staking.py,sha256=jktJ2C1Q9X4aC0tWJByN3sHpEXY0EIvr3rr4N0MtXXc,14081
154
- iwa/web/static/app.js,sha256=hZns7VpUZDRnHaIkOLinit65yGItYAxRj6j20CBSm-o,113839
162
+ iwa/web/static/app.js,sha256=hBjUSivxf5Uyy2H6BR-rfdvF8e7qBoDPK23aY3dagNY,114418
155
163
  iwa/web/static/index.html,sha256=q7s7plnMbN1Nkzr5bRxZgvgOFerUChEGIZW7SpAVtPc,28514
156
- iwa/web/static/style.css,sha256=aTtE42mmfYV6y7xfo9cUgUhT8x-KyNC1zmPjSdskxIk,24315
157
- iwa/web/tests/test_web_endpoints.py,sha256=C264MH-CTyDW4GLUrTXBgLJKUk4-89pFAScBddd4Fvk,23995
164
+ iwa/web/static/style.css,sha256=7i6T96pS7gXSLDZfyp_87gRlyB9rpsFWJEHJ-dRY1ug,24371
165
+ iwa/web/tests/test_web_endpoints.py,sha256=vA25YghHNB23sbmhD4ciesn_f_okSq0tjlkrSiKZ0rs,24007
158
166
  iwa/web/tests/test_web_olas.py,sha256=0CVSsrncOeJ3x0ECV7mVLQV_CXZRrOqGiVjgLIi6hZ8,16308
159
167
  iwa/web/tests/test_web_swap.py,sha256=7A4gBJFL01kIXPtW1E1J17SCsVc_0DmUn-R8kKrnnVA,2974
160
168
  iwa/web/tests/test_web_swap_coverage.py,sha256=zGNrzlhZ_vWDCvWmLcoUwFgqxnrp_ACbo49AtWBS_Kw,5584
161
- iwa-0.0.33.dist-info/licenses/LICENSE,sha256=eIubm_IlBHPYRQlLNZKbBNKhJUUP3JH0A2miZUhAVfI,1078
169
+ iwa-0.0.59.dist-info/licenses/LICENSE,sha256=eIubm_IlBHPYRQlLNZKbBNKhJUUP3JH0A2miZUhAVfI,1078
162
170
  tests/legacy_cow.py,sha256=oOkZvIxL70ReEoD9oHQbOD5GpjIr6AGNHcOCgfPlerU,8389
163
171
  tests/legacy_safe.py,sha256=AssM2g13E74dNGODu_H0Q0y412lgqsrYnEzI97nm_Ts,2972
164
172
  tests/legacy_transaction_retry_logic.py,sha256=D9RqZ7DBu61Xr2djBAodU2p9UE939LL-DnQXswX5iQk,1497
@@ -166,17 +174,17 @@ tests/legacy_tui.py,sha256=qu5-_C0H9dumElLFEWB71ACOgcA6bxbipgmWCBB12DM,15676
166
174
  tests/legacy_wallets_screen.py,sha256=9hZnX-VhKgwH9w8MxbNdboRyNxLDhOakLKJECsw_vhc,19262
167
175
  tests/legacy_web.py,sha256=q2ERIriaDHT3Q8axG2N3ucO7f2VSvV_WkuPR00DVko4,8577
168
176
  tests/test_account_service.py,sha256=g_AIVT2jhlvUtbFTaCd-d15x4CmXJQaV66tlAgnaXwY,3745
169
- tests/test_balance_service.py,sha256=86iEkPd2M1-UFy3qOxV1EguQOEYbboy2-2mAyS3ctGs,6549
170
- tests/test_chain.py,sha256=cWSLUHRl2Iz55wQA08bk8RvAQnp_ZHCqA829KJ3Ur6c,13609
177
+ tests/test_balance_service.py,sha256=wcuCOVszxPy8nPkldAVcEiygcOK3BuQt797fqAJvbp4,4979
178
+ tests/test_chain.py,sha256=VZoidSojWyt1y4mQdZdoZsjuuDZjLC6neTC-2SF_Q7I,13957
171
179
  tests/test_chain_interface.py,sha256=Wu0q0sREtmYBp7YvWrBIrrSTtqeQj18oJp2VmMUEMec,8312
172
180
  tests/test_chain_interface_coverage.py,sha256=fvrVvw8-DMwdsSFKQHUhpbfutrVRxnnTc-tjB7Bb-jo,3327
173
- tests/test_cli.py,sha256=WW6EDeHLws5-BqFNOy11pH_D5lttuyspD5hrDCFpR0Q,3968
181
+ tests/test_cli.py,sha256=Pl4RC2xp1omiJUnL3Dza6pCmIoO29LJ0vGw33_ZpT5c,3980
174
182
  tests/test_contract.py,sha256=tApHAxsfKGawYJWA9PhTNrOZUE0VVAq79ruIe3KxeWY,14412
175
183
  tests/test_db.py,sha256=dmbrupj0qlUeiiycZ2mzMFjf7HrDa6tcqMPY8zpiKIk,5710
176
- tests/test_drain_coverage.py,sha256=jtN5tIXzSTlS2IjwLS60azyMYsjFDlSTUa98JM1bMic,6786
184
+ tests/test_drain_coverage.py,sha256=oFpY7tFPXWe9WLh3z2D4L2GxuAJO6_txLNxJmtgZT7M,7208
177
185
  tests/test_erc20.py,sha256=kNEw1afpm5EbXRNXkjpkBNZIy7Af1nqGlztKH5IWAwU,3074
178
186
  tests/test_gnosis_plugin.py,sha256=XMoHBCTrnVBq9bXYPzMUIrhr95caucMVRxooCjKrzjg,3454
179
- tests/test_keys.py,sha256=pxlGlHB-NaTbC8qar093ttdHLLtkM8irVNmCbH2KVf4,17421
187
+ tests/test_keys.py,sha256=Qk4n3QDZ2HjXYRvehdrSlvDS_q3NLRLMnCq45Eo1Q9o,17551
180
188
  tests/test_legacy_wallet.py,sha256=Caj3xP1FijRyLKa-xKiZu6NCAsQRHjWbsnAarncAoA0,49798
181
189
  tests/test_main.py,sha256=y2xr7HjCt4rHsxm8y6n24FKCteSHPyxC3DFuMcUgX1Y,475
182
190
  tests/test_migration.py,sha256=fYoxzI3KqGh0cPV0bFcbvGrAnKcNlvnwjggG_uD0QGo,1789
@@ -186,14 +194,17 @@ tests/test_models.py,sha256=1bEfPiDVgEdtwFEzwecSPAHjCF8kjOPSMeQExJ7eCJ4,7107
186
194
  tests/test_monitor.py,sha256=dRVS6EkTwfvGEOg7t0dVhs6M3oEZExBH7iBZe6hmk4M,7261
187
195
  tests/test_multisend.py,sha256=IvXpwnC5xSDRCyCDGcMdO3L-eQegvdjAzHZB0FoVFUI,2685
188
196
  tests/test_plugin_service.py,sha256=ZEe37kV_sv4Eb04032O1hZIoo9yf5gJo83ks7Grzrng,3767
189
- tests/test_pricing.py,sha256=ptu_2Csc6d64bIzMMw3TheJge2Kfn05Gs-twz_KmBzg,5276
190
- tests/test_rate_limiter.py,sha256=DOIlrBP2AtVFHCpznIoFn2FjFc33emG7M_FffLh4MGE,7314
197
+ tests/test_rate_limiter.py,sha256=gC-mVsTCqGbBoUxAllY_WS9kl12rBHQv7MNr1zdUdGQ,7334
198
+ tests/test_rate_limiter_retry.py,sha256=gU4AJk1s39HvdcbGeIoIrr1M7p6WMba_n2y8eFNSXc8,4261
191
199
  tests/test_reset_tenderly.py,sha256=GVoqbDT3n4_GnlKF5Lx-8ew15jT8I2hIPdTulQDb6dI,7215
192
- tests/test_rpc_efficiency.py,sha256=EEcBlbUXEi9JVBorLU7mK7mmK0vcFt53KhefHr1oPQc,3741
193
- tests/test_rpc_rotation.py,sha256=YU21TrMnEbcb36zu_L8dpCSbaHX7CkqXLjipz1swkkc,10554
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
194
203
  tests/test_rpc_view.py,sha256=sgZ53KEHl8VGb7WKYa0VI7Cdxbf8JH1SdroHYbWHjfQ,2031
195
- tests/test_safe_coverage.py,sha256=g9Bdrpkc-Mc8HBjk07lYNRkzxWZiF922uiVLZqhehBE,5093
196
- tests/test_safe_service.py,sha256=nxDYmGd6p2gGe7BEeMxsqS8CgeJarPofV38HC6Cop44,5770
204
+ tests/test_safe_coverage.py,sha256=KBxKz64XkK8CgN0N0LTNVKakf8Wg8EpghcBlLmDFmLs,6119
205
+ tests/test_safe_executor.py,sha256=V3ovBRY1lOuW5rm8rpm5Ns7jb-rgmHKHpz9pMTqz6c4,14448
206
+ tests/test_safe_integration.py,sha256=WWAKDio3N-CFyr5RRvphbOPdu3TI9WSM8IesfbFbvWQ,5363
207
+ tests/test_safe_service.py,sha256=5ULlj0fPZRwg-4fCBJplhm4Msr_Beof7W-Zf_JljZc8,5782
197
208
  tests/test_service_manager_integration.py,sha256=I_BLUzEKrVTyg_8jqsUK0oFD3aQVPCRJ7z0gY8P-j04,2354
198
209
  tests/test_service_manager_structure.py,sha256=zK506ucCXCBHcjPYKrKEuK1bgq0xsbawyL8Y-wahXf8,868
199
210
  tests/test_service_transaction.py,sha256=IeqYhmRD-pIXffBJrBQwfPx-qnfNEJs0iPM3eCb8MLo,7054
@@ -205,14 +216,14 @@ tests/test_transfer_multisend.py,sha256=PErjNqNwN66TMh4oVa307re64Ucccg1LkXqB0Klk
205
216
  tests/test_transfer_native.py,sha256=cDbb4poV_veIw6eHpokrHe9yUndOjA6rQhrHd_IY3HQ,7445
206
217
  tests/test_transfer_security.py,sha256=gdpC6ybdXQbQgILbAQ0GqjWdwn9AJRNR3B_7TYg0NxI,3617
207
218
  tests/test_transfer_structure.py,sha256=Q2rHB8QotipbvPuwL5hbgwcQG-DE-1RFXgoyuFyxpPQ,1172
208
- tests/test_transfer_swap_unit.py,sha256=v_tld2oF2jFf_qdrCxIPQFlAymQqHT2dcw2Z05qWm3I,4998
219
+ tests/test_transfer_swap_unit.py,sha256=XkHuitzbOl-Fgzxx26sPtBI7Tlp-B2tHILryIE_jD_E,5056
209
220
  tests/test_ui_coverage.py,sha256=N-7uhPlKOXCKyS32VjwG3JQRnAS1PoAJxR-InaOZtCQ,2423
210
221
  tests/test_utils.py,sha256=vkP49rYNI8BRzLpWR3WnKdDr8upeZjZcs7Rx0pjbQMo,1292
211
222
  tests/test_workers.py,sha256=MInwdkFY5LdmFB3o1odIaSD7AQZb3263hNafO1De5PE,2793
212
223
  tools/create_and_stake_service.py,sha256=1xwy_bJQI1j9yIQ968Oc9Db_F6mk1659LuuZntTASDE,3742
213
224
  tools/verify_drain.py,sha256=PkMjblyOOAuQge88FwfEzRtCYeEtJxXhPBmtQYCoQ-8,6743
214
- iwa-0.0.33.dist-info/METADATA,sha256=bwANWxXoIcxfT9aqgxEufCR9s4dfGzuEQmc17xjlJno,7295
215
- iwa-0.0.33.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
216
- iwa-0.0.33.dist-info/entry_points.txt,sha256=nwB6kscrfA7M00pYmL2j-sBH6eF6h2ga9IK1BZxdiyQ,241
217
- iwa-0.0.33.dist-info/top_level.txt,sha256=kedS9cRUbm4JE2wYeabIXilhHjN8KCw0IGbqqqsw0Bs,16
218
- iwa-0.0.33.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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.10.1)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -131,49 +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
-
176
-
177
134
  def test_balance_service_with_wallet(mock_account_service):
178
135
  """Test BalanceService initialization with Wallet (has key_storage attr)."""
179
136
  from iwa.core.services.balance import BalanceService
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: Tests for sign_and_send_transaction were removed because the method was removed
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
- assert params["gasPrice"] == 20
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
 
@@ -317,7 +326,6 @@ def test_chain_interface_with_real_chains():
317
326
  # --- Negative Tests ---
318
327
 
319
328
 
320
-
321
329
  def test_get_token_symbol_fallback_on_error(mock_web3):
322
330
  """Test get_token_symbol returns truncated address on error."""
323
331
  chain = MagicMock(spec=SupportedChain)
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.create_account.assert_called_with("test")
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.create_account.side_effect = ValueError("Error creating account")
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
@@ -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 test_withdraw_rewards_no_withdrawal_address(mock_drain_manager):
98
- """Test withdraw_rewards with no withdrawal address configured."""
99
- mock_drain_manager.service.multisig_address = "0xSafe"
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
- success, amount = mock_drain_manager.withdraw_rewards()
103
- assert not success
104
- assert amount == 0
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):