iwa 0.0.29__tar.gz → 0.0.31__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 (223) hide show
  1. {iwa-0.0.29/src/iwa.egg-info → iwa-0.0.31}/PKG-INFO +1 -1
  2. {iwa-0.0.29 → iwa-0.0.31}/pyproject.toml +2 -2
  3. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/transaction.py +26 -1
  4. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/importer.py +9 -3
  5. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/service_manager/lifecycle.py +16 -5
  6. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tui/olas_view.py +22 -3
  7. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/olas/staking.py +34 -10
  8. {iwa-0.0.29 → iwa-0.0.31/src/iwa.egg-info}/PKG-INFO +1 -1
  9. {iwa-0.0.29 → iwa-0.0.31}/LICENSE +0 -0
  10. {iwa-0.0.29 → iwa-0.0.31}/README.md +0 -0
  11. {iwa-0.0.29 → iwa-0.0.31}/setup.cfg +0 -0
  12. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/__init__.py +0 -0
  13. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/__main__.py +0 -0
  14. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/__init__.py +0 -0
  15. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/chain/__init__.py +0 -0
  16. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/chain/errors.py +0 -0
  17. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/chain/interface.py +0 -0
  18. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/chain/manager.py +0 -0
  19. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/chain/models.py +0 -0
  20. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/chain/rate_limiter.py +0 -0
  21. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/chainlist.py +0 -0
  22. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/cli.py +0 -0
  23. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/constants.py +0 -0
  24. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/__init__.py +0 -0
  25. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/abis/erc20.json +0 -0
  26. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/abis/multisend.json +0 -0
  27. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/abis/multisend_call_only.json +0 -0
  28. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/cache.py +0 -0
  29. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/contract.py +0 -0
  30. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/decoder.py +0 -0
  31. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/erc20.py +0 -0
  32. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/multisend.py +0 -0
  33. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/db.py +0 -0
  34. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/ipfs.py +0 -0
  35. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/keys.py +0 -0
  36. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/mnemonic.py +0 -0
  37. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/models.py +0 -0
  38. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/monitor.py +0 -0
  39. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/plugins.py +0 -0
  40. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/pricing.py +0 -0
  41. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/rpc_monitor.py +0 -0
  42. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/secrets.py +0 -0
  43. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/__init__.py +0 -0
  44. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/account.py +0 -0
  45. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/balance.py +0 -0
  46. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/plugin.py +0 -0
  47. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/safe.py +0 -0
  48. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/transfer/__init__.py +0 -0
  49. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/transfer/base.py +0 -0
  50. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/transfer/erc20.py +0 -0
  51. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/transfer/multisend.py +0 -0
  52. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/transfer/native.py +0 -0
  53. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/transfer/swap.py +0 -0
  54. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/tables.py +0 -0
  55. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/test.py +0 -0
  56. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/tests/test_wallet.py +0 -0
  57. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/types.py +0 -0
  58. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/ui.py +0 -0
  59. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/utils.py +0 -0
  60. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/wallet.py +0 -0
  61. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/__init__.py +0 -0
  62. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/__init__.py +0 -0
  63. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/cow/__init__.py +0 -0
  64. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/cow/quotes.py +0 -0
  65. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/cow/swap.py +0 -0
  66. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/cow/types.py +0 -0
  67. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/cow_utils.py +0 -0
  68. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/plugin.py +0 -0
  69. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/safe.py +0 -0
  70. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/tests/test_cow.py +0 -0
  71. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/tests/test_safe.py +0 -0
  72. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/__init__.py +0 -0
  73. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/constants.py +0 -0
  74. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/activity_checker.json +0 -0
  75. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/mech.json +0 -0
  76. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/mech_marketplace.json +0 -0
  77. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/mech_marketplace_v1.json +0 -0
  78. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/mech_new.json +0 -0
  79. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/service_manager.json +0 -0
  80. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/service_registry.json +0 -0
  81. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/service_registry_token_utility.json +0 -0
  82. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/staking.json +0 -0
  83. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/staking_token.json +0 -0
  84. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/activity_checker.py +0 -0
  85. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/base.py +0 -0
  86. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/mech.py +0 -0
  87. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/mech_marketplace.py +0 -0
  88. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/mech_marketplace_v1.py +0 -0
  89. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/service.py +0 -0
  90. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/staking.py +0 -0
  91. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/events.py +0 -0
  92. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/mech_reference.py +0 -0
  93. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/models.py +0 -0
  94. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/plugin.py +0 -0
  95. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/scripts/test_full_mech_flow.py +0 -0
  96. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/scripts/test_simple_lifecycle.py +0 -0
  97. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/service_manager/__init__.py +0 -0
  98. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/service_manager/base.py +0 -0
  99. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/service_manager/drain.py +0 -0
  100. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/service_manager/mech.py +0 -0
  101. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/service_manager/staking.py +0 -0
  102. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/conftest.py +0 -0
  103. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_importer.py +0 -0
  104. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_importer_error_handling.py +0 -0
  105. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_mech_contracts.py +0 -0
  106. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_olas_contracts.py +0 -0
  107. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_olas_integration.py +0 -0
  108. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_olas_models.py +0 -0
  109. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_olas_view.py +0 -0
  110. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_olas_view_actions.py +0 -0
  111. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_olas_view_modals.py +0 -0
  112. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_plugin.py +0 -0
  113. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_plugin_full.py +0 -0
  114. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_lifecycle.py +0 -0
  115. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_manager.py +0 -0
  116. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_manager_errors.py +0 -0
  117. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_manager_flows.py +0 -0
  118. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_manager_mech.py +0 -0
  119. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_manager_rewards.py +0 -0
  120. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_manager_validation.py +0 -0
  121. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_staking.py +0 -0
  122. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_staking_integration.py +0 -0
  123. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_staking_validation.py +0 -0
  124. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tui/__init__.py +0 -0
  125. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/__init__.py +0 -0
  126. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/check_profile.py +0 -0
  127. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/list_contracts.py +0 -0
  128. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/release.py +0 -0
  129. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/reset_env.py +0 -0
  130. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/reset_tenderly.py +0 -0
  131. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/restore_backup.py +0 -0
  132. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/test_chainlist.py +0 -0
  133. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/wallet_check.py +0 -0
  134. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/__init__.py +0 -0
  135. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/app.py +0 -0
  136. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/modals/__init__.py +0 -0
  137. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/modals/base.py +0 -0
  138. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/rpc.py +0 -0
  139. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/screens/__init__.py +0 -0
  140. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/screens/wallets.py +0 -0
  141. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/tests/test_app.py +0 -0
  142. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/tests/test_rpc.py +0 -0
  143. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/tests/test_wallets_refactor.py +0 -0
  144. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/tests/test_widgets.py +0 -0
  145. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/widgets/__init__.py +0 -0
  146. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/widgets/base.py +0 -0
  147. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/workers.py +0 -0
  148. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/dependencies.py +0 -0
  149. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/models.py +0 -0
  150. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/accounts.py +0 -0
  151. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/olas/__init__.py +0 -0
  152. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/olas/admin.py +0 -0
  153. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/olas/funding.py +0 -0
  154. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/olas/general.py +0 -0
  155. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/olas/services.py +0 -0
  156. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/state.py +0 -0
  157. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/swap.py +0 -0
  158. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/transactions.py +0 -0
  159. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/server.py +0 -0
  160. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/static/app.js +0 -0
  161. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/static/index.html +0 -0
  162. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/static/style.css +0 -0
  163. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/tests/test_web_endpoints.py +0 -0
  164. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/tests/test_web_olas.py +0 -0
  165. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/tests/test_web_swap.py +0 -0
  166. {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/tests/test_web_swap_coverage.py +0 -0
  167. {iwa-0.0.29 → iwa-0.0.31}/src/iwa.egg-info/SOURCES.txt +0 -0
  168. {iwa-0.0.29 → iwa-0.0.31}/src/iwa.egg-info/dependency_links.txt +0 -0
  169. {iwa-0.0.29 → iwa-0.0.31}/src/iwa.egg-info/entry_points.txt +0 -0
  170. {iwa-0.0.29 → iwa-0.0.31}/src/iwa.egg-info/requires.txt +0 -0
  171. {iwa-0.0.29 → iwa-0.0.31}/src/iwa.egg-info/top_level.txt +0 -0
  172. {iwa-0.0.29 → iwa-0.0.31}/src/tests/legacy_cow.py +0 -0
  173. {iwa-0.0.29 → iwa-0.0.31}/src/tests/legacy_safe.py +0 -0
  174. {iwa-0.0.29 → iwa-0.0.31}/src/tests/legacy_transaction_retry_logic.py +0 -0
  175. {iwa-0.0.29 → iwa-0.0.31}/src/tests/legacy_tui.py +0 -0
  176. {iwa-0.0.29 → iwa-0.0.31}/src/tests/legacy_wallets_screen.py +0 -0
  177. {iwa-0.0.29 → iwa-0.0.31}/src/tests/legacy_web.py +0 -0
  178. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_account_service.py +0 -0
  179. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_balance_service.py +0 -0
  180. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_chain.py +0 -0
  181. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_chain_interface.py +0 -0
  182. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_chain_interface_coverage.py +0 -0
  183. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_cli.py +0 -0
  184. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_contract.py +0 -0
  185. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_db.py +0 -0
  186. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_drain_coverage.py +0 -0
  187. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_erc20.py +0 -0
  188. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_gnosis_plugin.py +0 -0
  189. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_keys.py +0 -0
  190. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_legacy_wallet.py +0 -0
  191. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_main.py +0 -0
  192. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_migration.py +0 -0
  193. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_mnemonic.py +0 -0
  194. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_modals.py +0 -0
  195. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_models.py +0 -0
  196. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_monitor.py +0 -0
  197. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_multisend.py +0 -0
  198. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_plugin_service.py +0 -0
  199. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_pricing.py +0 -0
  200. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_rate_limiter.py +0 -0
  201. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_reset_tenderly.py +0 -0
  202. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_rpc_efficiency.py +0 -0
  203. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_rpc_rotation.py +0 -0
  204. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_rpc_view.py +0 -0
  205. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_safe_coverage.py +0 -0
  206. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_safe_service.py +0 -0
  207. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_service_manager_integration.py +0 -0
  208. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_service_manager_structure.py +0 -0
  209. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_service_transaction.py +0 -0
  210. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_staking_router.py +0 -0
  211. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_staking_simple.py +0 -0
  212. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_tables.py +0 -0
  213. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_transaction_service.py +0 -0
  214. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_transfer_multisend.py +0 -0
  215. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_transfer_native.py +0 -0
  216. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_transfer_security.py +0 -0
  217. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_transfer_structure.py +0 -0
  218. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_transfer_swap_unit.py +0 -0
  219. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_ui_coverage.py +0 -0
  220. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_utils.py +0 -0
  221. {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_workers.py +0 -0
  222. {iwa-0.0.29 → iwa-0.0.31}/src/tools/create_and_stake_service.py +0 -0
  223. {iwa-0.0.29 → iwa-0.0.31}/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.29
3
+ Version: 0.0.31
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.29"
3
+ version = "0.0.31"
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.29"
74
+ target-version = "0.0.31"
75
75
  fix = true
76
76
 
77
77
  [tool.ruff.lint]
@@ -425,7 +425,32 @@ class TransactionService:
425
425
  return False, {}
426
426
 
427
427
  except Exception as e:
428
- logger.exception(f"Safe transaction failed: {e}")
428
+ # Try to decode detailed revert reason
429
+ error_text = str(e)
430
+ decoded_msg = None
431
+
432
+ # Extract hex data from common error patterns
433
+ # Pattern 1: ('execution reverted', '0x...')
434
+ import re
435
+ hex_match = re.search(r"0x[0-9a-fA-F]{8,}", error_text)
436
+
437
+ if hex_match:
438
+ try:
439
+ from iwa.core.contracts.decoder import ErrorDecoder
440
+ data = hex_match.group(0)
441
+ decoded = ErrorDecoder().decode(data)
442
+ if decoded:
443
+ # Use the first successful decoding
444
+ name, msg, source = decoded[0]
445
+ decoded_msg = f"{msg} (from {source})"
446
+ except Exception:
447
+ pass
448
+
449
+ if decoded_msg:
450
+ logger.error(f"Safe transaction failed: {decoded_msg}")
451
+ else:
452
+ logger.exception(f"Safe transaction failed: {e}")
453
+
429
454
  return False, {}
430
455
 
431
456
  def _is_gas_too_low_error(self, err_text: str) -> bool:
@@ -888,8 +888,10 @@ class OlasServiceImporter:
888
888
  def _generate_tag(self, key: DiscoveredKey, service_name: Optional[str]) -> str:
889
889
  """Generate a unique tag for an imported key.
890
890
 
891
- Tags follow the pattern: {service_name}_{role}
892
- Example: trader_alpha_agent, trader_alpha_operator
891
+ Tags follow the pattern: {service_name}_{role}[_eoa]
892
+ Examples:
893
+ - trader_alpha_agent
894
+ - trader_alpha_owner_eoa (EOA keys for owner role)
893
895
  """
894
896
  # Use service name as prefix, or 'imported' as fallback
895
897
  prefix = service_name or "imported"
@@ -898,7 +900,11 @@ class OlasServiceImporter:
898
900
  prefix = re.sub(r"[^a-z0-9]+", "_", prefix.lower()).strip("_")
899
901
  role = re.sub(r"[^a-z0-9]+", "_", key.role.lower()).strip("_")
900
902
 
901
- base_tag = f"{prefix}_{role}"
903
+ # Add _eoa suffix for owner/operator keys to distinguish from owner_safe
904
+ if role in ["owner", "operator"]:
905
+ base_tag = f"{prefix}_{role}_eoa"
906
+ else:
907
+ base_tag = f"{prefix}_{role}"
902
908
 
903
909
  # Check if tag already exists
904
910
  existing_tags = {
@@ -877,8 +877,14 @@ class LifecycleManagerMixin:
877
877
  """Terminate the service."""
878
878
  # Check that the service is deployed
879
879
  service_state = self.registry.get_service(self.service.service_id)["state"]
880
- if service_state != ServiceState.DEPLOYED:
881
- logger.error("Service is not deployed, cannot terminate")
880
+ if service_state not in [
881
+ ServiceState.DEPLOYED,
882
+ ServiceState.ACTIVE_REGISTRATION,
883
+ ServiceState.FINISHED_REGISTRATION,
884
+ ]:
885
+ logger.error(
886
+ f"Service is in {service_state.name}, cannot terminate (must be active or deployed)"
887
+ )
882
888
  return False
883
889
 
884
890
  # Check that the service is not staked
@@ -1133,8 +1139,13 @@ class LifecycleManagerMixin:
1133
1139
 
1134
1140
  def _process_wind_down_state(self, current_state: ServiceState) -> bool:
1135
1141
  """Process a single state transition for wind down."""
1136
- if current_state == ServiceState.DEPLOYED:
1137
- logger.info("Terminating service...")
1142
+ # Allow termination from any active state > PRE_REGISTRATION
1143
+ if current_state in [
1144
+ ServiceState.DEPLOYED,
1145
+ ServiceState.ACTIVE_REGISTRATION,
1146
+ ServiceState.FINISHED_REGISTRATION,
1147
+ ]:
1148
+ logger.info(f"Terminating service from state {current_state.name}...")
1138
1149
  if not self.terminate():
1139
1150
  logger.error("Failed to terminate service")
1140
1151
  return False
@@ -1146,7 +1157,7 @@ class LifecycleManagerMixin:
1146
1157
  else:
1147
1158
  # Should not happen if logic is correct map of transitions
1148
1159
  logger.error(
1149
- f"State {current_state.name} is not a valid start for wind_down (expected DEPLOYED or TERMINATED_BONDED)"
1160
+ f"State {current_state.name} is not a valid start for wind_down (expected active state or TERMINATED_BONDED)"
1150
1161
  )
1151
1162
  return False
1152
1163
  return True
@@ -508,14 +508,33 @@ class OlasView(Static):
508
508
  self._show_stake_contracts_modal(filtered_contracts, service_key)
509
509
 
510
510
  def _get_service_bond(self, service_key: str) -> Optional[int]:
511
- """Fetch the security deposit (bond) for a service."""
511
+ """Fetch the security deposit (bond) for a service.
512
+
513
+ Uses ServiceRegistryTokenUtilityContract.get_service_token_deposit() which returns
514
+ the persistent bond value even for terminated services.
515
+ """
516
+ from iwa.core.contracts.cache import ContractCache
517
+ from iwa.plugins.olas.constants import OLAS_CONTRACTS
518
+ from iwa.plugins.olas.contracts.service import ServiceRegistryTokenUtilityContract
512
519
  from iwa.plugins.olas.service_manager import ServiceManager
513
520
 
514
521
  try:
515
522
  manager = ServiceManager(self._wallet, service_key=service_key)
516
523
  if manager.service:
517
- service_info = manager.registry.get_service(manager.service.service_id)
518
- return service_info.get("security_deposit", 0)
524
+ service_id = manager.service.service_id
525
+ chain_name = manager.service.chain_name
526
+
527
+ protocol_contracts = OLAS_CONTRACTS.get(chain_name.lower(), {})
528
+ utility_address = protocol_contracts.get("OLAS_SERVICE_REGISTRY_TOKEN_UTILITY")
529
+
530
+ if utility_address:
531
+ token_utility = ContractCache().get_contract(
532
+ ServiceRegistryTokenUtilityContract,
533
+ address=str(utility_address),
534
+ chain_name=chain_name,
535
+ )
536
+ _, security_deposit = token_utility.get_service_token_deposit(service_id)
537
+ return security_deposit
519
538
  except Exception as e:
520
539
  self.notify(f"Warning: Could not fetch service bond: {e}", severity="warning")
521
540
  return None
@@ -68,30 +68,54 @@ def get_staking_contracts(
68
68
 
69
69
 
70
70
  def _get_service_filter_info(service_key: Optional[str]) -> tuple[Optional[int], Optional[str]]:
71
- """Retrieve service bond and token if service_key is provided."""
71
+ """Retrieve service bond and token if service_key is provided.
72
+
73
+ Uses ServiceRegistryTokenUtilityContract.get_service_token_deposit() which returns
74
+ the persistent bond value, even for terminated services. This is the correct source
75
+ because bonds are stored separately from service state.
76
+ """
72
77
  service_bond = None
73
78
  service_token = None
74
79
 
75
80
  if service_key:
76
81
  try:
82
+ from iwa.core.contracts.cache import ContractCache
83
+ from iwa.plugins.olas.constants import OLAS_CONTRACTS
84
+ from iwa.plugins.olas.contracts.service import ServiceRegistryTokenUtilityContract
77
85
  from iwa.plugins.olas.service_manager import ServiceManager
78
86
 
79
87
  # Initialize wallet dependencies for ServiceManager
80
88
  manager = ServiceManager(wallet, service_key)
81
89
  if manager.service:
82
- # Get service requirements
83
- service_token = (manager.service.token_address or "").lower()
84
90
  service_id_int = manager.service.service_id
91
+ chain_name = manager.service.chain_name
85
92
 
86
- # Get security deposit from registry - this is the actual bond value
93
+ # Get token and deposit from TokenUtility contract (persists after terminate)
87
94
  try:
88
- service_info = manager.registry.get_service(service_id_int)
89
- service_bond = service_info.get("security_deposit", 0)
90
- logger.info(
91
- f"Filtering for service {service_key}: security_deposit={service_bond}, token={service_token}"
92
- )
95
+ protocol_contracts = OLAS_CONTRACTS.get(chain_name.lower(), {})
96
+ utility_address = protocol_contracts.get("OLAS_SERVICE_REGISTRY_TOKEN_UTILITY")
97
+
98
+ if utility_address:
99
+ token_utility = ContractCache().get_contract(
100
+ ServiceRegistryTokenUtilityContract,
101
+ address=str(utility_address),
102
+ chain_name=chain_name,
103
+ )
104
+ token_addr, security_deposit = token_utility.get_service_token_deposit(
105
+ service_id_int
106
+ )
107
+ service_bond = security_deposit
108
+ service_token = token_addr.lower() if token_addr else ""
109
+ logger.info(
110
+ f"Filtering for service {service_key}: security_deposit={service_bond}, token={service_token}"
111
+ )
112
+ else:
113
+ logger.warning(f"Token utility address not found for chain {chain_name}")
114
+ service_token = (manager.service.token_address or "").lower()
93
115
  except Exception as e:
94
- logger.warning(f"Failed to get service info for filtering: {e}")
116
+ logger.warning(f"Failed to get token deposit for filtering: {e}")
117
+ # Fallback to configured token_address
118
+ service_token = (manager.service.token_address or "").lower()
95
119
 
96
120
  except Exception as e:
97
121
  logger.warning(f"Could not fetch service details for filtering: {e}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iwa
3
- Version: 0.0.29
3
+ Version: 0.0.31
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
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes