iwa 0.0.29__tar.gz → 0.0.30__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.30}/PKG-INFO +1 -1
- {iwa-0.0.29 → iwa-0.0.30}/pyproject.toml +2 -2
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/services/transaction.py +26 -1
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/importer.py +9 -3
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/service_manager/lifecycle.py +8 -3
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tui/olas_view.py +22 -3
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/routers/olas/staking.py +34 -10
- {iwa-0.0.29 → iwa-0.0.30/src/iwa.egg-info}/PKG-INFO +1 -1
- {iwa-0.0.29 → iwa-0.0.30}/LICENSE +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/README.md +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/setup.cfg +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/__main__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/chain/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/chain/errors.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/chain/interface.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/chain/manager.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/chain/models.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/chain/rate_limiter.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/chainlist.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/cli.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/constants.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/contracts/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/contracts/abis/erc20.json +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/contracts/abis/multisend.json +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/contracts/abis/multisend_call_only.json +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/contracts/cache.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/contracts/contract.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/contracts/decoder.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/contracts/erc20.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/contracts/multisend.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/db.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/ipfs.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/keys.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/mnemonic.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/models.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/monitor.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/plugins.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/pricing.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/rpc_monitor.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/secrets.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/services/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/services/account.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/services/balance.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/services/plugin.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/services/safe.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/services/transfer/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/services/transfer/base.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/services/transfer/erc20.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/services/transfer/multisend.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/services/transfer/native.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/services/transfer/swap.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/tables.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/test.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/tests/test_wallet.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/types.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/ui.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/utils.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/core/wallet.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/gnosis/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/gnosis/cow/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/gnosis/cow/quotes.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/gnosis/cow/swap.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/gnosis/cow/types.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/gnosis/cow_utils.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/gnosis/plugin.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/gnosis/safe.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/gnosis/tests/test_cow.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/gnosis/tests/test_safe.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/constants.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/activity_checker.json +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/mech.json +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/mech_marketplace.json +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/mech_marketplace_v1.json +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/mech_new.json +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/service_manager.json +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/service_registry.json +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/service_registry_token_utility.json +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/staking.json +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/staking_token.json +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/activity_checker.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/base.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/mech.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/mech_marketplace.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/mech_marketplace_v1.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/service.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/staking.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/events.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/mech_reference.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/models.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/plugin.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/scripts/test_full_mech_flow.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/scripts/test_simple_lifecycle.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/service_manager/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/service_manager/base.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/service_manager/drain.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/service_manager/mech.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/service_manager/staking.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/conftest.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_importer.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_importer_error_handling.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_mech_contracts.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_olas_contracts.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_olas_integration.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_olas_models.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_olas_view.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_olas_view_actions.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_olas_view_modals.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_plugin.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_plugin_full.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_lifecycle.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_manager.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_manager_errors.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_manager_flows.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_manager_mech.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_manager_rewards.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_manager_validation.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_staking.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_staking_integration.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_staking_validation.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/plugins/olas/tui/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tools/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tools/check_profile.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tools/list_contracts.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tools/release.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tools/reset_env.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tools/reset_tenderly.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tools/restore_backup.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tools/test_chainlist.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tools/wallet_check.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tui/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tui/app.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tui/modals/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tui/modals/base.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tui/rpc.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tui/screens/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tui/screens/wallets.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tui/tests/test_app.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tui/tests/test_rpc.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tui/tests/test_wallets_refactor.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tui/tests/test_widgets.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tui/widgets/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tui/widgets/base.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/tui/workers.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/dependencies.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/models.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/routers/accounts.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/routers/olas/__init__.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/routers/olas/admin.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/routers/olas/funding.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/routers/olas/general.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/routers/olas/services.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/routers/state.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/routers/swap.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/routers/transactions.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/server.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/static/app.js +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/static/index.html +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/static/style.css +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/tests/test_web_endpoints.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/tests/test_web_olas.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/tests/test_web_swap.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa/web/tests/test_web_swap_coverage.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa.egg-info/SOURCES.txt +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa.egg-info/dependency_links.txt +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa.egg-info/entry_points.txt +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa.egg-info/requires.txt +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/iwa.egg-info/top_level.txt +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/legacy_cow.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/legacy_safe.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/legacy_transaction_retry_logic.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/legacy_tui.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/legacy_wallets_screen.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/legacy_web.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_account_service.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_balance_service.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_chain.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_chain_interface.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_chain_interface_coverage.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_cli.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_contract.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_db.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_drain_coverage.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_erc20.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_gnosis_plugin.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_keys.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_legacy_wallet.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_main.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_migration.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_mnemonic.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_modals.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_models.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_monitor.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_multisend.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_plugin_service.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_pricing.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_rate_limiter.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_reset_tenderly.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_rpc_efficiency.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_rpc_rotation.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_rpc_view.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_safe_coverage.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_safe_service.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_service_manager_integration.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_service_manager_structure.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_service_transaction.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_staking_router.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_staking_simple.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_tables.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_transaction_service.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_transfer_multisend.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_transfer_native.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_transfer_security.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_transfer_structure.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_transfer_swap_unit.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_ui_coverage.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_utils.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tests/test_workers.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/src/tools/create_and_stake_service.py +0 -0
- {iwa-0.0.29 → iwa-0.0.30}/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.30"
|
|
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.30"
|
|
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 = {
|
|
@@ -1133,8 +1133,13 @@ class LifecycleManagerMixin:
|
|
|
1133
1133
|
|
|
1134
1134
|
def _process_wind_down_state(self, current_state: ServiceState) -> bool:
|
|
1135
1135
|
"""Process a single state transition for wind down."""
|
|
1136
|
-
|
|
1137
|
-
|
|
1136
|
+
# Allow termination from any active state > PRE_REGISTRATION
|
|
1137
|
+
if current_state in [
|
|
1138
|
+
ServiceState.DEPLOYED,
|
|
1139
|
+
ServiceState.ACTIVE_REGISTRATION,
|
|
1140
|
+
ServiceState.FINISHED_REGISTRATION,
|
|
1141
|
+
]:
|
|
1142
|
+
logger.info(f"Terminating service from state {current_state.name}...")
|
|
1138
1143
|
if not self.terminate():
|
|
1139
1144
|
logger.error("Failed to terminate service")
|
|
1140
1145
|
return False
|
|
@@ -1146,7 +1151,7 @@ class LifecycleManagerMixin:
|
|
|
1146
1151
|
else:
|
|
1147
1152
|
# Should not happen if logic is correct map of transitions
|
|
1148
1153
|
logger.error(
|
|
1149
|
-
f"State {current_state.name} is not a valid start for wind_down (expected
|
|
1154
|
+
f"State {current_state.name} is not a valid start for wind_down (expected active state or TERMINATED_BONDED)"
|
|
1150
1155
|
)
|
|
1151
1156
|
return False
|
|
1152
1157
|
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.30}/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
|