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.
- {iwa-0.0.29/src/iwa.egg-info → iwa-0.0.31}/PKG-INFO +1 -1
- {iwa-0.0.29 → iwa-0.0.31}/pyproject.toml +2 -2
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/transaction.py +26 -1
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/importer.py +9 -3
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/service_manager/lifecycle.py +16 -5
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tui/olas_view.py +22 -3
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/olas/staking.py +34 -10
- {iwa-0.0.29 → iwa-0.0.31/src/iwa.egg-info}/PKG-INFO +1 -1
- {iwa-0.0.29 → iwa-0.0.31}/LICENSE +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/README.md +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/setup.cfg +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/__main__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/chain/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/chain/errors.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/chain/interface.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/chain/manager.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/chain/models.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/chain/rate_limiter.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/chainlist.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/cli.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/constants.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/abis/erc20.json +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/abis/multisend.json +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/abis/multisend_call_only.json +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/cache.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/contract.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/decoder.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/erc20.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/contracts/multisend.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/db.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/ipfs.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/keys.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/mnemonic.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/models.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/monitor.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/plugins.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/pricing.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/rpc_monitor.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/secrets.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/account.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/balance.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/plugin.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/safe.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/transfer/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/transfer/base.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/transfer/erc20.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/transfer/multisend.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/transfer/native.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/services/transfer/swap.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/tables.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/test.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/tests/test_wallet.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/types.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/ui.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/utils.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/core/wallet.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/cow/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/cow/quotes.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/cow/swap.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/cow/types.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/cow_utils.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/plugin.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/safe.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/tests/test_cow.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/gnosis/tests/test_safe.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/constants.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/activity_checker.json +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/mech.json +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/mech_marketplace.json +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/mech_marketplace_v1.json +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/mech_new.json +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/service_manager.json +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/service_registry.json +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/service_registry_token_utility.json +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/staking.json +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/abis/staking_token.json +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/activity_checker.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/base.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/mech.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/mech_marketplace.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/mech_marketplace_v1.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/service.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/contracts/staking.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/events.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/mech_reference.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/models.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/plugin.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/scripts/test_full_mech_flow.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/scripts/test_simple_lifecycle.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/service_manager/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/service_manager/base.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/service_manager/drain.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/service_manager/mech.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/service_manager/staking.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/conftest.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_importer.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_importer_error_handling.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_mech_contracts.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_olas_contracts.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_olas_integration.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_olas_models.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_olas_view.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_olas_view_actions.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_olas_view_modals.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_plugin.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_plugin_full.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_lifecycle.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_manager.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_manager_errors.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_manager_flows.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_manager_mech.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_manager_rewards.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_manager_validation.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_service_staking.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_staking_integration.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tests/test_staking_validation.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/plugins/olas/tui/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/check_profile.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/list_contracts.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/release.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/reset_env.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/reset_tenderly.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/restore_backup.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/test_chainlist.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tools/wallet_check.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/app.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/modals/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/modals/base.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/rpc.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/screens/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/screens/wallets.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/tests/test_app.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/tests/test_rpc.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/tests/test_wallets_refactor.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/tests/test_widgets.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/widgets/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/widgets/base.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/tui/workers.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/dependencies.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/models.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/accounts.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/olas/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/olas/admin.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/olas/funding.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/olas/general.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/olas/services.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/state.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/swap.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/routers/transactions.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/server.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/static/app.js +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/static/index.html +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/static/style.css +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/tests/test_web_endpoints.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/tests/test_web_olas.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/tests/test_web_swap.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa/web/tests/test_web_swap_coverage.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa.egg-info/SOURCES.txt +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa.egg-info/dependency_links.txt +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa.egg-info/entry_points.txt +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa.egg-info/requires.txt +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/iwa.egg-info/top_level.txt +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/legacy_cow.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/legacy_safe.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/legacy_transaction_retry_logic.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/legacy_tui.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/legacy_wallets_screen.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/legacy_web.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_account_service.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_balance_service.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_chain.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_chain_interface.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_chain_interface_coverage.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_cli.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_contract.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_db.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_drain_coverage.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_erc20.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_gnosis_plugin.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_keys.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_legacy_wallet.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_main.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_migration.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_mnemonic.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_modals.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_models.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_monitor.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_multisend.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_plugin_service.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_pricing.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_rate_limiter.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_reset_tenderly.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_rpc_efficiency.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_rpc_rotation.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_rpc_view.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_safe_coverage.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_safe_service.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_service_manager_integration.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_service_manager_structure.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_service_transaction.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_staking_router.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_staking_simple.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_tables.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_transaction_service.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_transfer_multisend.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_transfer_native.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_transfer_security.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_transfer_structure.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_transfer_swap_unit.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_ui_coverage.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_utils.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tests/test_workers.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/src/tools/create_and_stake_service.py +0 -0
- {iwa-0.0.29 → iwa-0.0.31}/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.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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
881
|
-
|
|
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
|
-
|
|
1137
|
-
|
|
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
|
|
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
|
-
|
|
518
|
-
|
|
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
|
|
93
|
+
# Get token and deposit from TokenUtility contract (persists after terminate)
|
|
87
94
|
try:
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
|
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}")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.29 → iwa-0.0.31}/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
|