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.
- {iwa-0.0.25/src/iwa.egg-info → iwa-0.0.27}/PKG-INFO +1 -1
- {iwa-0.0.25 → iwa-0.0.27}/pyproject.toml +2 -2
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/importer.py +17 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/service_manager/drain.py +5 -2
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/service_manager/lifecycle.py +14 -6
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/service_manager/staking.py +20 -9
- {iwa-0.0.25 → iwa-0.0.27/src/iwa.egg-info}/PKG-INFO +1 -1
- {iwa-0.0.25 → iwa-0.0.27}/LICENSE +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/README.md +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/setup.cfg +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/__main__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/chain/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/chain/errors.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/chain/interface.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/chain/manager.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/chain/models.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/chain/rate_limiter.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/chainlist.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/cli.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/constants.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/abis/erc20.json +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/abis/multisend.json +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/abis/multisend_call_only.json +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/cache.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/contract.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/erc20.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/contracts/multisend.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/db.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/ipfs.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/keys.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/mnemonic.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/models.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/monitor.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/plugins.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/pricing.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/rpc_monitor.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/secrets.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/account.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/balance.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/plugin.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/safe.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/transaction.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/transfer/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/transfer/base.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/transfer/erc20.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/transfer/multisend.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/transfer/native.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/services/transfer/swap.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/tables.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/test.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/tests/test_wallet.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/types.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/ui.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/utils.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/core/wallet.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/cow/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/cow/quotes.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/cow/swap.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/cow/types.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/cow_utils.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/plugin.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/safe.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/tests/test_cow.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/gnosis/tests/test_safe.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/constants.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/activity_checker.json +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/mech.json +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/mech_marketplace.json +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/mech_marketplace_v1.json +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/mech_new.json +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/service_manager.json +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/service_registry.json +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/service_registry_token_utility.json +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/staking.json +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/staking_token.json +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/activity_checker.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/base.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/mech.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/mech_marketplace.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/mech_marketplace_v1.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/service.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/staking.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/events.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/mech_reference.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/models.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/plugin.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/scripts/test_full_mech_flow.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/scripts/test_simple_lifecycle.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/service_manager/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/service_manager/base.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/service_manager/mech.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/conftest.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_importer.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_importer_error_handling.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_mech_contracts.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_olas_contracts.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_olas_integration.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_olas_models.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_olas_view.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_olas_view_actions.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_olas_view_modals.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_plugin.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_plugin_full.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_lifecycle.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_manager.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_manager_errors.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_manager_flows.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_manager_mech.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_manager_rewards.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_manager_validation.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_service_staking.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_staking_integration.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tests/test_staking_validation.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tui/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/tui/olas_view.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/check_profile.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/list_contracts.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/release.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/reset_env.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/reset_tenderly.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/restore_backup.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/test_chainlist.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tools/wallet_check.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/app.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/modals/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/modals/base.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/rpc.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/screens/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/screens/wallets.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/tests/test_app.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/tests/test_rpc.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/tests/test_wallets_refactor.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/tests/test_widgets.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/widgets/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/widgets/base.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/tui/workers.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/dependencies.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/models.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/accounts.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/olas/__init__.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/olas/admin.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/olas/funding.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/olas/general.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/olas/services.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/olas/staking.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/state.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/swap.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/routers/transactions.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/server.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/static/app.js +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/static/index.html +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/static/style.css +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/tests/test_web_endpoints.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/tests/test_web_olas.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/tests/test_web_swap.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa/web/tests/test_web_swap_coverage.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa.egg-info/SOURCES.txt +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa.egg-info/dependency_links.txt +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa.egg-info/entry_points.txt +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa.egg-info/requires.txt +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/iwa.egg-info/top_level.txt +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/legacy_cow.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/legacy_safe.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/legacy_transaction_retry_logic.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/legacy_tui.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/legacy_wallets_screen.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/legacy_web.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_account_service.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_balance_service.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_chain.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_chain_interface.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_chain_interface_coverage.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_cli.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_contract.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_db.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_drain_coverage.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_erc20.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_gnosis_plugin.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_keys.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_legacy_wallet.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_main.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_migration.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_mnemonic.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_modals.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_models.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_monitor.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_multisend.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_plugin_service.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_pricing.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_rate_limiter.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_reset_tenderly.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_rpc_efficiency.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_rpc_rotation.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_rpc_view.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_safe_coverage.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_safe_service.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_service_manager_integration.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_service_manager_structure.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_service_transaction.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_staking_router.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_staking_simple.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_tables.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_transaction_service.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_transfer_multisend.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_transfer_native.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_transfer_security.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_transfer_structure.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_transfer_swap_unit.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_ui_coverage.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_utils.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tests/test_workers.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tools/create_and_stake_service.py +0 -0
- {iwa-0.0.25 → iwa-0.0.27}/src/tools/verify_drain.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "iwa"
|
|
3
|
-
version = "0.0.
|
|
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.
|
|
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=
|
|
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=
|
|
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
|
-
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
-
|
|
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=
|
|
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=
|
|
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(
|
|
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=
|
|
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=
|
|
570
|
+
signer_address_or_tag=owner_address,
|
|
560
571
|
chain_name=self.chain_name,
|
|
561
572
|
tags=["olas_unstake_service"],
|
|
562
573
|
)
|
|
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
|
{iwa-0.0.25 → iwa-0.0.27}/src/iwa/plugins/olas/contracts/abis/service_registry_token_utility.json
RENAMED
|
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
|
|
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
|