iwa 0.0.25__tar.gz → 0.0.27__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.25/src/iwa.egg-info → iwa-0.0.27}/PKG-INFO +1 -1
  2. {iwa-0.0.25 → iwa-0.0.27}/pyproject.toml +2 -2
  3. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/importer.py +17 -0
  4. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/service_manager/drain.py +5 -2
  5. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/service_manager/lifecycle.py +14 -6
  6. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/service_manager/staking.py +20 -9
  7. {iwa-0.0.25 → iwa-0.0.27/src/iwa.egg-info}/PKG-INFO +1 -1
  8. {iwa-0.0.25 → iwa-0.0.27}/LICENSE +0 -0
  9. {iwa-0.0.25 → iwa-0.0.27}/README.md +0 -0
  10. {iwa-0.0.25 → iwa-0.0.27}/setup.cfg +0 -0
  11. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/__init__.py +0 -0
  12. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/__main__.py +0 -0
  13. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/__init__.py +0 -0
  14. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/chain/__init__.py +0 -0
  15. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/chain/errors.py +0 -0
  16. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/chain/interface.py +0 -0
  17. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/chain/manager.py +0 -0
  18. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/chain/models.py +0 -0
  19. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/chain/rate_limiter.py +0 -0
  20. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/chainlist.py +0 -0
  21. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/cli.py +0 -0
  22. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/constants.py +0 -0
  23. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/__init__.py +0 -0
  24. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/abis/erc20.json +0 -0
  25. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/abis/multisend.json +0 -0
  26. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/abis/multisend_call_only.json +0 -0
  27. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/cache.py +0 -0
  28. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/contract.py +0 -0
  29. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/erc20.py +0 -0
  30. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/multisend.py +0 -0
  31. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/db.py +0 -0
  32. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/ipfs.py +0 -0
  33. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/keys.py +0 -0
  34. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/mnemonic.py +0 -0
  35. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/models.py +0 -0
  36. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/monitor.py +0 -0
  37. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/plugins.py +0 -0
  38. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/pricing.py +0 -0
  39. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/rpc_monitor.py +0 -0
  40. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/secrets.py +0 -0
  41. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/__init__.py +0 -0
  42. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/account.py +0 -0
  43. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/balance.py +0 -0
  44. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/plugin.py +0 -0
  45. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/safe.py +0 -0
  46. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/transaction.py +0 -0
  47. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/transfer/__init__.py +0 -0
  48. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/transfer/base.py +0 -0
  49. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/transfer/erc20.py +0 -0
  50. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/transfer/multisend.py +0 -0
  51. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/transfer/native.py +0 -0
  52. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/transfer/swap.py +0 -0
  53. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/tables.py +0 -0
  54. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/test.py +0 -0
  55. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/tests/test_wallet.py +0 -0
  56. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/types.py +0 -0
  57. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/ui.py +0 -0
  58. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/utils.py +0 -0
  59. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/wallet.py +0 -0
  60. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/__init__.py +0 -0
  61. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/__init__.py +0 -0
  62. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/cow/__init__.py +0 -0
  63. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/cow/quotes.py +0 -0
  64. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/cow/swap.py +0 -0
  65. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/cow/types.py +0 -0
  66. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/cow_utils.py +0 -0
  67. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/plugin.py +0 -0
  68. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/safe.py +0 -0
  69. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/tests/test_cow.py +0 -0
  70. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/tests/test_safe.py +0 -0
  71. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/__init__.py +0 -0
  72. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/constants.py +0 -0
  73. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/activity_checker.json +0 -0
  74. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/mech.json +0 -0
  75. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/mech_marketplace.json +0 -0
  76. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/mech_marketplace_v1.json +0 -0
  77. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/mech_new.json +0 -0
  78. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/service_manager.json +0 -0
  79. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/service_registry.json +0 -0
  80. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/service_registry_token_utility.json +0 -0
  81. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/staking.json +0 -0
  82. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/staking_token.json +0 -0
  83. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/activity_checker.py +0 -0
  84. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/base.py +0 -0
  85. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/mech.py +0 -0
  86. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/mech_marketplace.py +0 -0
  87. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/mech_marketplace_v1.py +0 -0
  88. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/service.py +0 -0
  89. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/staking.py +0 -0
  90. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/events.py +0 -0
  91. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/mech_reference.py +0 -0
  92. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/models.py +0 -0
  93. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/plugin.py +0 -0
  94. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/scripts/test_full_mech_flow.py +0 -0
  95. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/scripts/test_simple_lifecycle.py +0 -0
  96. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/service_manager/__init__.py +0 -0
  97. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/service_manager/base.py +0 -0
  98. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/service_manager/mech.py +0 -0
  99. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/conftest.py +0 -0
  100. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_importer.py +0 -0
  101. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_importer_error_handling.py +0 -0
  102. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_mech_contracts.py +0 -0
  103. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_olas_contracts.py +0 -0
  104. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_olas_integration.py +0 -0
  105. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_olas_models.py +0 -0
  106. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_olas_view.py +0 -0
  107. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_olas_view_actions.py +0 -0
  108. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_olas_view_modals.py +0 -0
  109. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_plugin.py +0 -0
  110. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_plugin_full.py +0 -0
  111. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_lifecycle.py +0 -0
  112. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_manager.py +0 -0
  113. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_manager_errors.py +0 -0
  114. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_manager_flows.py +0 -0
  115. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_manager_mech.py +0 -0
  116. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_manager_rewards.py +0 -0
  117. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_manager_validation.py +0 -0
  118. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_staking.py +0 -0
  119. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_staking_integration.py +0 -0
  120. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_staking_validation.py +0 -0
  121. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tui/__init__.py +0 -0
  122. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tui/olas_view.py +0 -0
  123. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/__init__.py +0 -0
  124. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/check_profile.py +0 -0
  125. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/list_contracts.py +0 -0
  126. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/release.py +0 -0
  127. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/reset_env.py +0 -0
  128. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/reset_tenderly.py +0 -0
  129. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/restore_backup.py +0 -0
  130. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/test_chainlist.py +0 -0
  131. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/wallet_check.py +0 -0
  132. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/__init__.py +0 -0
  133. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/app.py +0 -0
  134. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/modals/__init__.py +0 -0
  135. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/modals/base.py +0 -0
  136. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/rpc.py +0 -0
  137. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/screens/__init__.py +0 -0
  138. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/screens/wallets.py +0 -0
  139. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/tests/test_app.py +0 -0
  140. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/tests/test_rpc.py +0 -0
  141. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/tests/test_wallets_refactor.py +0 -0
  142. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/tests/test_widgets.py +0 -0
  143. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/widgets/__init__.py +0 -0
  144. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/widgets/base.py +0 -0
  145. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/workers.py +0 -0
  146. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/dependencies.py +0 -0
  147. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/models.py +0 -0
  148. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/accounts.py +0 -0
  149. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/olas/__init__.py +0 -0
  150. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/olas/admin.py +0 -0
  151. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/olas/funding.py +0 -0
  152. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/olas/general.py +0 -0
  153. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/olas/services.py +0 -0
  154. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/olas/staking.py +0 -0
  155. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/state.py +0 -0
  156. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/swap.py +0 -0
  157. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/transactions.py +0 -0
  158. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/server.py +0 -0
  159. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/static/app.js +0 -0
  160. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/static/index.html +0 -0
  161. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/static/style.css +0 -0
  162. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/tests/test_web_endpoints.py +0 -0
  163. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/tests/test_web_olas.py +0 -0
  164. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/tests/test_web_swap.py +0 -0
  165. {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/tests/test_web_swap_coverage.py +0 -0
  166. {iwa-0.0.25 → iwa-0.0.27}/src/iwa.egg-info/SOURCES.txt +0 -0
  167. {iwa-0.0.25 → iwa-0.0.27}/src/iwa.egg-info/dependency_links.txt +0 -0
  168. {iwa-0.0.25 → iwa-0.0.27}/src/iwa.egg-info/entry_points.txt +0 -0
  169. {iwa-0.0.25 → iwa-0.0.27}/src/iwa.egg-info/requires.txt +0 -0
  170. {iwa-0.0.25 → iwa-0.0.27}/src/iwa.egg-info/top_level.txt +0 -0
  171. {iwa-0.0.25 → iwa-0.0.27}/src/tests/legacy_cow.py +0 -0
  172. {iwa-0.0.25 → iwa-0.0.27}/src/tests/legacy_safe.py +0 -0
  173. {iwa-0.0.25 → iwa-0.0.27}/src/tests/legacy_transaction_retry_logic.py +0 -0
  174. {iwa-0.0.25 → iwa-0.0.27}/src/tests/legacy_tui.py +0 -0
  175. {iwa-0.0.25 → iwa-0.0.27}/src/tests/legacy_wallets_screen.py +0 -0
  176. {iwa-0.0.25 → iwa-0.0.27}/src/tests/legacy_web.py +0 -0
  177. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_account_service.py +0 -0
  178. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_balance_service.py +0 -0
  179. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_chain.py +0 -0
  180. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_chain_interface.py +0 -0
  181. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_chain_interface_coverage.py +0 -0
  182. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_cli.py +0 -0
  183. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_contract.py +0 -0
  184. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_db.py +0 -0
  185. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_drain_coverage.py +0 -0
  186. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_erc20.py +0 -0
  187. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_gnosis_plugin.py +0 -0
  188. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_keys.py +0 -0
  189. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_legacy_wallet.py +0 -0
  190. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_main.py +0 -0
  191. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_migration.py +0 -0
  192. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_mnemonic.py +0 -0
  193. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_modals.py +0 -0
  194. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_models.py +0 -0
  195. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_monitor.py +0 -0
  196. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_multisend.py +0 -0
  197. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_plugin_service.py +0 -0
  198. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_pricing.py +0 -0
  199. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_rate_limiter.py +0 -0
  200. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_reset_tenderly.py +0 -0
  201. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_rpc_efficiency.py +0 -0
  202. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_rpc_rotation.py +0 -0
  203. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_rpc_view.py +0 -0
  204. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_safe_coverage.py +0 -0
  205. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_safe_service.py +0 -0
  206. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_service_manager_integration.py +0 -0
  207. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_service_manager_structure.py +0 -0
  208. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_service_transaction.py +0 -0
  209. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_staking_router.py +0 -0
  210. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_staking_simple.py +0 -0
  211. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_tables.py +0 -0
  212. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_transaction_service.py +0 -0
  213. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_transfer_multisend.py +0 -0
  214. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_transfer_native.py +0 -0
  215. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_transfer_security.py +0 -0
  216. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_transfer_structure.py +0 -0
  217. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_transfer_swap_unit.py +0 -0
  218. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_ui_coverage.py +0 -0
  219. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_utils.py +0 -0
  220. {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_workers.py +0 -0
  221. {iwa-0.0.25 → iwa-0.0.27}/src/tools/create_and_stake_service.py +0 -0
  222. {iwa-0.0.25 → iwa-0.0.27}/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.25
3
+ Version: 0.0.27
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.25"
3
+ version = "0.0.27"
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.25"
74
+ target-version = "0.0.27"
75
75
  fix = true
76
76
 
77
77
  [tool.ruff.lint]
@@ -234,6 +234,9 @@ class OlasServiceImporter:
234
234
  # Extract staking program from .env
235
235
  self._extract_staking_from_env(service, folder)
236
236
 
237
+ # Infer owner address from keys if not already set
238
+ self._infer_owner_address(service)
239
+
237
240
  if not service.keys and not service.service_id:
238
241
  logger.debug(f"No valid data found in {folder}")
239
242
  return None
@@ -423,6 +426,9 @@ class OlasServiceImporter:
423
426
  # 5. Extract owner address from wallets folder
424
427
  self._extract_owner_address(service, operate_folder)
425
428
 
429
+ # 6. Infer owner address from keys if not already set
430
+ self._infer_owner_address(service)
431
+
426
432
  return service
427
433
 
428
434
  def _extract_keys_from_operate_config(
@@ -534,6 +540,17 @@ class OlasServiceImporter:
534
540
  service.keys.append(key)
535
541
  existing_addrs.add(key.address.lower())
536
542
 
543
+ def _infer_owner_address(self, service: DiscoveredService) -> None:
544
+ """Infer service_owner_address from keys with role='owner' if not already set."""
545
+ if service.service_owner_address:
546
+ return # Already set
547
+
548
+ for key in service.keys:
549
+ if key.role == "owner" and key.address:
550
+ service.service_owner_address = key.address
551
+ logger.debug(f"Inferred owner address from key: {key.address}")
552
+ return
553
+
537
554
  def _parse_keystore_file(
538
555
  self, file_path: Path, role: str = "unknown"
539
556
  ) -> Optional[DiscoveredKey]:
@@ -59,9 +59,12 @@ class DrainManagerMixin:
59
59
 
60
60
  logger.info(f"Claiming {accrued_rewards / 1e18:.4f} OLAS rewards for service {service_id}")
61
61
 
62
+ # Use service owner which holds the reward rights (not necessarily master)
63
+ owner_address = self.service.service_owner_address or self.wallet.master_account.address
64
+
62
65
  # Prepare and send claim transaction
63
66
  claim_tx = staking_contract.prepare_claim_tx(
64
- from_address=self.wallet.master_account.address,
67
+ from_address=owner_address,
65
68
  service_id=service_id,
66
69
  )
67
70
 
@@ -71,7 +74,7 @@ class DrainManagerMixin:
71
74
 
72
75
  success, receipt = self.wallet.sign_and_send_transaction(
73
76
  claim_tx,
74
- signer_address_or_tag=self.wallet.master_account.address,
77
+ signer_address_or_tag=owner_address,
75
78
  chain_name=self.chain_name,
76
79
  tags=["olas_claim_rewards"],
77
80
  )
@@ -522,9 +522,14 @@ class LifecycleManagerMixin:
522
522
  f"activation_value={activation_value} wei"
523
523
  )
524
524
 
525
- logger.debug(f"[ACTIVATE] Preparing tx: service_id={service_id}, value={activation_value}")
525
+ # Use service owner which holds the NFT (not necessarily master)
526
+ owner_address = self.service.service_owner_address or self.wallet.master_account.address
527
+
528
+ logger.debug(
529
+ f"[ACTIVATE] Preparing tx from {owner_address}: service_id={service_id}, value={activation_value}"
530
+ )
526
531
  activate_tx = self.manager.prepare_activate_registration_tx(
527
- from_address=self.wallet.master_account.address,
532
+ from_address=owner_address,
528
533
  service_id=service_id,
529
534
  value=activation_value,
530
535
  )
@@ -532,7 +537,7 @@ class LifecycleManagerMixin:
532
537
 
533
538
  success, receipt = self.wallet.sign_and_send_transaction(
534
539
  transaction=activate_tx,
535
- signer_address_or_tag=self.wallet.master_account.address,
540
+ signer_address_or_tag=owner_address,
536
541
  chain_name=self.chain_name,
537
542
  )
538
543
 
@@ -720,13 +725,16 @@ class LifecycleManagerMixin:
720
725
  f"total_value={total_value} wei"
721
726
  )
722
727
 
728
+ # Use service owner which holds the NFT (not necessarily master)
729
+ owner_address = self.service.service_owner_address or self.wallet.master_account.address
730
+
723
731
  logger.debug(
724
- f"[REGISTER] Preparing tx: agent={agent_account_address}, "
732
+ f"[REGISTER] Preparing tx from {owner_address}: agent={agent_account_address}, "
725
733
  f"agent_ids={self.service.agent_ids}, value={total_value}"
726
734
  )
727
735
 
728
736
  register_tx = self.manager.prepare_register_agents_tx(
729
- from_address=self.wallet.master_account.address,
737
+ from_address=owner_address,
730
738
  service_id=service_id,
731
739
  agent_instances=[agent_account_address],
732
740
  agent_ids=self.service.agent_ids,
@@ -736,7 +744,7 @@ class LifecycleManagerMixin:
736
744
 
737
745
  success, receipt = self.wallet.sign_and_send_transaction(
738
746
  transaction=register_tx,
739
- signer_address_or_tag=self.wallet.master_account.address,
747
+ signer_address_or_tag=owner_address,
740
748
  chain_name=self.chain_name,
741
749
  tags=["olas_register_agent"],
742
750
  )
@@ -408,17 +408,20 @@ class StakingManagerMixin:
408
408
  True if approval succeeded, False otherwise.
409
409
 
410
410
  """
411
+ # Use service owner which holds the NFT (not necessarily master)
412
+ owner_address = self.service.service_owner_address or self.wallet.master_account.address
413
+
411
414
  # Approve service NFT - this is an ERC-721 approval, not ERC-20
412
- logger.debug("[STAKE] Approving service NFT for staking contract...")
415
+ logger.debug(f"[STAKE] Approving service NFT for staking contract from {owner_address}...")
413
416
  approve_tx = self.registry.prepare_approve_tx(
414
- from_address=self.wallet.master_account.address,
417
+ from_address=owner_address,
415
418
  spender=staking_contract.address,
416
419
  id_=self.service.service_id,
417
420
  )
418
421
 
419
422
  success, receipt = self.wallet.sign_and_send_transaction(
420
423
  transaction=approve_tx,
421
- signer_address_or_tag=self.wallet.master_account.address,
424
+ signer_address_or_tag=owner_address,
422
425
  chain_name=self.chain_name,
423
426
  tags=["olas_approve_service_nft"],
424
427
  )
@@ -452,16 +455,19 @@ class StakingManagerMixin:
452
455
  True if stake succeeded and ServiceStaked event was found.
453
456
 
454
457
  """
455
- logger.debug("[STAKE] Preparing stake transaction...")
458
+ # Use service owner which holds the NFT (not necessarily master)
459
+ owner_address = self.service.service_owner_address or self.wallet.master_account.address
460
+
461
+ logger.debug(f"[STAKE] Preparing stake transaction from {owner_address}...")
456
462
  stake_tx = staking_contract.prepare_stake_tx(
457
- from_address=self.wallet.master_account.address,
463
+ from_address=owner_address,
458
464
  service_id=self.service.service_id,
459
465
  )
460
466
  logger.debug(f"[STAKE] TX prepared: to={stake_tx.get('to')}")
461
467
 
462
468
  success, receipt = self.wallet.sign_and_send_transaction(
463
469
  transaction=stake_tx,
464
- signer_address_or_tag=self.wallet.master_account.address,
470
+ signer_address_or_tag=owner_address,
465
471
  chain_name=self.chain_name,
466
472
  tags=["olas_stake_service"],
467
473
  )
@@ -541,11 +547,16 @@ class StakingManagerMixin:
541
547
  except Exception as e:
542
548
  logger.warning(f"Could not verify staking duration: {e}. Proceeding with caution.")
543
549
 
550
+ # Use service owner which holds the NFT (not necessarily master)
551
+ owner_address = self.service.service_owner_address or self.wallet.master_account.address
552
+
544
553
  # Unstake the service
545
554
  try:
546
- logger.info(f"Preparing unstake transaction for service {self.service.service_id}")
555
+ logger.info(
556
+ f"Preparing unstake transaction for service {self.service.service_id} from {owner_address}"
557
+ )
547
558
  unstake_tx = staking_contract.prepare_unstake_tx(
548
- from_address=self.wallet.master_account.address,
559
+ from_address=owner_address,
549
560
  service_id=self.service.service_id,
550
561
  )
551
562
  logger.info("Unstake transaction prepared successfully")
@@ -556,7 +567,7 @@ class StakingManagerMixin:
556
567
 
557
568
  success, receipt = self.wallet.sign_and_send_transaction(
558
569
  transaction=unstake_tx,
559
- signer_address_or_tag=self.wallet.master_account.address,
570
+ signer_address_or_tag=owner_address,
560
571
  chain_name=self.chain_name,
561
572
  tags=["olas_unstake_service"],
562
573
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iwa
3
- Version: 0.0.25
3
+ Version: 0.0.27
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