iwa 0.0.28__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.28/src/iwa.egg-info → iwa-0.0.30}/PKG-INFO +1 -1
- {iwa-0.0.28 → iwa-0.0.30}/pyproject.toml +2 -2
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/services/transaction.py +26 -1
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/importer.py +17 -5
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/service_manager/lifecycle.py +8 -3
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tui/olas_view.py +22 -3
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/routers/olas/staking.py +34 -10
- {iwa-0.0.28 → iwa-0.0.30/src/iwa.egg-info}/PKG-INFO +1 -1
- {iwa-0.0.28 → iwa-0.0.30}/LICENSE +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/README.md +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/setup.cfg +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/__main__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/chain/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/chain/errors.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/chain/interface.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/chain/manager.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/chain/models.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/chain/rate_limiter.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/chainlist.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/cli.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/constants.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/contracts/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/contracts/abis/erc20.json +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/contracts/abis/multisend.json +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/contracts/abis/multisend_call_only.json +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/contracts/cache.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/contracts/contract.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/contracts/decoder.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/contracts/erc20.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/contracts/multisend.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/db.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/ipfs.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/keys.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/mnemonic.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/models.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/monitor.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/plugins.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/pricing.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/rpc_monitor.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/secrets.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/services/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/services/account.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/services/balance.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/services/plugin.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/services/safe.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/services/transfer/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/services/transfer/base.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/services/transfer/erc20.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/services/transfer/multisend.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/services/transfer/native.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/services/transfer/swap.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/tables.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/test.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/tests/test_wallet.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/types.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/ui.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/utils.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/core/wallet.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/gnosis/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/gnosis/cow/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/gnosis/cow/quotes.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/gnosis/cow/swap.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/gnosis/cow/types.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/gnosis/cow_utils.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/gnosis/plugin.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/gnosis/safe.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/gnosis/tests/test_cow.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/gnosis/tests/test_safe.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/constants.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/activity_checker.json +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/mech.json +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/mech_marketplace.json +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/mech_marketplace_v1.json +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/mech_new.json +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/service_manager.json +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/service_registry.json +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/service_registry_token_utility.json +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/staking.json +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/abis/staking_token.json +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/activity_checker.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/base.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/mech.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/mech_marketplace.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/mech_marketplace_v1.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/service.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/contracts/staking.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/events.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/mech_reference.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/models.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/plugin.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/scripts/test_full_mech_flow.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/scripts/test_simple_lifecycle.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/service_manager/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/service_manager/base.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/service_manager/drain.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/service_manager/mech.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/service_manager/staking.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/conftest.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_importer.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_importer_error_handling.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_mech_contracts.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_olas_contracts.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_olas_integration.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_olas_models.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_olas_view.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_olas_view_actions.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_olas_view_modals.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_plugin.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_plugin_full.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_lifecycle.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_manager.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_manager_errors.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_manager_flows.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_manager_mech.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_manager_rewards.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_manager_validation.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_service_staking.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_staking_integration.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tests/test_staking_validation.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/plugins/olas/tui/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tools/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tools/check_profile.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tools/list_contracts.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tools/release.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tools/reset_env.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tools/reset_tenderly.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tools/restore_backup.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tools/test_chainlist.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tools/wallet_check.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tui/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tui/app.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tui/modals/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tui/modals/base.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tui/rpc.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tui/screens/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tui/screens/wallets.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tui/tests/test_app.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tui/tests/test_rpc.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tui/tests/test_wallets_refactor.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tui/tests/test_widgets.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tui/widgets/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tui/widgets/base.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/tui/workers.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/dependencies.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/models.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/routers/accounts.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/routers/olas/__init__.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/routers/olas/admin.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/routers/olas/funding.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/routers/olas/general.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/routers/olas/services.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/routers/state.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/routers/swap.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/routers/transactions.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/server.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/static/app.js +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/static/index.html +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/static/style.css +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/tests/test_web_endpoints.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/tests/test_web_olas.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/tests/test_web_swap.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa/web/tests/test_web_swap_coverage.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa.egg-info/SOURCES.txt +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa.egg-info/dependency_links.txt +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa.egg-info/entry_points.txt +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa.egg-info/requires.txt +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/iwa.egg-info/top_level.txt +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/legacy_cow.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/legacy_safe.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/legacy_transaction_retry_logic.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/legacy_tui.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/legacy_wallets_screen.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/legacy_web.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_account_service.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_balance_service.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_chain.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_chain_interface.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_chain_interface_coverage.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_cli.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_contract.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_db.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_drain_coverage.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_erc20.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_gnosis_plugin.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_keys.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_legacy_wallet.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_main.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_migration.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_mnemonic.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_modals.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_models.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_monitor.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_multisend.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_plugin_service.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_pricing.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_rate_limiter.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_reset_tenderly.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_rpc_efficiency.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_rpc_rotation.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_rpc_view.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_safe_coverage.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_safe_service.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_service_manager_integration.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_service_manager_structure.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_service_transaction.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_staking_router.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_staking_simple.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_tables.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_transaction_service.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_transfer_multisend.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_transfer_native.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_transfer_security.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_transfer_structure.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_transfer_swap_unit.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_ui_coverage.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_utils.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tests/test_workers.py +0 -0
- {iwa-0.0.28 → iwa-0.0.30}/src/tools/create_and_stake_service.py +0 -0
- {iwa-0.0.28 → 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:
|
|
@@ -797,7 +797,10 @@ class OlasServiceImporter:
|
|
|
797
797
|
signers = []
|
|
798
798
|
for key in service.keys:
|
|
799
799
|
if key.role == "agent":
|
|
800
|
-
|
|
800
|
+
addr = key.address
|
|
801
|
+
if not addr.startswith("0x"):
|
|
802
|
+
addr = "0x" + addr
|
|
803
|
+
signers.append(addr)
|
|
801
804
|
return signers
|
|
802
805
|
|
|
803
806
|
def _get_owner_signers(self, service: DiscoveredService) -> List[str]:
|
|
@@ -806,7 +809,10 @@ class OlasServiceImporter:
|
|
|
806
809
|
for key in service.keys:
|
|
807
810
|
# We look for keys marked as owner/operator
|
|
808
811
|
if key.role in ["owner", "operator"]:
|
|
809
|
-
|
|
812
|
+
addr = key.address
|
|
813
|
+
if not addr.startswith("0x"):
|
|
814
|
+
addr = "0x" + addr
|
|
815
|
+
signers.append(addr)
|
|
810
816
|
return signers
|
|
811
817
|
|
|
812
818
|
def _import_discovered_service_config(
|
|
@@ -882,8 +888,10 @@ class OlasServiceImporter:
|
|
|
882
888
|
def _generate_tag(self, key: DiscoveredKey, service_name: Optional[str]) -> str:
|
|
883
889
|
"""Generate a unique tag for an imported key.
|
|
884
890
|
|
|
885
|
-
Tags follow the pattern: {service_name}_{role}
|
|
886
|
-
|
|
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)
|
|
887
895
|
"""
|
|
888
896
|
# Use service name as prefix, or 'imported' as fallback
|
|
889
897
|
prefix = service_name or "imported"
|
|
@@ -892,7 +900,11 @@ class OlasServiceImporter:
|
|
|
892
900
|
prefix = re.sub(r"[^a-z0-9]+", "_", prefix.lower()).strip("_")
|
|
893
901
|
role = re.sub(r"[^a-z0-9]+", "_", key.role.lower()).strip("_")
|
|
894
902
|
|
|
895
|
-
|
|
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}"
|
|
896
908
|
|
|
897
909
|
# Check if tag already exists
|
|
898
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.28 → 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
|