iwa 0.0.20__tar.gz → 0.0.21__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.20/src/iwa.egg-info → iwa-0.0.21}/PKG-INFO +1 -1
- {iwa-0.0.20 → iwa-0.0.21}/pyproject.toml +2 -2
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/chain/interface.py +8 -1
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/monitor.py +2 -2
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/safe.py +2 -2
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/safe.py +1 -1
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/tests/test_safe.py +1 -1
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/plugin.py +2 -2
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_plugin_full.py +3 -5
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/rpc.py +1 -1
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/screens/wallets.py +2 -2
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/tests/test_rpc.py +2 -2
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/widgets/base.py +1 -1
- {iwa-0.0.20 → iwa-0.0.21/src/iwa.egg-info}/PKG-INFO +1 -1
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_monitor.py +3 -3
- {iwa-0.0.20 → iwa-0.0.21}/LICENSE +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/README.md +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/setup.cfg +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/__main__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/chain/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/chain/errors.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/chain/manager.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/chain/models.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/chain/rate_limiter.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/chainlist.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/cli.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/constants.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/abis/erc20.json +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/abis/multisend.json +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/abis/multisend_call_only.json +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/cache.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/contract.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/erc20.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/contracts/multisend.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/db.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/ipfs.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/keys.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/mnemonic.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/models.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/plugins.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/pricing.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/rpc_monitor.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/secrets.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/account.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/balance.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/plugin.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/transaction.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/transfer/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/transfer/base.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/transfer/erc20.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/transfer/multisend.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/transfer/native.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/services/transfer/swap.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/tables.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/test.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/tests/test_wallet.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/types.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/ui.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/utils.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/core/wallet.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/cow/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/cow/quotes.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/cow/swap.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/cow/types.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/cow_utils.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/plugin.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/gnosis/tests/test_cow.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/constants.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/activity_checker.json +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/mech.json +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/mech_marketplace.json +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/mech_marketplace_v1.json +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/mech_new.json +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/service_manager.json +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/service_registry.json +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/service_registry_token_utility.json +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/staking.json +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/abis/staking_token.json +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/activity_checker.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/base.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/mech.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/mech_marketplace.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/mech_marketplace_v1.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/service.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/contracts/staking.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/events.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/importer.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/mech_reference.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/models.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/scripts/test_full_mech_flow.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/scripts/test_simple_lifecycle.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/service_manager/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/service_manager/base.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/service_manager/drain.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/service_manager/lifecycle.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/service_manager/mech.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/service_manager/staking.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/conftest.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_importer.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_importer_error_handling.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_mech_contracts.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_olas_contracts.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_olas_integration.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_olas_models.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_olas_view.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_olas_view_actions.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_olas_view_modals.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_plugin.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_lifecycle.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_manager.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_manager_errors.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_manager_flows.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_manager_mech.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_manager_rewards.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_manager_validation.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_service_staking.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_staking_integration.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tests/test_staking_validation.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tui/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/plugins/olas/tui/olas_view.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/check_profile.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/list_contracts.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/release.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/reset_env.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/reset_tenderly.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/restore_backup.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/test_chainlist.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tools/wallet_check.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/app.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/modals/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/modals/base.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/screens/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/tests/test_app.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/tests/test_wallets_refactor.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/tests/test_widgets.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/widgets/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/tui/workers.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/dependencies.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/models.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/accounts.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/olas/__init__.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/olas/admin.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/olas/funding.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/olas/general.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/olas/services.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/olas/staking.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/state.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/swap.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/routers/transactions.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/server.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/static/app.js +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/static/index.html +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/static/style.css +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/tests/test_web_endpoints.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/tests/test_web_olas.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/tests/test_web_swap.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa/web/tests/test_web_swap_coverage.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa.egg-info/SOURCES.txt +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa.egg-info/dependency_links.txt +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa.egg-info/entry_points.txt +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa.egg-info/requires.txt +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/iwa.egg-info/top_level.txt +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/legacy_cow.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/legacy_safe.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/legacy_transaction_retry_logic.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/legacy_tui.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/legacy_wallets_screen.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/legacy_web.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_account_service.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_balance_service.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_chain.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_chain_interface.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_chain_interface_coverage.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_cli.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_contract.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_db.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_drain_coverage.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_erc20.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_gnosis_plugin.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_keys.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_legacy_wallet.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_main.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_migration.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_mnemonic.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_modals.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_models.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_multisend.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_plugin_service.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_pricing.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_rate_limiter.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_reset_tenderly.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_rpc_efficiency.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_rpc_rotation.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_rpc_view.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_safe_coverage.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_safe_service.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_service_manager_integration.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_service_manager_structure.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_service_transaction.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_staking_router.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_staking_simple.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_tables.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_transaction_service.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_transfer_multisend.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_transfer_native.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_transfer_security.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_transfer_structure.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_transfer_swap_unit.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_ui_coverage.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_utils.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tests/test_workers.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/src/tools/create_and_stake_service.py +0 -0
- {iwa-0.0.20 → iwa-0.0.21}/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.21"
|
|
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.21"
|
|
75
75
|
fix = true
|
|
76
76
|
|
|
77
77
|
[tool.ruff.lint]
|
|
@@ -48,10 +48,17 @@ class ChainInterface:
|
|
|
48
48
|
self._rotation_lock = threading.Lock()
|
|
49
49
|
self._init_web3()
|
|
50
50
|
|
|
51
|
+
@property
|
|
52
|
+
def current_rpc(self) -> str:
|
|
53
|
+
"""Get the current active RPC URL."""
|
|
54
|
+
if not self.chain.rpcs:
|
|
55
|
+
return ""
|
|
56
|
+
return self.chain.rpcs[self._current_rpc_index]
|
|
57
|
+
|
|
51
58
|
@property
|
|
52
59
|
def is_tenderly(self) -> bool:
|
|
53
60
|
"""Check if connected to Tenderly vNet."""
|
|
54
|
-
rpc = self.
|
|
61
|
+
rpc = self.current_rpc or ""
|
|
55
62
|
return "tenderly" in rpc.lower() or "virtual" in rpc.lower()
|
|
56
63
|
|
|
57
64
|
def init_block_tracking(self):
|
|
@@ -24,7 +24,7 @@ class EventMonitor:
|
|
|
24
24
|
self.chain_interface = ChainInterfaces().get(chain_name)
|
|
25
25
|
self.web3 = self.chain_interface.web3
|
|
26
26
|
self.running = False
|
|
27
|
-
if self.chain_interface.
|
|
27
|
+
if self.chain_interface.current_rpc:
|
|
28
28
|
try:
|
|
29
29
|
self.last_checked_block = self.web3.eth.block_number
|
|
30
30
|
except Exception:
|
|
@@ -39,7 +39,7 @@ class EventMonitor:
|
|
|
39
39
|
f"Starting EventMonitor for {len(self.addresses)} addresses on {self.chain_interface.chain.name}"
|
|
40
40
|
)
|
|
41
41
|
|
|
42
|
-
if not self.chain_interface.
|
|
42
|
+
if not self.chain_interface.current_rpc:
|
|
43
43
|
logger.error(
|
|
44
44
|
f"Cannot start EventMonitor: No RPC URL found for chain {self.chain_interface.chain.name}"
|
|
45
45
|
)
|
|
@@ -102,7 +102,7 @@ class SafeService:
|
|
|
102
102
|
|
|
103
103
|
# Use ChainInterface which has proper RPC rotation and parsing
|
|
104
104
|
chain_interface = ChainInterfaces().get(chain_name)
|
|
105
|
-
return EthereumClient(chain_interface.
|
|
105
|
+
return EthereumClient(chain_interface.current_rpc)
|
|
106
106
|
|
|
107
107
|
def _deploy_safe_contract(
|
|
108
108
|
self,
|
|
@@ -254,7 +254,7 @@ class SafeService:
|
|
|
254
254
|
|
|
255
255
|
# Use ChainInterface which has proper RPC rotation and parsing
|
|
256
256
|
chain_interface = ChainInterfaces().get(chain)
|
|
257
|
-
ethereum_client = EthereumClient(chain_interface.
|
|
257
|
+
ethereum_client = EthereumClient(chain_interface.current_rpc)
|
|
258
258
|
|
|
259
259
|
code = ethereum_client.w3.eth.get_code(account.address)
|
|
260
260
|
|
|
@@ -30,7 +30,7 @@ class SafeMultisig:
|
|
|
30
30
|
from iwa.core.chain import ChainInterfaces
|
|
31
31
|
|
|
32
32
|
chain_interface = ChainInterfaces().get(chain_name.lower())
|
|
33
|
-
ethereum_client = EthereumClient(chain_interface.
|
|
33
|
+
ethereum_client = EthereumClient(chain_interface.current_rpc)
|
|
34
34
|
self.multisig = Safe(safe_account.address, ethereum_client)
|
|
35
35
|
self.ethereum_client = ethereum_client
|
|
36
36
|
|
|
@@ -42,7 +42,7 @@ def test_init(safe_account, mock_settings, mock_safe_eth):
|
|
|
42
42
|
"""Test initialization."""
|
|
43
43
|
with patch("iwa.core.chain.ChainInterfaces") as mock_ci_cls:
|
|
44
44
|
mock_ci = mock_ci_cls.return_value
|
|
45
|
-
mock_ci.get.return_value.
|
|
45
|
+
mock_ci.get.return_value.current_rpc = "http://rpc"
|
|
46
46
|
ms = SafeMultisig(safe_account, "gnosis")
|
|
47
47
|
assert ms.multisig is not None
|
|
48
48
|
mock_safe_eth[0].assert_called_with("http://rpc") # EthereumClient init
|
|
@@ -73,12 +73,12 @@ class OlasPlugin(Plugin):
|
|
|
73
73
|
|
|
74
74
|
try:
|
|
75
75
|
chain_interface = ChainInterfaces().get(chain_name)
|
|
76
|
-
if not chain_interface.
|
|
76
|
+
if not chain_interface.current_rpc:
|
|
77
77
|
return None, None
|
|
78
78
|
except ValueError:
|
|
79
79
|
return None, None # Chain not supported/configured
|
|
80
80
|
|
|
81
|
-
ethereum_client = EthereumClient(chain_interface.
|
|
81
|
+
ethereum_client = EthereumClient(chain_interface.current_rpc)
|
|
82
82
|
safe = Safe(safe_address, ethereum_client)
|
|
83
83
|
owners = safe.retrieve_owners()
|
|
84
84
|
return owners, True
|
|
@@ -105,7 +105,7 @@ def test_get_safe_signers_edge_cases(plugin):
|
|
|
105
105
|
# 1. No RPC configured
|
|
106
106
|
with patch("iwa.core.chain.ChainInterfaces") as mock_ci_cls:
|
|
107
107
|
mock_ci = mock_ci_cls.return_value
|
|
108
|
-
mock_ci.get.return_value.
|
|
108
|
+
mock_ci.get.return_value.current_rpc = ""
|
|
109
109
|
signers, exists = plugin._get_safe_signers("0x1", "gnosis")
|
|
110
110
|
assert signers is None
|
|
111
111
|
assert exists is None
|
|
@@ -113,8 +113,7 @@ def test_get_safe_signers_edge_cases(plugin):
|
|
|
113
113
|
# 2. Safe doesn't exist (raises exception)
|
|
114
114
|
with patch("iwa.core.chain.ChainInterfaces") as mock_ci_cls:
|
|
115
115
|
mock_ci = mock_ci_cls.return_value
|
|
116
|
-
mock_ci.get.return_value.
|
|
117
|
-
mock_ci.get.return_value.chain.rpc = "http://rpc"
|
|
116
|
+
mock_ci.get.return_value.current_rpc = "http://rpc"
|
|
118
117
|
with patch("safe_eth.eth.EthereumClient"), patch("safe_eth.safe.Safe") as mock_safe_cls:
|
|
119
118
|
mock_safe = mock_safe_cls.return_value
|
|
120
119
|
mock_safe.retrieve_owners.side_effect = Exception("Generic error")
|
|
@@ -126,8 +125,7 @@ def test_get_safe_signers_edge_cases(plugin):
|
|
|
126
125
|
# 3. Success path
|
|
127
126
|
with patch("iwa.core.chain.ChainInterfaces") as mock_ci_cls:
|
|
128
127
|
mock_ci = mock_ci_cls.return_value
|
|
129
|
-
mock_ci.get.return_value.
|
|
130
|
-
mock_ci.get.return_value.chain.rpc = "http://rpc"
|
|
128
|
+
mock_ci.get.return_value.current_rpc = "http://rpc"
|
|
131
129
|
with patch("safe_eth.eth.EthereumClient"), patch("safe_eth.safe.Safe") as mock_safe_cls:
|
|
132
130
|
mock_safe = mock_safe_cls.return_value
|
|
133
131
|
mock_safe.retrieve_owners.return_value = ["0xAgent"]
|
|
@@ -381,7 +381,7 @@ class WalletsScreen(VerticalScroll):
|
|
|
381
381
|
self.stop_monitor()
|
|
382
382
|
addresses = [acc.address for acc in self.wallet.key_storage.accounts.values()]
|
|
383
383
|
for chain_name, interface in ChainInterfaces().items():
|
|
384
|
-
if interface.
|
|
384
|
+
if interface.current_rpc:
|
|
385
385
|
monitor = EventMonitor(addresses, self.monitor_callback, chain_name)
|
|
386
386
|
|
|
387
387
|
# Worker wrapper
|
|
@@ -497,7 +497,7 @@ class WalletsScreen(VerticalScroll):
|
|
|
497
497
|
"""Handle blockchain selection changes."""
|
|
498
498
|
if event.value and event.value != self.active_chain:
|
|
499
499
|
interface = ChainInterfaces().get(event.value)
|
|
500
|
-
if not interface or not interface.
|
|
500
|
+
if not interface or not interface.current_rpc:
|
|
501
501
|
self.notify(f"No RPC for {event.value}", severity="warning")
|
|
502
502
|
event.control.value = self.active_chain
|
|
503
503
|
return
|
|
@@ -71,7 +71,7 @@ def test_check_rpcs_success(rpc_view, mock_chain_interfaces):
|
|
|
71
71
|
"""Test check_rpcs with successful connections."""
|
|
72
72
|
# Setup mock chain interfaces
|
|
73
73
|
mock_gnosis = MagicMock()
|
|
74
|
-
mock_gnosis.
|
|
74
|
+
mock_gnosis.current_rpc = "http://gnosis"
|
|
75
75
|
mock_gnosis.web3.is_connected.return_value = True
|
|
76
76
|
|
|
77
77
|
mock_chain_interfaces.get.side_effect = lambda name: mock_gnosis if name == "gnosis" else None
|
|
@@ -99,7 +99,7 @@ def test_check_rpcs_success(rpc_view, mock_chain_interfaces):
|
|
|
99
99
|
def test_check_rpcs_error(rpc_view, mock_chain_interfaces):
|
|
100
100
|
"""Test check_rpcs with connection error."""
|
|
101
101
|
mock_eth = MagicMock()
|
|
102
|
-
mock_eth.
|
|
102
|
+
mock_eth.current_rpc = "http://eth"
|
|
103
103
|
mock_eth.web3.is_connected.side_effect = Exception("Connection fail")
|
|
104
104
|
|
|
105
105
|
mock_chain_interfaces.get.side_effect = lambda name: mock_eth if name == "ethereum" else None
|
|
@@ -12,7 +12,7 @@ def mock_chain_interfaces():
|
|
|
12
12
|
instance = mock.return_value
|
|
13
13
|
gnosis_interface = MagicMock()
|
|
14
14
|
gnosis_interface.chain.name = "Gnosis"
|
|
15
|
-
gnosis_interface.
|
|
15
|
+
gnosis_interface.current_rpc = "https://rpc"
|
|
16
16
|
gnosis_interface.web3 = MagicMock()
|
|
17
17
|
instance.get.return_value = gnosis_interface
|
|
18
18
|
yield instance
|
|
@@ -46,7 +46,7 @@ def test_monitor_init_rpc_fail(mock_chain_interfaces, mock_callback):
|
|
|
46
46
|
|
|
47
47
|
def test_monitor_init_no_rpc(mock_chain_interfaces, mock_callback):
|
|
48
48
|
chain_interface = mock_chain_interfaces.get.return_value
|
|
49
|
-
chain_interface.
|
|
49
|
+
chain_interface.current_rpc = ""
|
|
50
50
|
|
|
51
51
|
monitor = EventMonitor(["0x1234567890123456789012345678901234567890"], mock_callback)
|
|
52
52
|
assert monitor.last_checked_block == 0
|
|
@@ -54,7 +54,7 @@ def test_monitor_init_no_rpc(mock_chain_interfaces, mock_callback):
|
|
|
54
54
|
|
|
55
55
|
def test_start_no_rpc(mock_chain_interfaces, mock_callback):
|
|
56
56
|
chain_interface = mock_chain_interfaces.get.return_value
|
|
57
|
-
chain_interface.
|
|
57
|
+
chain_interface.current_rpc = ""
|
|
58
58
|
|
|
59
59
|
monitor = EventMonitor(["0x1234567890123456789012345678901234567890"], mock_callback)
|
|
60
60
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.20 → iwa-0.0.21}/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
|