iwa 0.0.20__tar.gz → 0.0.21__tar.gz

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 (222) hide show
  1. {iwa-0.0.20/src/iwa.egg-info → iwa-0.0.21}/PKG-INFO +1 -1
  2. {iwa-0.0.20 → iwa-0.0.21}/pyproject.toml +2 -2
  3. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/chain/interface.py +8 -1
  4. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/monitor.py +2 -2
  5. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/safe.py +2 -2
  6. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/safe.py +1 -1
  7. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/tests/test_safe.py +1 -1
  8. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/plugin.py +2 -2
  9. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_plugin_full.py +3 -5
  10. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/rpc.py +1 -1
  11. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/screens/wallets.py +2 -2
  12. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/tests/test_rpc.py +2 -2
  13. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/widgets/base.py +1 -1
  14. {iwa-0.0.20 → iwa-0.0.21/src/iwa.egg-info}/PKG-INFO +1 -1
  15. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_monitor.py +3 -3
  16. {iwa-0.0.20 → iwa-0.0.21}/LICENSE +0 -0
  17. {iwa-0.0.20 → iwa-0.0.21}/README.md +0 -0
  18. {iwa-0.0.20 → iwa-0.0.21}/setup.cfg +0 -0
  19. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/__init__.py +0 -0
  20. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/__main__.py +0 -0
  21. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/__init__.py +0 -0
  22. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/chain/__init__.py +0 -0
  23. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/chain/errors.py +0 -0
  24. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/chain/manager.py +0 -0
  25. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/chain/models.py +0 -0
  26. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/chain/rate_limiter.py +0 -0
  27. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/chainlist.py +0 -0
  28. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/cli.py +0 -0
  29. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/constants.py +0 -0
  30. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/__init__.py +0 -0
  31. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/abis/erc20.json +0 -0
  32. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/abis/multisend.json +0 -0
  33. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/abis/multisend_call_only.json +0 -0
  34. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/cache.py +0 -0
  35. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/contract.py +0 -0
  36. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/erc20.py +0 -0
  37. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/multisend.py +0 -0
  38. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/db.py +0 -0
  39. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/ipfs.py +0 -0
  40. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/keys.py +0 -0
  41. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/mnemonic.py +0 -0
  42. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/models.py +0 -0
  43. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/plugins.py +0 -0
  44. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/pricing.py +0 -0
  45. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/rpc_monitor.py +0 -0
  46. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/secrets.py +0 -0
  47. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/__init__.py +0 -0
  48. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/account.py +0 -0
  49. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/balance.py +0 -0
  50. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/plugin.py +0 -0
  51. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/transaction.py +0 -0
  52. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/transfer/__init__.py +0 -0
  53. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/transfer/base.py +0 -0
  54. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/transfer/erc20.py +0 -0
  55. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/transfer/multisend.py +0 -0
  56. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/transfer/native.py +0 -0
  57. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/transfer/swap.py +0 -0
  58. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/tables.py +0 -0
  59. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/test.py +0 -0
  60. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/tests/test_wallet.py +0 -0
  61. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/types.py +0 -0
  62. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/ui.py +0 -0
  63. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/utils.py +0 -0
  64. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/wallet.py +0 -0
  65. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/__init__.py +0 -0
  66. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/__init__.py +0 -0
  67. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/cow/__init__.py +0 -0
  68. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/cow/quotes.py +0 -0
  69. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/cow/swap.py +0 -0
  70. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/cow/types.py +0 -0
  71. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/cow_utils.py +0 -0
  72. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/plugin.py +0 -0
  73. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/tests/test_cow.py +0 -0
  74. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/__init__.py +0 -0
  75. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/constants.py +0 -0
  76. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/activity_checker.json +0 -0
  77. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/mech.json +0 -0
  78. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/mech_marketplace.json +0 -0
  79. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/mech_marketplace_v1.json +0 -0
  80. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/mech_new.json +0 -0
  81. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/service_manager.json +0 -0
  82. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/service_registry.json +0 -0
  83. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/service_registry_token_utility.json +0 -0
  84. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/staking.json +0 -0
  85. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/staking_token.json +0 -0
  86. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/activity_checker.py +0 -0
  87. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/base.py +0 -0
  88. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/mech.py +0 -0
  89. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/mech_marketplace.py +0 -0
  90. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/mech_marketplace_v1.py +0 -0
  91. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/service.py +0 -0
  92. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/staking.py +0 -0
  93. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/events.py +0 -0
  94. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/importer.py +0 -0
  95. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/mech_reference.py +0 -0
  96. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/models.py +0 -0
  97. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/scripts/test_full_mech_flow.py +0 -0
  98. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/scripts/test_simple_lifecycle.py +0 -0
  99. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/service_manager/__init__.py +0 -0
  100. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/service_manager/base.py +0 -0
  101. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/service_manager/drain.py +0 -0
  102. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/service_manager/lifecycle.py +0 -0
  103. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/service_manager/mech.py +0 -0
  104. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/service_manager/staking.py +0 -0
  105. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/conftest.py +0 -0
  106. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_importer.py +0 -0
  107. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_importer_error_handling.py +0 -0
  108. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_mech_contracts.py +0 -0
  109. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_olas_contracts.py +0 -0
  110. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_olas_integration.py +0 -0
  111. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_olas_models.py +0 -0
  112. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_olas_view.py +0 -0
  113. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_olas_view_actions.py +0 -0
  114. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_olas_view_modals.py +0 -0
  115. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_plugin.py +0 -0
  116. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_lifecycle.py +0 -0
  117. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_manager.py +0 -0
  118. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_manager_errors.py +0 -0
  119. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_manager_flows.py +0 -0
  120. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_manager_mech.py +0 -0
  121. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_manager_rewards.py +0 -0
  122. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_manager_validation.py +0 -0
  123. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_staking.py +0 -0
  124. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_staking_integration.py +0 -0
  125. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_staking_validation.py +0 -0
  126. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tui/__init__.py +0 -0
  127. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tui/olas_view.py +0 -0
  128. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/__init__.py +0 -0
  129. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/check_profile.py +0 -0
  130. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/list_contracts.py +0 -0
  131. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/release.py +0 -0
  132. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/reset_env.py +0 -0
  133. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/reset_tenderly.py +0 -0
  134. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/restore_backup.py +0 -0
  135. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/test_chainlist.py +0 -0
  136. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/wallet_check.py +0 -0
  137. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/__init__.py +0 -0
  138. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/app.py +0 -0
  139. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/modals/__init__.py +0 -0
  140. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/modals/base.py +0 -0
  141. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/screens/__init__.py +0 -0
  142. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/tests/test_app.py +0 -0
  143. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/tests/test_wallets_refactor.py +0 -0
  144. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/tests/test_widgets.py +0 -0
  145. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/widgets/__init__.py +0 -0
  146. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/workers.py +0 -0
  147. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/dependencies.py +0 -0
  148. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/models.py +0 -0
  149. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/accounts.py +0 -0
  150. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/olas/__init__.py +0 -0
  151. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/olas/admin.py +0 -0
  152. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/olas/funding.py +0 -0
  153. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/olas/general.py +0 -0
  154. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/olas/services.py +0 -0
  155. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/olas/staking.py +0 -0
  156. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/state.py +0 -0
  157. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/swap.py +0 -0
  158. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/transactions.py +0 -0
  159. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/server.py +0 -0
  160. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/static/app.js +0 -0
  161. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/static/index.html +0 -0
  162. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/static/style.css +0 -0
  163. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/tests/test_web_endpoints.py +0 -0
  164. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/tests/test_web_olas.py +0 -0
  165. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/tests/test_web_swap.py +0 -0
  166. {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/tests/test_web_swap_coverage.py +0 -0
  167. {iwa-0.0.20 → iwa-0.0.21}/src/iwa.egg-info/SOURCES.txt +0 -0
  168. {iwa-0.0.20 → iwa-0.0.21}/src/iwa.egg-info/dependency_links.txt +0 -0
  169. {iwa-0.0.20 → iwa-0.0.21}/src/iwa.egg-info/entry_points.txt +0 -0
  170. {iwa-0.0.20 → iwa-0.0.21}/src/iwa.egg-info/requires.txt +0 -0
  171. {iwa-0.0.20 → iwa-0.0.21}/src/iwa.egg-info/top_level.txt +0 -0
  172. {iwa-0.0.20 → iwa-0.0.21}/src/tests/legacy_cow.py +0 -0
  173. {iwa-0.0.20 → iwa-0.0.21}/src/tests/legacy_safe.py +0 -0
  174. {iwa-0.0.20 → iwa-0.0.21}/src/tests/legacy_transaction_retry_logic.py +0 -0
  175. {iwa-0.0.20 → iwa-0.0.21}/src/tests/legacy_tui.py +0 -0
  176. {iwa-0.0.20 → iwa-0.0.21}/src/tests/legacy_wallets_screen.py +0 -0
  177. {iwa-0.0.20 → iwa-0.0.21}/src/tests/legacy_web.py +0 -0
  178. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_account_service.py +0 -0
  179. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_balance_service.py +0 -0
  180. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_chain.py +0 -0
  181. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_chain_interface.py +0 -0
  182. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_chain_interface_coverage.py +0 -0
  183. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_cli.py +0 -0
  184. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_contract.py +0 -0
  185. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_db.py +0 -0
  186. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_drain_coverage.py +0 -0
  187. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_erc20.py +0 -0
  188. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_gnosis_plugin.py +0 -0
  189. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_keys.py +0 -0
  190. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_legacy_wallet.py +0 -0
  191. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_main.py +0 -0
  192. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_migration.py +0 -0
  193. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_mnemonic.py +0 -0
  194. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_modals.py +0 -0
  195. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_models.py +0 -0
  196. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_multisend.py +0 -0
  197. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_plugin_service.py +0 -0
  198. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_pricing.py +0 -0
  199. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_rate_limiter.py +0 -0
  200. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_reset_tenderly.py +0 -0
  201. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_rpc_efficiency.py +0 -0
  202. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_rpc_rotation.py +0 -0
  203. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_rpc_view.py +0 -0
  204. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_safe_coverage.py +0 -0
  205. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_safe_service.py +0 -0
  206. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_service_manager_integration.py +0 -0
  207. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_service_manager_structure.py +0 -0
  208. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_service_transaction.py +0 -0
  209. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_staking_router.py +0 -0
  210. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_staking_simple.py +0 -0
  211. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_tables.py +0 -0
  212. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_transaction_service.py +0 -0
  213. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_transfer_multisend.py +0 -0
  214. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_transfer_native.py +0 -0
  215. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_transfer_security.py +0 -0
  216. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_transfer_structure.py +0 -0
  217. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_transfer_swap_unit.py +0 -0
  218. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_ui_coverage.py +0 -0
  219. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_utils.py +0 -0
  220. {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_workers.py +0 -0
  221. {iwa-0.0.20 → iwa-0.0.21}/src/tools/create_and_stake_service.py +0 -0
  222. {iwa-0.0.20 → iwa-0.0.21}/src/tools/verify_drain.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iwa
3
- Version: 0.0.20
3
+ Version: 0.0.21
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,6 +1,6 @@
1
1
  [project]
2
2
  name = "iwa"
3
- version = "0.0.20"
3
+ version = "0.0.21"
4
4
  description = "A secure, modular, and plugin-based framework for crypto agents and ops"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12,<4.0"
@@ -71,7 +71,7 @@ where = ["src"]
71
71
 
72
72
  [tool.ruff]
73
73
  line-length = 100
74
- target-version = "0.0.20"
74
+ target-version = "0.0.21"
75
75
  fix = true
76
76
 
77
77
  [tool.ruff.lint]
@@ -48,10 +48,17 @@ class ChainInterface:
48
48
  self._rotation_lock = threading.Lock()
49
49
  self._init_web3()
50
50
 
51
+ @property
52
+ def current_rpc(self) -> str:
53
+ """Get the current active RPC URL."""
54
+ if not self.chain.rpcs:
55
+ return ""
56
+ return self.chain.rpcs[self._current_rpc_index]
57
+
51
58
  @property
52
59
  def is_tenderly(self) -> bool:
53
60
  """Check if connected to Tenderly vNet."""
54
- rpc = self.chain.rpc or ""
61
+ rpc = self.current_rpc or ""
55
62
  return "tenderly" in rpc.lower() or "virtual" in rpc.lower()
56
63
 
57
64
  def init_block_tracking(self):
@@ -24,7 +24,7 @@ class EventMonitor:
24
24
  self.chain_interface = ChainInterfaces().get(chain_name)
25
25
  self.web3 = self.chain_interface.web3
26
26
  self.running = False
27
- if self.chain_interface.chain.rpc:
27
+ if self.chain_interface.current_rpc:
28
28
  try:
29
29
  self.last_checked_block = self.web3.eth.block_number
30
30
  except Exception:
@@ -39,7 +39,7 @@ class EventMonitor:
39
39
  f"Starting EventMonitor for {len(self.addresses)} addresses on {self.chain_interface.chain.name}"
40
40
  )
41
41
 
42
- if not self.chain_interface.chain.rpc:
42
+ if not self.chain_interface.current_rpc:
43
43
  logger.error(
44
44
  f"Cannot start EventMonitor: No RPC URL found for chain {self.chain_interface.chain.name}"
45
45
  )
@@ -102,7 +102,7 @@ class SafeService:
102
102
 
103
103
  # Use ChainInterface which has proper RPC rotation and parsing
104
104
  chain_interface = ChainInterfaces().get(chain_name)
105
- return EthereumClient(chain_interface.chain.rpc)
105
+ return EthereumClient(chain_interface.current_rpc)
106
106
 
107
107
  def _deploy_safe_contract(
108
108
  self,
@@ -254,7 +254,7 @@ class SafeService:
254
254
 
255
255
  # Use ChainInterface which has proper RPC rotation and parsing
256
256
  chain_interface = ChainInterfaces().get(chain)
257
- ethereum_client = EthereumClient(chain_interface.chain.rpc)
257
+ ethereum_client = EthereumClient(chain_interface.current_rpc)
258
258
 
259
259
  code = ethereum_client.w3.eth.get_code(account.address)
260
260
 
@@ -30,7 +30,7 @@ class SafeMultisig:
30
30
  from iwa.core.chain import ChainInterfaces
31
31
 
32
32
  chain_interface = ChainInterfaces().get(chain_name.lower())
33
- ethereum_client = EthereumClient(chain_interface.chain.rpc)
33
+ ethereum_client = EthereumClient(chain_interface.current_rpc)
34
34
  self.multisig = Safe(safe_account.address, ethereum_client)
35
35
  self.ethereum_client = ethereum_client
36
36
 
@@ -42,7 +42,7 @@ def test_init(safe_account, mock_settings, mock_safe_eth):
42
42
  """Test initialization."""
43
43
  with patch("iwa.core.chain.ChainInterfaces") as mock_ci_cls:
44
44
  mock_ci = mock_ci_cls.return_value
45
- mock_ci.get.return_value.chain.rpc = "http://rpc"
45
+ mock_ci.get.return_value.current_rpc = "http://rpc"
46
46
  ms = SafeMultisig(safe_account, "gnosis")
47
47
  assert ms.multisig is not None
48
48
  mock_safe_eth[0].assert_called_with("http://rpc") # EthereumClient init
@@ -73,12 +73,12 @@ class OlasPlugin(Plugin):
73
73
 
74
74
  try:
75
75
  chain_interface = ChainInterfaces().get(chain_name)
76
- if not chain_interface.chain.rpcs:
76
+ if not chain_interface.current_rpc:
77
77
  return None, None
78
78
  except ValueError:
79
79
  return None, None # Chain not supported/configured
80
80
 
81
- ethereum_client = EthereumClient(chain_interface.chain.rpc)
81
+ ethereum_client = EthereumClient(chain_interface.current_rpc)
82
82
  safe = Safe(safe_address, ethereum_client)
83
83
  owners = safe.retrieve_owners()
84
84
  return owners, True
@@ -105,7 +105,7 @@ def test_get_safe_signers_edge_cases(plugin):
105
105
  # 1. No RPC configured
106
106
  with patch("iwa.core.chain.ChainInterfaces") as mock_ci_cls:
107
107
  mock_ci = mock_ci_cls.return_value
108
- mock_ci.get.return_value.chain.rpcs = []
108
+ mock_ci.get.return_value.current_rpc = ""
109
109
  signers, exists = plugin._get_safe_signers("0x1", "gnosis")
110
110
  assert signers is None
111
111
  assert exists is None
@@ -113,8 +113,7 @@ def test_get_safe_signers_edge_cases(plugin):
113
113
  # 2. Safe doesn't exist (raises exception)
114
114
  with patch("iwa.core.chain.ChainInterfaces") as mock_ci_cls:
115
115
  mock_ci = mock_ci_cls.return_value
116
- mock_ci.get.return_value.chain.rpcs = ["http://rpc"]
117
- mock_ci.get.return_value.chain.rpc = "http://rpc"
116
+ mock_ci.get.return_value.current_rpc = "http://rpc"
118
117
  with patch("safe_eth.eth.EthereumClient"), patch("safe_eth.safe.Safe") as mock_safe_cls:
119
118
  mock_safe = mock_safe_cls.return_value
120
119
  mock_safe.retrieve_owners.side_effect = Exception("Generic error")
@@ -126,8 +125,7 @@ def test_get_safe_signers_edge_cases(plugin):
126
125
  # 3. Success path
127
126
  with patch("iwa.core.chain.ChainInterfaces") as mock_ci_cls:
128
127
  mock_ci = mock_ci_cls.return_value
129
- mock_ci.get.return_value.chain.rpcs = ["http://rpc"]
130
- mock_ci.get.return_value.chain.rpc = "http://rpc"
128
+ mock_ci.get.return_value.current_rpc = "http://rpc"
131
129
  with patch("safe_eth.eth.EthereumClient"), patch("safe_eth.safe.Safe") as mock_safe_cls:
132
130
  mock_safe = mock_safe_cls.return_value
133
131
  mock_safe.retrieve_owners.return_value = ["0xAgent"]
@@ -38,7 +38,7 @@ class RPCView(Static):
38
38
  results.append((chain_name, "N/A", "Not Configured", "-"))
39
39
  continue
40
40
 
41
- rpc_url = interface.chain.rpc
41
+ rpc_url = interface.current_rpc
42
42
  if not rpc_url:
43
43
  results.append((chain_name, "None", "Missing URL", "-"))
44
44
  continue
@@ -381,7 +381,7 @@ class WalletsScreen(VerticalScroll):
381
381
  self.stop_monitor()
382
382
  addresses = [acc.address for acc in self.wallet.key_storage.accounts.values()]
383
383
  for chain_name, interface in ChainInterfaces().items():
384
- if interface.chain.rpc:
384
+ if interface.current_rpc:
385
385
  monitor = EventMonitor(addresses, self.monitor_callback, chain_name)
386
386
 
387
387
  # Worker wrapper
@@ -497,7 +497,7 @@ class WalletsScreen(VerticalScroll):
497
497
  """Handle blockchain selection changes."""
498
498
  if event.value and event.value != self.active_chain:
499
499
  interface = ChainInterfaces().get(event.value)
500
- if not interface or not interface.chain.rpc:
500
+ if not interface or not interface.current_rpc:
501
501
  self.notify(f"No RPC for {event.value}", severity="warning")
502
502
  event.control.value = self.active_chain
503
503
  return
@@ -71,7 +71,7 @@ def test_check_rpcs_success(rpc_view, mock_chain_interfaces):
71
71
  """Test check_rpcs with successful connections."""
72
72
  # Setup mock chain interfaces
73
73
  mock_gnosis = MagicMock()
74
- mock_gnosis.chain.rpc = "http://gnosis"
74
+ mock_gnosis.current_rpc = "http://gnosis"
75
75
  mock_gnosis.web3.is_connected.return_value = True
76
76
 
77
77
  mock_chain_interfaces.get.side_effect = lambda name: mock_gnosis if name == "gnosis" else None
@@ -99,7 +99,7 @@ def test_check_rpcs_success(rpc_view, mock_chain_interfaces):
99
99
  def test_check_rpcs_error(rpc_view, mock_chain_interfaces):
100
100
  """Test check_rpcs with connection error."""
101
101
  mock_eth = MagicMock()
102
- mock_eth.chain.rpc = "http://eth"
102
+ mock_eth.current_rpc = "http://eth"
103
103
  mock_eth.web3.is_connected.side_effect = Exception("Connection fail")
104
104
 
105
105
  mock_chain_interfaces.get.side_effect = lambda name: mock_eth if name == "ethereum" else None
@@ -39,7 +39,7 @@ class ChainSelector(Horizontal):
39
39
 
40
40
  for name in chain_names:
41
41
  interface = ChainInterfaces().get(name)
42
- if interface.chain.rpc:
42
+ if interface.current_rpc:
43
43
  label = name.title()
44
44
  chain_options.append((label, name))
45
45
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iwa
3
- Version: 0.0.20
3
+ Version: 0.0.21
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
@@ -12,7 +12,7 @@ def mock_chain_interfaces():
12
12
  instance = mock.return_value
13
13
  gnosis_interface = MagicMock()
14
14
  gnosis_interface.chain.name = "Gnosis"
15
- gnosis_interface.chain.rpc = "https://rpc"
15
+ gnosis_interface.current_rpc = "https://rpc"
16
16
  gnosis_interface.web3 = MagicMock()
17
17
  instance.get.return_value = gnosis_interface
18
18
  yield instance
@@ -46,7 +46,7 @@ def test_monitor_init_rpc_fail(mock_chain_interfaces, mock_callback):
46
46
 
47
47
  def test_monitor_init_no_rpc(mock_chain_interfaces, mock_callback):
48
48
  chain_interface = mock_chain_interfaces.get.return_value
49
- chain_interface.chain.rpc = ""
49
+ chain_interface.current_rpc = ""
50
50
 
51
51
  monitor = EventMonitor(["0x1234567890123456789012345678901234567890"], mock_callback)
52
52
  assert monitor.last_checked_block == 0
@@ -54,7 +54,7 @@ def test_monitor_init_no_rpc(mock_chain_interfaces, mock_callback):
54
54
 
55
55
  def test_start_no_rpc(mock_chain_interfaces, mock_callback):
56
56
  chain_interface = mock_chain_interfaces.get.return_value
57
- chain_interface.chain.rpc = ""
57
+ chain_interface.current_rpc = ""
58
58
 
59
59
  monitor = EventMonitor(["0x1234567890123456789012345678901234567890"], mock_callback)
60
60
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes